diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/ContentPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/ContentPartDriver.cs index 948fcba2b..9527e1f8e 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/ContentPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/ContentPartDriver.cs @@ -1,7 +1,43 @@ -using Orchard.Layouts.Elements; +using System.Linq; +using System.Web.Mvc; +using Orchard.Data; +using Orchard.Layouts.Elements; +using Orchard.Layouts.Framework.Display; using Orchard.Layouts.Framework.Drivers; +using Orchard.Layouts.Services; namespace Orchard.Layouts.Drivers { public class ContentPartDriver : ElementDriver { + private readonly IContentPartDisplay _contentPartDisplay; + private readonly ICultureAccessor _cultureAccessor; + private readonly ITransactionManager _transactionManager; + + public ContentPartDriver(IContentPartDisplay contentPartDisplay, ICultureAccessor cultureAccessor, ITransactionManager transactionManager) { + _contentPartDisplay = contentPartDisplay; + _cultureAccessor = cultureAccessor; + _transactionManager = transactionManager; + } + + protected override void OnDisplaying(ContentPart element, ElementDisplayContext context) { + var contentItem = context.Content.ContentItem; + var contentPartName = (string)element.Descriptor.StateBag["ElementTypeName"]; + var contentPart = contentItem.Parts.FirstOrDefault(x => x.PartDefinition.Name == contentPartName); + + if ((contentItem.Id == 0 || context.DisplayType == "Design") && context.Updater != null) { + // The content item hasn't been stored yet, so bind form values with the content part to represent actual state. + var controller = (Controller)context.Updater; + var oldValueProvider = controller.ValueProvider; + + controller.ValueProvider = new DictionaryValueProvider(context.Element.State, _cultureAccessor.CurrentCulture); + _contentPartDisplay.UpdateEditor(contentPart, context.Updater); + _transactionManager.Cancel(); + controller.ValueProvider = oldValueProvider; + } + + var contentPartShape = _contentPartDisplay.BuildDisplay(contentPart, displayType: "Layout"); + + context.ElementShape.ContentPart = contentPart; + context.ElementShape.Content = contentPartShape; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementDescriptor.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementDescriptor.cs index c0b5a7070..7a9e391f0 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementDescriptor.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementDescriptor.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Orchard.Layouts.Framework.Display; using Orchard.Localization; @@ -11,6 +12,7 @@ namespace Orchard.Layouts.Framework.Elements { Category = category; CreatingDisplay = context => {}; Displaying = context => {}; + StateBag = new Dictionary(); } public LocalizedString DisplayText { get; set; } @@ -21,5 +23,6 @@ namespace Orchard.Layouts.Framework.Elements { public Action Displaying { get; set; } public bool IsSystemElement { get; set; } public bool EnableEditorDialog { get; set; } + public IDictionary StateBag { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj index cef6477f7..d66fd91eb 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj @@ -362,6 +362,9 @@ + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/BlueprintElementHarvester.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/BlueprintElementHarvester.cs index a7e9e2810..e5a01b786 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/BlueprintElementHarvester.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/BlueprintElementHarvester.cs @@ -41,6 +41,9 @@ namespace Orchard.Layouts.Providers { IsSystemElement = false, CreatingDisplay = creatingDisplayContext => CreatingDisplay(creatingDisplayContext, blueprint), Displaying = displayContext => Displaying(displayContext, baseElement), + StateBag = new Dictionary { + {"ElementTypeName", baseElement.Descriptor.TypeName} + } }; var descriptors = query.ToArray(); diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/ContentPartElementHarvester.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/ContentPartElementHarvester.cs index 2c44c071d..db9875f8c 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/ContentPartElementHarvester.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/ContentPartElementHarvester.cs @@ -1,9 +1,7 @@ using System.Collections.Generic; using System.Linq; -using System.Web.Mvc; using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData.Models; -using Orchard.Data; using Orchard.Environment; using Orchard.Layouts.Framework.Display; using Orchard.Layouts.Framework.Elements; @@ -14,23 +12,17 @@ using Orchard.Layouts.Settings; namespace Orchard.Layouts.Providers { public class ContentPartElementHarvester : Component, IElementHarvester { private readonly Work _contentDefinitionManager; - private readonly Work _transactionManager; - private readonly Work _cultureAccessor; - private readonly Work _contentPartDisplay; private readonly Work _elementFactory; + private readonly Work _elementManager; public ContentPartElementHarvester( - Work contentDefinitionManager, - Work transactionManager, - Work cultureAccessor, - Work contentPartDisplay, - Work elementFactory) { + Work contentDefinitionManager, + Work elementFactory, + Work elementManager) { _contentDefinitionManager = contentDefinitionManager; - _transactionManager = transactionManager; - _cultureAccessor = cultureAccessor; - _contentPartDisplay = contentPartDisplay; _elementFactory = elementFactory; + _elementManager = elementManager; } public IEnumerable HarvestElements(HarvestElementsContext context) { @@ -39,39 +31,31 @@ namespace Orchard.Layouts.Providers { var contentParts = GetContentParts(context); return contentParts.Select(contentPart => new ElementDescriptor(elementType, contentPart.Name, T(contentPart.Name), contentPartElement.Category) { - Displaying = displayContext => Displaying(displayContext) + Displaying = displayContext => Displaying(displayContext), + StateBag = new Dictionary { + {"ElementTypeName", contentPart.Name} + } }); } private IEnumerable GetContentParts(HarvestElementsContext context) { - var contentTypeDefinition = context.Content != null - ? _contentDefinitionManager.Value.GetTypeDefinition(context.Content.ContentItem.ContentType) + var contentTypeDefinition = context.Content != null + ? _contentDefinitionManager.Value.GetTypeDefinition(context.Content.ContentItem.ContentType) : default(ContentTypeDefinition); var parts = contentTypeDefinition != null - ? contentTypeDefinition.Parts.Select(x => x.PartDefinition) + ? contentTypeDefinition.Parts.Select(x => x.PartDefinition) : _contentDefinitionManager.Value.ListPartDefinitions(); return parts.Where(p => p.Settings.GetModel().Placable); } private void Displaying(ElementDisplayContext context) { - var contentItem = context.Content.ContentItem; - var contentPart = contentItem.Parts.FirstOrDefault(x => x.PartDefinition.Name == context.Element.Descriptor.TypeName); + var drivers = _elementManager.Value.GetDrivers(context.Element); - if ((contentItem.Id == 0 || context.DisplayType == "Design") && context.Updater != null) { - // The content item hasn't been stored yet, so bind form values with the content part to represent actual state. - var controller = (Controller)context.Updater; - var oldValueProvider = controller.ValueProvider; - - controller.ValueProvider = new DictionaryValueProvider(context.Element.State, _cultureAccessor.Value.CurrentCulture); - _contentPartDisplay.Value.UpdateEditor(contentPart, context.Updater); - _transactionManager.Value.Cancel(); - controller.ValueProvider = oldValueProvider; + foreach (var driver in drivers) { + driver.Displaying(context); } - - var contentPartShape = _contentPartDisplay.Value.BuildDisplay(contentPart, displayType: "Layout"); - context.ElementShape.ContentPart = contentPartShape; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementBlueprintService.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementBlueprintService.cs index b80676e24..c94926817 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementBlueprintService.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementBlueprintService.cs @@ -35,7 +35,7 @@ namespace Orchard.Layouts.Services { public ElementBlueprint CreateBlueprint(IElement baseElement, string elementTypeName, string elementDisplayName, string elementCategory) { var blueprint = new ElementBlueprint { - BaseElementTypeName = baseElement.Type, + BaseElementTypeName = baseElement.Descriptor.TypeName, ElementTypeName = elementTypeName, ElementDisplayName = elementDisplayName, ElementCategory = elementCategory diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Views/Element-ContentPart.Design.cshtml b/src/Orchard.Web/Modules/Orchard.Layouts/Views/Element-ContentPart.Design.cshtml new file mode 100644 index 000000000..2f7603b33 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Views/Element-ContentPart.Design.cshtml @@ -0,0 +1,14 @@ +@using Orchard.DisplayManagement.Shapes +@using Orchard.Layouts.Helpers +@{ + var element = Model.Element; + var tagBuilder = TagBuilderExtensions.AddCommonElementAttributes(new OrchardTagBuilder("div"), Model); +} +
+
@element.Descriptor.DisplayText
+
+
+ @tagBuilder.StartElement + @Display(Model.Content) + @tagBuilder.EndElement +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Views/Element-ContentPart.cshtml b/src/Orchard.Web/Modules/Orchard.Layouts/Views/Element-ContentPart.cshtml index 3da445e3b..a2e8a5985 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Views/Element-ContentPart.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Views/Element-ContentPart.cshtml @@ -4,5 +4,5 @@ var tagBuilder = TagBuilderExtensions.AddCommonElementAttributes(new OrchardTagBuilder("div"), Model); } @tagBuilder.StartElement -@Display(Model.ContentPart) +@Display(Model.Content) @tagBuilder.EndElement \ No newline at end of file