From 19f8286258772886a79b6f7a4ab5080e0838d643 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 30 Dec 2011 15:26:41 -0800 Subject: [PATCH] #18165: Injecting ContentPart, ContentItem and ContentField properties automatically in any Shape Work Item: 18165 --HG-- branch : 1.x --- .../ContentPartDriverCoordinatorTests.cs | 2 +- .../Core/Common/Drivers/BodyPartDriver.cs | 4 +- .../Core/Common/Drivers/CommonPartDriver.cs | 6 +- .../Core/Common/Drivers/TextFieldDriver.cs | 2 +- .../Core/Contents/Drivers/ContentsDriver.cs | 6 +- .../Core/Routable/Drivers/RoutePartDriver.cs | 6 +- .../Core/Title/Drivers/TitlePartDriver.cs | 6 +- .../Drivers/BlogArchivesPartDriver.cs | 2 +- .../Orchard.Blogs/Drivers/BlogPartDriver.cs | 8 +-- .../Drivers/RecentBlogPostsPartDriver.cs | 28 ++++---- .../Drivers/CommentsContainerPartDriver.cs | 4 +- .../Drivers/CommentsPartDriver.cs | 6 +- .../Drivers/ContainerPartDriver.cs | 8 +-- .../Drivers/LocalizationPartDriver.cs | 6 +- .../Drivers/PublishLaterPartDriver.cs | 6 +- .../Orchard.Tags/Drivers/TagsPartDriver.cs | 2 +- .../Drivers/ContentFieldDriver.cs | 45 +++++++++--- .../Drivers/ContentPartDriver.cs | 68 +++++++++++++------ .../ContentPartDriverCoordinator.cs | 6 +- .../Handlers/BuildShapeContext.cs | 5 +- 20 files changed, 141 insertions(+), 85 deletions(-) diff --git a/src/Orchard.Tests/ContentManagement/Handlers/Coordinators/ContentPartDriverCoordinatorTests.cs b/src/Orchard.Tests/ContentManagement/Handlers/Coordinators/ContentPartDriverCoordinatorTests.cs index da4c58dd6..86f45aad4 100644 --- a/src/Orchard.Tests/ContentManagement/Handlers/Coordinators/ContentPartDriverCoordinatorTests.cs +++ b/src/Orchard.Tests/ContentManagement/Handlers/Coordinators/ContentPartDriverCoordinatorTests.cs @@ -78,7 +78,7 @@ namespace Orchard.Tests.ContentManagement.Handlers.Coordinators { } protected override DriverResult Display(StubPart part, string displayType, dynamic shapeHelper) { - var stub = shapeHelper.Stub(ContentPart: part, Foo: string.Join(",", part.Foo)); + var stub = shapeHelper.Stub(Foo: string.Join(",", part.Foo)); if (!string.IsNullOrWhiteSpace(displayType)) stub.Metadata.Type = string.Format("{0}.{1}", stub.Metadata.Type, displayType); return ContentShape(stub).Location("TopMeta"); diff --git a/src/Orchard.Web/Core/Common/Drivers/BodyPartDriver.cs b/src/Orchard.Web/Core/Common/Drivers/BodyPartDriver.cs index db1f35533..6fb80bc14 100644 --- a/src/Orchard.Web/Core/Common/Drivers/BodyPartDriver.cs +++ b/src/Orchard.Web/Core/Common/Drivers/BodyPartDriver.cs @@ -34,12 +34,12 @@ namespace Orchard.Core.Common.Drivers { ContentShape("Parts_Common_Body", () => { var bodyText = _htmlFilters.Aggregate(part.Text, (text, filter) => filter.ProcessContent(text, GetFlavor(part))); - return shapeHelper.Parts_Common_Body(ContentPart: part, Html: new HtmlString(bodyText)); + return shapeHelper.Parts_Common_Body(Html: new HtmlString(bodyText)); }), ContentShape("Parts_Common_Body_Summary", () => { var bodyText = _htmlFilters.Aggregate(part.Text, (text, filter) => filter.ProcessContent(text, GetFlavor(part))); - return shapeHelper.Parts_Common_Body_Summary(ContentPart: part, Html: new HtmlString(bodyText)); + return shapeHelper.Parts_Common_Body_Summary(Html: new HtmlString(bodyText)); }) ); } diff --git a/src/Orchard.Web/Core/Common/Drivers/CommonPartDriver.cs b/src/Orchard.Web/Core/Common/Drivers/CommonPartDriver.cs index 8c6c1ea31..759379251 100644 --- a/src/Orchard.Web/Core/Common/Drivers/CommonPartDriver.cs +++ b/src/Orchard.Web/Core/Common/Drivers/CommonPartDriver.cs @@ -38,11 +38,11 @@ namespace Orchard.Core.Common.Drivers { protected override DriverResult Display(CommonPart part, string displayType, dynamic shapeHelper) { return Combined( ContentShape("Parts_Common_Metadata", - () => shapeHelper.Parts_Common_Metadata(ContentPart: part)), + () => shapeHelper.Parts_Common_Metadata()), ContentShape("Parts_Common_Metadata_Summary", - () => shapeHelper.Parts_Common_Metadata_Summary(ContentPart: part)), + () => shapeHelper.Parts_Common_Metadata_Summary()), ContentShape("Parts_Common_Metadata_SummaryAdmin", - () => shapeHelper.Parts_Common_Metadata_SummaryAdmin(ContentPart: part)) + () => shapeHelper.Parts_Common_Metadata_SummaryAdmin()) ); } diff --git a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs index 2a4696860..6ab1261ef 100644 --- a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs +++ b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs @@ -26,7 +26,7 @@ namespace Orchard.Core.Common.Drivers { protected override DriverResult Display(ContentPart part, TextField field, string displayType, dynamic shapeHelper) { return ContentShape("Fields_Common_Text", GetDifferentiator(field, part), - () => shapeHelper.Fields_Common_Text(ContentPart: part, ContentField: field, Name: field.Name, Value: field.Value)); + () => shapeHelper.Fields_Common_Text(Name: field.Name, Value: field.Value)); } protected override DriverResult Editor(ContentPart part, TextField field, dynamic shapeHelper) { diff --git a/src/Orchard.Web/Core/Contents/Drivers/ContentsDriver.cs b/src/Orchard.Web/Core/Contents/Drivers/ContentsDriver.cs index 44fba0439..05dac78c1 100644 --- a/src/Orchard.Web/Core/Contents/Drivers/ContentsDriver.cs +++ b/src/Orchard.Web/Core/Contents/Drivers/ContentsDriver.cs @@ -8,11 +8,11 @@ namespace Orchard.Core.Contents.Drivers { protected override DriverResult Display(ContentPart part, string displayType, dynamic shapeHelper) { return Combined( ContentShape("Parts_Contents_Publish", - () => shapeHelper.Parts_Contents_Publish(ContentPart: part)), + () => shapeHelper.Parts_Contents_Publish()), ContentShape("Parts_Contents_Publish_Summary", - () => shapeHelper.Parts_Contents_Publish_Summary(ContentPart: part)), + () => shapeHelper.Parts_Contents_Publish_Summary()), ContentShape("Parts_Contents_Publish_SummaryAdmin", - () => shapeHelper.Parts_Contents_Publish_SummaryAdmin(ContentPart: part)) + () => shapeHelper.Parts_Contents_Publish_SummaryAdmin()) ); } diff --git a/src/Orchard.Web/Core/Routable/Drivers/RoutePartDriver.cs b/src/Orchard.Web/Core/Routable/Drivers/RoutePartDriver.cs index e940dd7fc..22aa950ef 100644 --- a/src/Orchard.Web/Core/Routable/Drivers/RoutePartDriver.cs +++ b/src/Orchard.Web/Core/Routable/Drivers/RoutePartDriver.cs @@ -50,11 +50,11 @@ namespace Orchard.Core.Routable.Drivers { protected override DriverResult Display(RoutePart part, string displayType, dynamic shapeHelper) { return Combined( ContentShape("Parts_RoutableTitle", - () => shapeHelper.Parts_RoutableTitle(ContentPart: part, Title: part.Title, Path: part.Path)), + () => shapeHelper.Parts_RoutableTitle(Title: part.Title, Path: part.Path)), ContentShape("Parts_RoutableTitle_Summary", - () => shapeHelper.Parts_RoutableTitle_Summary(ContentPart: part, Title: part.Title, Path: part.Path)), + () => shapeHelper.Parts_RoutableTitle_Summary(Title: part.Title, Path: part.Path)), ContentShape("Parts_RoutableTitle_SummaryAdmin", - () => shapeHelper.Parts_RoutableTitle_SummaryAdmin(ContentPart: part, Title: part.Title, Path: part.Path)) + () => shapeHelper.Parts_RoutableTitle_SummaryAdmin(Title: part.Title, Path: part.Path)) ); } diff --git a/src/Orchard.Web/Core/Title/Drivers/TitlePartDriver.cs b/src/Orchard.Web/Core/Title/Drivers/TitlePartDriver.cs index 4dced7ef9..6b07f3aab 100644 --- a/src/Orchard.Web/Core/Title/Drivers/TitlePartDriver.cs +++ b/src/Orchard.Web/Core/Title/Drivers/TitlePartDriver.cs @@ -18,11 +18,11 @@ namespace Orchard.Core.Title.Drivers { protected override DriverResult Display(TitlePart part, string displayType, dynamic shapeHelper) { return Combined( ContentShape("Parts_Title", - () => shapeHelper.Parts_Title(ContentPart: part, Title: part.Title)), + () => shapeHelper.Parts_Title(Title: part.Title)), ContentShape("Parts_Title_Summary", - () => shapeHelper.Parts_Title_Summary(ContentPart: part, Title: part.Title)), + () => shapeHelper.Parts_Title_Summary(Title: part.Title)), ContentShape("Parts_Title_SummaryAdmin", - () => shapeHelper.Parts_Title_SummaryAdmin(ContentPart: part, Title: part.Title)) + () => shapeHelper.Parts_Title_SummaryAdmin(Title: part.Title)) ); } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogArchivesPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogArchivesPartDriver.cs index 3eca23437..4e41f7f8f 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogArchivesPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogArchivesPartDriver.cs @@ -30,7 +30,7 @@ namespace Orchard.Blogs.Drivers { if (blog == null) return null; - return shapeHelper.Parts_Blogs_BlogArchives(ContentItem: part.ContentItem, Blog: blog, Archives: _blogPostService.GetArchives(blog)); + return shapeHelper.Parts_Blogs_BlogArchives(Blog: blog, Archives: _blogPostService.GetArchives(blog)); }); } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogPartDriver.cs index 90133430c..6d7ef62d8 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogPartDriver.cs @@ -11,13 +11,13 @@ namespace Orchard.Blogs.Drivers { protected override DriverResult Display(BlogPart part, string displayType, dynamic shapeHelper) { return Combined( ContentShape("Parts_Blogs_Blog_Manage", - () => shapeHelper.Parts_Blogs_Blog_Manage(ContentPart: part)), + () => shapeHelper.Parts_Blogs_Blog_Manage()), ContentShape("Parts_Blogs_Blog_Description", - () => shapeHelper.Parts_Blogs_Blog_Description(ContentPart: part, Description: part.Description)), + () => shapeHelper.Parts_Blogs_Blog_Description(Description: part.Description)), ContentShape("Parts_Blogs_Blog_SummaryAdmin", - () => shapeHelper.Parts_Blogs_Blog_SummaryAdmin(ContentPart: part, ContentItem: part.ContentItem)), + () => shapeHelper.Parts_Blogs_Blog_SummaryAdmin()), ContentShape("Parts_Blogs_Blog_BlogPostCount", - () => shapeHelper.Parts_Blogs_Blog_BlogPostCount(ContentPart: part, PostCount: part.PostCount)) + () => shapeHelper.Parts_Blogs_Blog_BlogPostCount(PostCount: part.PostCount)) ); } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs index 207e97472..67a52b8cc 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs @@ -23,24 +23,26 @@ namespace Orchard.Blogs.Drivers { } protected override DriverResult Display(RecentBlogPostsPart part, string displayType, dynamic shapeHelper) { - BlogPart blog = GetBlogFromSlug(part.ForBlog); + return ContentShape("Parts_Blogs_RecentBlogPosts", () => { + BlogPart blog = GetBlogFromSlug(part.ForBlog); - if (blog == null) { - return null; - } + if (blog == null) { + return null; + } - var blogPosts =_contentManager.Query(VersionOptions.Published, "BlogPost") - .Join().Where(cr => cr.Container == blog.Record.ContentItemRecord) - .OrderByDescending(cr => cr.CreatedUtc) - .Slice(0, part.Count) - .Select(ci => ci.As()); + var blogPosts = _contentManager.Query(VersionOptions.Published, "BlogPost") + .Join().Where(cr => cr.Container == blog.Record.ContentItemRecord) + .OrderByDescending(cr => cr.CreatedUtc) + .Slice(0, part.Count) + .Select(ci => ci.As()); - var list = shapeHelper.List(); - list.AddRange(blogPosts.Select(bp => _contentManager.BuildDisplay(bp, "Summary"))); + var list = shapeHelper.List(); + list.AddRange(blogPosts.Select(bp => _contentManager.BuildDisplay(bp, "Summary"))); - var blogPostList = shapeHelper.Parts_Blogs_BlogPost_List(ContentPart: part, ContentItems: list); + var blogPostList = shapeHelper.Parts_Blogs_BlogPost_List(ContentItems: list); - return ContentShape(shapeHelper.Parts_Blogs_RecentBlogPosts(ContentItem: part.ContentItem, ContentItems: blogPostList, Blog: blog)); + return shapeHelper.Parts_Blogs_RecentBlogPosts(ContentItems: blogPostList, Blog: blog); + }); } protected override DriverResult Editor(RecentBlogPostsPart part, dynamic shapeHelper) { diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsContainerPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsContainerPartDriver.cs index 680f50757..993dcb9eb 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsContainerPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsContainerPartDriver.cs @@ -21,9 +21,9 @@ namespace Orchard.Comments.Drivers { return Combined( ContentShape("Parts_Comments_Count", - () => shapeHelper.Parts_Comments_Count(ContentPart: part, CommentCount: commentsForCommentedContent.Count(), PendingCount: pendingCount)), + () => shapeHelper.Parts_Comments_Count(CommentCount: commentsForCommentedContent.Count(), PendingCount: pendingCount)), ContentShape("Parts_Comments_Count_SummaryAdmin", - () => shapeHelper.Parts_Comments_Count_SummaryAdmin(ContentPart: part, CommentCount: commentsForCommentedContent.Count(), PendingCount: pendingCount)) + () => shapeHelper.Parts_Comments_Count_SummaryAdmin(CommentCount: commentsForCommentedContent.Count(), PendingCount: pendingCount)) ); } } diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs index ce14de615..719609fc7 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs @@ -23,11 +23,11 @@ namespace Orchard.Comments.Drivers { return Combined( ContentShape("Parts_Comments", - () => shapeHelper.Parts_Comments(ContentPart: part)), + () => shapeHelper.Parts_Comments()), ContentShape("Parts_Comments_Count", - () => shapeHelper.Parts_Comments_Count(ContentPart: part, CommentCount: commentsForCommentedContent.Count(), PendingCount: pendingCount)), + () => shapeHelper.Parts_Comments_Count(CommentCount: commentsForCommentedContent.Count(), PendingCount: pendingCount)), ContentShape("Parts_Comments_Count_SummaryAdmin", - () => shapeHelper.Parts_Comments_Count_SummaryAdmin(ContentPart: part, CommentCount: commentsForCommentedContent.Count(), PendingCount: pendingCount)) + () => shapeHelper.Parts_Comments_Count_SummaryAdmin(CommentCount: commentsForCommentedContent.Count(), PendingCount: pendingCount)) ); } diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Drivers/ContainerPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Lists/Drivers/ContainerPartDriver.cs index 80fe23920..9c3b058be 100644 --- a/src/Orchard.Web/Modules/Orchard.Lists/Drivers/ContainerPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Lists/Drivers/ContainerPartDriver.cs @@ -1,15 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.Drivers; using Orchard.Core.Containers.Models; namespace Orchard.Lists.Drivers { public class ContainerPartDriver : ContentPartDriver{ protected override DriverResult Display(ContainerPart part, string displayType, dynamic shapeHelper) { return ContentShape("Parts_Container_Contained_SummaryAdmin", - () => shapeHelper.Parts_Container_Contained_SummaryAdmin(ContentPart: part) + () => shapeHelper.Parts_Container_Contained_SummaryAdmin() ); } } diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Drivers/LocalizationPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Localization/Drivers/LocalizationPartDriver.cs index f27747bcc..480515f26 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Drivers/LocalizationPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Localization/Drivers/LocalizationPartDriver.cs @@ -27,11 +27,11 @@ namespace Orchard.Localization.Drivers { : part.Id; return Combined( ContentShape("Parts_Localization_ContentTranslations", - () => shapeHelper.Parts_Localization_ContentTranslations(ContentPart: part, MasterId: masterId, Localizations: GetDisplayLocalizations(part, VersionOptions.Published))), + () => shapeHelper.Parts_Localization_ContentTranslations(MasterId: masterId, Localizations: GetDisplayLocalizations(part, VersionOptions.Published))), ContentShape("Parts_Localization_ContentTranslations_Summary", - () => shapeHelper.Parts_Localization_ContentTranslations_Summary(ContentPart: part, MasterId: masterId, Localizations: GetDisplayLocalizations(part, VersionOptions.Published))), + () => shapeHelper.Parts_Localization_ContentTranslations_Summary(MasterId: masterId, Localizations: GetDisplayLocalizations(part, VersionOptions.Published))), ContentShape("Parts_Localization_ContentTranslations_SummaryAdmin", - () => shapeHelper.Parts_Localization_ContentTranslations_SummaryAdmin(ContentPart: part, MasterId: masterId, Localizations: GetDisplayLocalizations(part, VersionOptions.Latest))) + () => shapeHelper.Parts_Localization_ContentTranslations_SummaryAdmin(MasterId: masterId, Localizations: GetDisplayLocalizations(part, VersionOptions.Latest))) ); } diff --git a/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs b/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs index ffd9c4f6d..ef554507d 100644 --- a/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs @@ -42,11 +42,11 @@ namespace Orchard.PublishLater.Drivers { protected override DriverResult Display(PublishLaterPart part, string displayType, dynamic shapeHelper) { return Combined( ContentShape("Parts_PublishLater_Metadata", - () => shapeHelper.Parts_PublishLater_Metadata(ContentPart: part, ScheduledPublishUtc: part.ScheduledPublishUtc.Value)), + () => shapeHelper.Parts_PublishLater_Metadata(ScheduledPublishUtc: part.ScheduledPublishUtc.Value)), ContentShape("Parts_PublishLater_Metadata_Summary", - () => shapeHelper.Parts_PublishLater_Metadata_Summary(ContentPart: part, ScheduledPublishUtc: part.ScheduledPublishUtc.Value)), + () => shapeHelper.Parts_PublishLater_Metadata_Summary(ScheduledPublishUtc: part.ScheduledPublishUtc.Value)), ContentShape("Parts_PublishLater_Metadata_SummaryAdmin", - () => shapeHelper.Parts_PublishLater_Metadata_SummaryAdmin(ContentPart: part, ScheduledPublishUtc: part.ScheduledPublishUtc.Value)) + () => shapeHelper.Parts_PublishLater_Metadata_SummaryAdmin(ScheduledPublishUtc: part.ScheduledPublishUtc.Value)) ); } diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagsPartDriver.cs index 8c879c7b2..617ad806a 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagsPartDriver.cs @@ -33,7 +33,7 @@ namespace Orchard.Tags.Drivers { protected override DriverResult Display(TagsPart part, string displayType, dynamic shapeHelper) { return ContentShape("Parts_Tags_ShowTags", - () => shapeHelper.Parts_Tags_ShowTags(ContentPart: part, Tags: part.CurrentTags)); + () => shapeHelper.Parts_Tags_ShowTags(Tags: part.CurrentTags)); } protected override DriverResult Editor(TagsPart part, dynamic shapeHelper) { diff --git a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs index a1a9183f0..e06a66f48 100644 --- a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs @@ -16,15 +16,27 @@ namespace Orchard.ContentManagement.Drivers { } DriverResult IContentFieldDriver.BuildDisplayShape(BuildDisplayContext context) { - return Process(context.ContentItem, (part, field) => Display(part, field, context.DisplayType, context.New)); + return Process(context.ContentItem, (part, field) => { + context.ContentPart = part; + context.ContentField = field; + return Display(part, field, context.DisplayType, context.New); + }); } DriverResult IContentFieldDriver.BuildEditorShape(BuildEditorContext context) { - return Process(context.ContentItem, (part, field) => Editor(part, field, context.New)); + return Process(context.ContentItem, (part, field) => { + context.ContentPart = part; + context.ContentField = field; + return Editor(part, field, context.New); + }); } DriverResult IContentFieldDriver.UpdateEditorShape(UpdateEditorContext context) { - return Process(context.ContentItem, (part, field) => Editor(part, field, context.Updater, context.New)); + return Process(context.ContentItem, (part, field) => { + context.ContentPart = part; + context.ContentField = field; + return Editor(part, field, context.Updater, context.New); + }); } void IContentFieldDriver.Importing(ImportContentContext context) { @@ -75,7 +87,7 @@ namespace Orchard.ContentManagement.Drivers { return contentFieldInfo; } - protected virtual void GetContentItemMetadata(ContentPart part, TField field, ContentItemMetadata metadata) { return; } + protected virtual void GetContentItemMetadata(ContentPart part, TField field, ContentItemMetadata metadata) { } protected virtual DriverResult Display(ContentPart part, TField field, string displayType, dynamic shapeHelper) { return null; } protected virtual DriverResult Editor(ContentPart part, TField field, dynamic shapeHelper) { return null; } @@ -105,19 +117,34 @@ namespace Orchard.ContentManagement.Drivers { } private ContentShapeResult ContentShapeImplementation(string shapeType, string differentiator, Func shapeBuilder) { - return new ContentShapeResult(shapeType, Prefix, ctx => AddAlternates(shapeBuilder(ctx), differentiator)).Differentiator(differentiator); + return new ContentShapeResult(shapeType, Prefix, ctx => AddAlternates(shapeBuilder(ctx), ctx, differentiator)).Differentiator(differentiator); } - private static object AddAlternates(dynamic shape, string differentiator) { + private static object AddAlternates(dynamic shape, BuildShapeContext ctx, string differentiator) { // automatically add shape alternates for shapes added by fields // for fields on dynamic parts the part name is the same as the content type name ShapeMetadata metadata = shape.Metadata; - ContentPart part = shape.ContentPart; + + // if no ContentField property has been set, assign it + if (shape.ContentPart == null) { + shape.ContentPart = ctx.ContentField; + } + + // if no ContentPart property has been set, assign it + if (shape.ContentPart == null) { + shape.ContentPart = ctx.ContentPart; + } + + // if no ContentItem property has been set, assign it + if (shape.ContentItem == null) { + shape.ContentItem = ctx.ContentItem; + } + var shapeType = metadata.Type; var fieldName = differentiator ?? String.Empty; - var partName = part != null ? part.PartDefinition.Name : String.Empty; - var contentType = part != null ? part.ContentItem.ContentType : String.Empty; + var partName = shape.ContentPart.PartDefinition.Name; + var contentType = shape.ContentItem.ContentType; var dynamicType = string.Equals(partName, contentType, StringComparison.Ordinal); // [ShapeType__FieldName] e.g. Fields/Common.Text-Teaser diff --git a/src/Orchard/ContentManagement/Drivers/ContentPartDriver.cs b/src/Orchard/ContentManagement/Drivers/ContentPartDriver.cs index 83799d3bb..c597997b1 100644 --- a/src/Orchard/ContentManagement/Drivers/ContentPartDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/ContentPartDriver.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.MetaData; using Orchard.DisplayManagement; @@ -17,17 +18,38 @@ namespace Orchard.ContentManagement.Drivers { DriverResult IContentPartDriver.BuildDisplay(BuildDisplayContext context) { var part = context.ContentItem.As(); - return part == null ? null : Display(part, context.DisplayType, context.New); + + if(part == null) { + return null; + } + + context.ContentPart = part; + + return Display(part, context.DisplayType, context.New); } DriverResult IContentPartDriver.BuildEditor(BuildEditorContext context) { var part = context.ContentItem.As(); - return part == null ? null : Editor(part, context.New); + + if (part == null) { + return null; + } + + context.ContentPart = part; + + return Editor(part, context.New); } DriverResult IContentPartDriver.UpdateEditor(UpdateEditorContext context) { var part = context.ContentItem.As(); - return part == null ? null : Editor(part, context.Updater, context.New); + + if (part == null) { + return null; + } + + context.ContentPart = part; + + return Editor(part, context.Updater, context.New); } void IContentPartDriver.Importing(ImportContentContext context) { @@ -54,16 +76,16 @@ namespace Orchard.ContentManagement.Drivers { Exported(part, context); } - protected virtual void GetContentItemMetadata(TContent context, ContentItemMetadata metadata) { return; } + protected virtual void GetContentItemMetadata(TContent context, ContentItemMetadata metadata) {} protected virtual DriverResult Display(TContent part, string displayType, dynamic shapeHelper) { return null; } protected virtual DriverResult Editor(TContent part, dynamic shapeHelper) { return null; } protected virtual DriverResult Editor(TContent part, IUpdateModel updater, dynamic shapeHelper) { return null; } - protected virtual void Importing(TContent part, ImportContentContext context) { return; } - protected virtual void Imported(TContent part, ImportContentContext context) { return; } - protected virtual void Exporting(TContent part, ExportContentContext context) { return; } - protected virtual void Exported(TContent part, ExportContentContext context) { return; } + protected virtual void Importing(TContent part, ImportContentContext context) {} + protected virtual void Imported(TContent part, ImportContentContext context) {} + protected virtual void Exporting(TContent part, ExportContentContext context) {} + protected virtual void Exported(TContent part, ExportContentContext context) {} [Obsolete("Provided while transitioning to factory variations")] public ContentShapeResult ContentShape(IShape shape) { @@ -79,26 +101,30 @@ namespace Orchard.ContentManagement.Drivers { } private ContentShapeResult ContentShapeImplementation(string shapeType, Func shapeBuilder) { - return new ContentShapeResult(shapeType, Prefix, ctx => AddAlternates(shapeBuilder(ctx))); + return new ContentShapeResult(shapeType, Prefix, ctx => AddAlternates(shapeBuilder(ctx), ctx)); } - private static object AddAlternates(dynamic shape) { + private static dynamic AddAlternates(dynamic shape, BuildShapeContext ctx) { ShapeMetadata metadata = shape.Metadata; - ContentPart part = shape.ContentPart; - var id = part != null ? part.ContentItem.Id.ToString() : String.Empty; + + // if no ContentPart property has been set, assign it + if (shape.ContentPart == null) { + shape.ContentPart = ctx.ContentPart; + } + + // if no ContentItem property has been set, assign it + if (shape.ContentItem == null) { + shape.ContentItem = ctx.ContentItem; + } + var shapeType = metadata.Type; - var contentType = part != null ? part.ContentItem.ContentType : String.Empty; // [ShapeType]__[Id] e.g. Parts/Common.Metadata-42 - if ( !string.IsNullOrEmpty(id) ) { - metadata.Alternates.Add(shapeType + "__" + id); - } - + metadata.Alternates.Add(shapeType + "__" + ctx.ContentItem.Id.ToString(CultureInfo.InvariantCulture)); + // [ShapeType]__[ContentType] e.g. Parts/Common.Metadata-BlogPost - if ( !string.IsNullOrEmpty(contentType) ) { - metadata.Alternates.Add(shapeType + "__" + contentType); - } - + metadata.Alternates.Add(shapeType + "__" + ctx.ContentItem.ContentType); + return shape; } diff --git a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs index 8c7d06a2d..0091f346f 100644 --- a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs +++ b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs @@ -1,12 +1,14 @@ using System.Collections.Generic; using System.Linq; -using JetBrains.Annotations; using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.MetaData; using Orchard.Logging; namespace Orchard.ContentManagement.Drivers.Coordinators { - [UsedImplicitly] + /// + /// This component coordinates how parts are taking part in the rendering when some content needs to be rendered. + /// It will dispatch BuildDisplay/BuildEditor to all implementations. + /// public class ContentPartDriverCoordinator : ContentHandlerBase { private readonly IEnumerable _drivers; private readonly IContentDefinitionManager _contentDefinitionManager; diff --git a/src/Orchard/ContentManagement/Handlers/BuildShapeContext.cs b/src/Orchard/ContentManagement/Handlers/BuildShapeContext.cs index 1ac743caa..d8317159a 100644 --- a/src/Orchard/ContentManagement/Handlers/BuildShapeContext.cs +++ b/src/Orchard/ContentManagement/Handlers/BuildShapeContext.cs @@ -1,12 +1,12 @@ using System; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Descriptors; -using Orchard.DisplayManagement.Descriptors.ShapePlacementStrategy; namespace Orchard.ContentManagement.Handlers { public class BuildShapeContext { protected BuildShapeContext(IShape shape, IContent content, string groupId, IShapeFactory shapeFactory) { Shape = shape; + Content = content; ContentItem = content.ContentItem; New = shapeFactory; GroupId = groupId; @@ -14,7 +14,10 @@ namespace Orchard.ContentManagement.Handlers { } public dynamic Shape { get; private set; } + public IContent Content { get; private set; } public ContentItem ContentItem { get; private set; } + public ContentPart ContentPart { get; set; } + public ContentField ContentField { get; set; } public dynamic New { get; private set; } public string GroupId { get; private set; }