mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-07-15 22:09:40 +08:00
Adding LayoutPart summary shape.
This commit is contained in:
parent
a91d06a4b9
commit
fbac586231
@ -1,6 +1,7 @@
|
||||
using Orchard.Layouts.Elements;
|
||||
using Orchard.Layouts.Framework.Drivers;
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
using Orchard.Layouts.Services;
|
||||
using Orchard.Layouts.ViewModels;
|
||||
|
||||
namespace Orchard.Layouts.Drivers {
|
||||
@ -25,5 +26,9 @@ namespace Orchard.Layouts.Drivers {
|
||||
.Add("body", element.Content).RemoveTags().Analyze()
|
||||
.Add("format", "html").Store();
|
||||
}
|
||||
|
||||
protected override void OnBuildDocument(Html element, BuildElementDocumentContext context) {
|
||||
context.HtmlContent = element.Content;
|
||||
}
|
||||
}
|
||||
}
|
@ -6,6 +6,7 @@ using Orchard.ContentManagement.Handlers;
|
||||
using Orchard.Layouts.Framework.Display;
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
using Orchard.Layouts.Framework.Serialization;
|
||||
using Orchard.Layouts.Helpers;
|
||||
using Orchard.Layouts.Models;
|
||||
using Orchard.Layouts.Services;
|
||||
using Orchard.Layouts.ViewModels;
|
||||
@ -15,20 +16,31 @@ namespace Orchard.Layouts.Drivers {
|
||||
private readonly ILayoutSerializer _serializer;
|
||||
private readonly IElementDisplay _elementDisplay;
|
||||
private readonly IElementManager _elementManager;
|
||||
private readonly ILayoutManager _layoutManager;
|
||||
|
||||
public LayoutPartDriver(
|
||||
ILayoutSerializer serializer,
|
||||
IElementDisplay elementDisplay,
|
||||
IElementManager elementManager,
|
||||
ILayoutManager layoutManager) {
|
||||
|
||||
public LayoutPartDriver(ILayoutSerializer serializer, IElementDisplay elementDisplay, IElementManager elementManager) {
|
||||
_serializer = serializer;
|
||||
_elementDisplay = elementDisplay;
|
||||
_elementManager = elementManager;
|
||||
_layoutManager = layoutManager;
|
||||
}
|
||||
|
||||
protected override DriverResult Display(LayoutPart part, string displayType, dynamic shapeHelper) {
|
||||
return ContentShape("Parts_Layout", () => {
|
||||
var describeContext = new DescribeElementsContext { Content = part };
|
||||
var instances = _serializer.Deserialize(part.LayoutState, describeContext);
|
||||
var layoutRoot = _elementDisplay.DisplayElements(instances, part, displayType: displayType);
|
||||
return shapeHelper.Parts_Layout(LayoutRoot: layoutRoot);
|
||||
});
|
||||
return Combined(
|
||||
ContentShape("Parts_Layout", () => {
|
||||
var elements = _layoutManager.LoadElements(part);
|
||||
var layoutRoot = _elementDisplay.DisplayElements(elements, part, displayType: displayType);
|
||||
return shapeHelper.Parts_Layout(LayoutRoot: layoutRoot);
|
||||
}),
|
||||
ContentShape("Parts_Layout_Summary", () => {
|
||||
var document = _layoutManager.BuildDocument(part);
|
||||
return shapeHelper.Parts_Layout_Summary(Document: document);
|
||||
}));
|
||||
}
|
||||
|
||||
protected override DriverResult Editor(LayoutPart part, dynamic shapeHelper) {
|
||||
|
@ -2,6 +2,7 @@
|
||||
using Orchard.Layouts.Framework.Display;
|
||||
using Orchard.Layouts.Framework.Drivers;
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
using Orchard.Layouts.Services;
|
||||
using Orchard.Layouts.ViewModels;
|
||||
using MarkdownElement = Orchard.Layouts.Elements.Markdown;
|
||||
|
||||
@ -24,7 +25,7 @@ namespace Orchard.Layouts.Drivers {
|
||||
}
|
||||
|
||||
protected override void OnDisplaying(MarkdownElement element, ElementDisplayContext context) {
|
||||
context.ElementShape.ProcessedContent = new MarkdownSharp.Markdown().Transform(element.Content);
|
||||
context.ElementShape.ProcessedContent = ToHtml(element.Content);
|
||||
}
|
||||
|
||||
protected override void OnIndexing(MarkdownElement element, ElementIndexingContext context) {
|
||||
@ -32,5 +33,13 @@ namespace Orchard.Layouts.Drivers {
|
||||
.Add("body", element.Content).RemoveTags().Analyze()
|
||||
.Add("format", "markdown").Store();
|
||||
}
|
||||
|
||||
protected override void OnBuildDocument(MarkdownElement element, BuildElementDocumentContext context) {
|
||||
context.HtmlContent = ToHtml(element.Content);
|
||||
}
|
||||
|
||||
private string ToHtml(string markdown) {
|
||||
return new MarkdownSharp.Markdown().Transform(markdown);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
using Orchard.Layouts.Elements;
|
||||
using Orchard.Layouts.Framework.Drivers;
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
using Orchard.Layouts.Services;
|
||||
using Orchard.Layouts.ViewModels;
|
||||
|
||||
namespace Orchard.Layouts.Drivers {
|
||||
@ -25,5 +26,9 @@ namespace Orchard.Layouts.Drivers {
|
||||
.Add("body", element.Content).RemoveTags().Analyze()
|
||||
.Add("format", "text").Store();
|
||||
}
|
||||
|
||||
protected override void OnBuildDocument(Paragraph element, BuildElementDocumentContext context) {
|
||||
context.HtmlContent = element.Content;
|
||||
}
|
||||
}
|
||||
}
|
@ -6,6 +6,7 @@ using Orchard.Layouts.Framework.Display;
|
||||
using Orchard.Layouts.Framework.Drivers;
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
using Orchard.Layouts.Models;
|
||||
using Orchard.Layouts.Services;
|
||||
using Orchard.Layouts.Settings;
|
||||
using Orchard.Layouts.ViewModels;
|
||||
using Orchard.Services;
|
||||
@ -40,7 +41,7 @@ namespace Orchard.Layouts.Drivers {
|
||||
var text = element.Content;
|
||||
var layoutPart = context.Content.As<LayoutPart>();
|
||||
var flavor = GetFlavor(layoutPart);
|
||||
var processedText = _htmlFilters.Aggregate(text, (t, filter) => filter.ProcessContent(t, flavor));
|
||||
var processedText = ToHtml(text, flavor);
|
||||
|
||||
context.ElementShape.ProcessedText = processedText;
|
||||
}
|
||||
@ -54,6 +55,17 @@ namespace Orchard.Layouts.Drivers {
|
||||
.Add("format", flavor).Store();
|
||||
}
|
||||
|
||||
protected override void OnBuildDocument(Text element, BuildElementDocumentContext context) {
|
||||
var layoutPart = context.Layout.As<LayoutPart>();
|
||||
var flavor = GetFlavor(layoutPart);
|
||||
|
||||
context.HtmlContent = ToHtml(element.Content, flavor);
|
||||
}
|
||||
|
||||
private string ToHtml(string content, string flavor) {
|
||||
return _htmlFilters.Aggregate(content, (t, filter) => filter.ProcessContent(t, flavor));
|
||||
}
|
||||
|
||||
private static string GetFlavor(LayoutPart part) {
|
||||
return part != null ? part.GetFlavor() : LayoutPartSettings.FlavorDefaultDefault; // TODO: make this configurable.
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ using System;
|
||||
using System.Linq;
|
||||
using Orchard.Layouts.Framework.Display;
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
using Orchard.Layouts.Services;
|
||||
|
||||
namespace Orchard.Layouts.Framework.Drivers {
|
||||
public abstract class ElementDriver<TElement> : Component, IElementDriver where TElement: IElement {
|
||||
@ -33,6 +34,10 @@ namespace Orchard.Layouts.Framework.Drivers {
|
||||
OnIndexing((TElement)context.Element, context);
|
||||
}
|
||||
|
||||
public void BuildDocument(BuildElementDocumentContext context) {
|
||||
OnBuildDocument((TElement)context.Element, context);
|
||||
}
|
||||
|
||||
protected virtual EditorResult OnBuildEditor(TElement element, ElementEditorContext context) {
|
||||
return null;
|
||||
}
|
||||
@ -53,6 +58,9 @@ namespace Orchard.Layouts.Framework.Drivers {
|
||||
protected virtual void OnIndexing(TElement element, ElementIndexingContext context) {
|
||||
}
|
||||
|
||||
protected virtual void OnBuildDocument(TElement element, BuildElementDocumentContext context) {
|
||||
}
|
||||
|
||||
protected EditorResult Editor(ElementEditorContext context, params dynamic[] editorShapes) {
|
||||
foreach (var editorShape in editorShapes) {
|
||||
if (String.IsNullOrWhiteSpace(editorShape.Metadata.Position)) {
|
||||
|
@ -1,5 +1,6 @@
|
||||
using Orchard.Layouts.Framework.Display;
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
using Orchard.Layouts.Services;
|
||||
|
||||
namespace Orchard.Layouts.Framework.Drivers {
|
||||
public interface IElementDriver : IDependency {
|
||||
@ -10,5 +11,6 @@ namespace Orchard.Layouts.Framework.Drivers {
|
||||
void LayoutSaving(ElementSavingContext context);
|
||||
void Removing(ElementRemovingContext context);
|
||||
void Indexing(ElementIndexingContext context);
|
||||
void BuildDocument(BuildElementDocumentContext context);
|
||||
}
|
||||
}
|
@ -231,13 +231,16 @@
|
||||
<Compile Include="Helpers\EditorResultExtensions.cs" />
|
||||
<Compile Include="Helpers\PrefixHelper.cs" />
|
||||
<Compile Include="Providers\BlueprintElementHarvester.cs" />
|
||||
<Compile Include="Services\BuildElementDocumentContext.cs" />
|
||||
<Compile Include="Services\CurrentControllerAccessor.cs" />
|
||||
<Compile Include="Services\ElementCreatedContext.cs" />
|
||||
<Compile Include="Services\ElementCreatingContext.cs" />
|
||||
<Compile Include="Services\ElementDocument.cs" />
|
||||
<Compile Include="Services\ElementEventContext.cs" />
|
||||
<Compile Include="Services\ElementEventHandlerBase.cs" />
|
||||
<Compile Include="Services\ICurrentControllerAccessor.cs" />
|
||||
<Compile Include="Services\IElementEventHandler.cs" />
|
||||
<Compile Include="Services\LayoutDocument.cs" />
|
||||
<Compile Include="Signals.cs" />
|
||||
<Compile Include="ViewModels\ElementBlueprintPropertiesViewModel.cs" />
|
||||
<Compile Include="ViewModels\CreateElementBlueprintViewModel.cs" />
|
||||
@ -379,6 +382,9 @@
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Element-Media-VectorImage.Design.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Parts.Layout.Summary.cshtml" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
|
@ -8,6 +8,10 @@
|
||||
<Place Parts_ElementWrapper="Content:3" />
|
||||
</Match>
|
||||
|
||||
<Match DisplayType="Summary">
|
||||
<Place Parts_Layout_Summary="Content:5"/>
|
||||
</Match>
|
||||
|
||||
<Match DisplayType="Layout">
|
||||
<Place Parts_Common_Body="Content:0"
|
||||
Parts_Common_Body_Summary="-"
|
||||
|
@ -0,0 +1,10 @@
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
using Orchard.Layouts.Models;
|
||||
|
||||
namespace Orchard.Layouts.Services {
|
||||
public class BuildElementDocumentContext {
|
||||
public IElement Element { get; set; }
|
||||
public string HtmlContent { get; set; }
|
||||
public ILayoutAspect Layout { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
|
||||
namespace Orchard.Layouts.Services {
|
||||
/// <summary>
|
||||
/// Represents a layout document node.
|
||||
/// </summary>
|
||||
public class ElementDocument {
|
||||
public IElement Element { get; set; }
|
||||
public string Content { get; set; }
|
||||
}
|
||||
}
|
@ -6,6 +6,7 @@ using Orchard.Layouts.Framework.Drivers;
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
using Orchard.Layouts.Framework.Harvesters;
|
||||
using Orchard.Layouts.Helpers;
|
||||
using Orchard.Layouts.Models;
|
||||
|
||||
namespace Orchard.Layouts.Services {
|
||||
public class ElementManager : Component, IElementManager {
|
||||
@ -21,9 +22,9 @@ namespace Orchard.Layouts.Services {
|
||||
Lazy<IEnumerable<IElementHarvester>> elementHarvesters,
|
||||
ICacheManager cacheManager,
|
||||
Lazy<IEnumerable<IElementDriver>> drivers,
|
||||
Lazy<IEnumerable<ICategoryProvider>> categoryProviders,
|
||||
IElementFactory factory,
|
||||
ISignals signals,
|
||||
Lazy<IEnumerable<ICategoryProvider>> categoryProviders,
|
||||
IElementFactory factory,
|
||||
ISignals signals,
|
||||
IElementEventHandler elementEventHandler) {
|
||||
|
||||
_elementHarvesters = elementHarvesters;
|
||||
@ -151,12 +152,32 @@ namespace Orchard.Layouts.Services {
|
||||
}
|
||||
|
||||
public void Indexing(LayoutIndexingContext context) {
|
||||
var elementInstances = context.Elements.Flatten();
|
||||
var elementInstances = context.Elements.Flatten();
|
||||
InvokeDriver(elementInstances, (driver, elementInstance) => driver.Indexing(new ElementIndexingContext(context) {
|
||||
Element = elementInstance
|
||||
}));
|
||||
}
|
||||
|
||||
public LayoutDocument BuildDocument(ILayoutAspect layout, IEnumerable<IElement> elements) {
|
||||
var document = new LayoutDocument();
|
||||
|
||||
InvokeDriver(elements, (driver, element) => {
|
||||
var context = new BuildElementDocumentContext {
|
||||
Layout = layout,
|
||||
Element = element
|
||||
};
|
||||
driver.BuildDocument(context);
|
||||
|
||||
if (!String.IsNullOrWhiteSpace(context.HtmlContent))
|
||||
document.Elements.Add(new ElementDocument {
|
||||
Element = element,
|
||||
Content = context.HtmlContent
|
||||
});
|
||||
});
|
||||
|
||||
return document;
|
||||
}
|
||||
|
||||
private IDictionary<string, Category> GetCategories() {
|
||||
var providers = _categoryProviders.Value;
|
||||
var categories = providers.SelectMany(x => x.GetCategories());
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.Layouts.Framework.Drivers;
|
||||
using Orchard.Layouts.Framework.Elements;
|
||||
using Orchard.Layouts.Models;
|
||||
|
||||
namespace Orchard.Layouts.Services {
|
||||
public interface IElementManager : IDependency {
|
||||
@ -23,5 +24,6 @@ namespace Orchard.Layouts.Services {
|
||||
void Saving(LayoutSavingContext context);
|
||||
void Removing(LayoutSavingContext context);
|
||||
void Indexing(LayoutIndexingContext context);
|
||||
LayoutDocument BuildDocument(ILayoutAspect layout, IEnumerable<IElement> elements);
|
||||
}
|
||||
}
|
@ -8,6 +8,7 @@ namespace Orchard.Layouts.Services {
|
||||
IEnumerable<LayoutPart> GetTemplates();
|
||||
LayoutPart GetLayout(int id);
|
||||
IEnumerable<IElement> LoadElements(ILayoutAspect layout);
|
||||
LayoutDocument BuildDocument(ILayoutAspect layout);
|
||||
dynamic RenderLayout(ILayoutAspect layout, string state = null, string displayType = null);
|
||||
|
||||
/// <summary>
|
||||
|
@ -0,0 +1,19 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Orchard.Layouts.Services {
|
||||
/// <summary>
|
||||
/// Represents a text document of a layout.
|
||||
/// </summary>
|
||||
public class LayoutDocument {
|
||||
public LayoutDocument() {
|
||||
Elements = new List<ElementDocument>();
|
||||
}
|
||||
public IList<ElementDocument> Elements { get; set; }
|
||||
|
||||
public string ToString(string separator) {
|
||||
return String.Join(separator, Elements.Select(x => x.Content));
|
||||
}
|
||||
}
|
||||
}
|
@ -44,6 +44,11 @@ namespace Orchard.Layouts.Services {
|
||||
return _serializer.Deserialize(layout.LayoutState, describeContext);
|
||||
}
|
||||
|
||||
public LayoutDocument BuildDocument(ILayoutAspect layout) {
|
||||
var elements = LoadElements(layout).Flatten().ToArray();
|
||||
return _elementManager.BuildDocument(layout, elements);
|
||||
}
|
||||
|
||||
public dynamic RenderLayout(ILayoutAspect layout, string state = null, string displayType = null) {
|
||||
var elements = _serializer.Deserialize(state ?? layout.LayoutState, new DescribeElementsContext { Content = layout });
|
||||
var layoutRoot = _elementDisplay.DisplayElements(elements, layout, displayType);
|
||||
|
@ -0,0 +1,13 @@
|
||||
@*doing excerpt generation on the way out for now so we don't stick ourselves with needing to regen excerpts for existing data
|
||||
also, doing this here, inline, until we have a pluggable processing model (both in and out)
|
||||
also, ...this is ugly *@
|
||||
@using Orchard.ContentManagement
|
||||
@using Orchard.Layouts.Services
|
||||
@using Orchard.Utility.Extensions
|
||||
@{
|
||||
var contentItem = (ContentItem)Model.ContentItem;
|
||||
var document = (LayoutDocument)Model.Document;
|
||||
var documentText = document.ToString(separator: Environment.NewLine).RemoveTags();
|
||||
var excerpt = new HtmlString(Html.Excerpt(documentText, 200).ToString().Replace(Environment.NewLine, "</p>" + Environment.NewLine + "<p>"));
|
||||
}
|
||||
<p>@excerpt @Html.ItemDisplayLink(T("more").ToString(), contentItem)</p>
|
Loading…
Reference in New Issue
Block a user