mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-09-24 13:33:34 +08:00
#18165: Injecting ContentPart, ContentItem and ContentField properties automatically in any Shape
Work Item: 18165 --HG-- branch : 1.x
This commit is contained in:
@@ -78,7 +78,7 @@ namespace Orchard.Tests.ContentManagement.Handlers.Coordinators {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override DriverResult Display(StubPart part, string displayType, dynamic shapeHelper) {
|
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))
|
if (!string.IsNullOrWhiteSpace(displayType))
|
||||||
stub.Metadata.Type = string.Format("{0}.{1}", stub.Metadata.Type, displayType);
|
stub.Metadata.Type = string.Format("{0}.{1}", stub.Metadata.Type, displayType);
|
||||||
return ContentShape(stub).Location("TopMeta");
|
return ContentShape(stub).Location("TopMeta");
|
||||||
|
@@ -34,12 +34,12 @@ namespace Orchard.Core.Common.Drivers {
|
|||||||
ContentShape("Parts_Common_Body",
|
ContentShape("Parts_Common_Body",
|
||||||
() => {
|
() => {
|
||||||
var bodyText = _htmlFilters.Aggregate(part.Text, (text, filter) => filter.ProcessContent(text, GetFlavor(part)));
|
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",
|
ContentShape("Parts_Common_Body_Summary",
|
||||||
() => {
|
() => {
|
||||||
var bodyText = _htmlFilters.Aggregate(part.Text, (text, filter) => filter.ProcessContent(text, GetFlavor(part)));
|
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));
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -38,11 +38,11 @@ namespace Orchard.Core.Common.Drivers {
|
|||||||
protected override DriverResult Display(CommonPart part, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(CommonPart part, string displayType, dynamic shapeHelper) {
|
||||||
return Combined(
|
return Combined(
|
||||||
ContentShape("Parts_Common_Metadata",
|
ContentShape("Parts_Common_Metadata",
|
||||||
() => shapeHelper.Parts_Common_Metadata(ContentPart: part)),
|
() => shapeHelper.Parts_Common_Metadata()),
|
||||||
ContentShape("Parts_Common_Metadata_Summary",
|
ContentShape("Parts_Common_Metadata_Summary",
|
||||||
() => shapeHelper.Parts_Common_Metadata_Summary(ContentPart: part)),
|
() => shapeHelper.Parts_Common_Metadata_Summary()),
|
||||||
ContentShape("Parts_Common_Metadata_SummaryAdmin",
|
ContentShape("Parts_Common_Metadata_SummaryAdmin",
|
||||||
() => shapeHelper.Parts_Common_Metadata_SummaryAdmin(ContentPart: part))
|
() => shapeHelper.Parts_Common_Metadata_SummaryAdmin())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -26,7 +26,7 @@ namespace Orchard.Core.Common.Drivers {
|
|||||||
|
|
||||||
protected override DriverResult Display(ContentPart part, TextField field, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(ContentPart part, TextField field, string displayType, dynamic shapeHelper) {
|
||||||
return ContentShape("Fields_Common_Text", GetDifferentiator(field, part),
|
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) {
|
protected override DriverResult Editor(ContentPart part, TextField field, dynamic shapeHelper) {
|
||||||
|
@@ -8,11 +8,11 @@ namespace Orchard.Core.Contents.Drivers {
|
|||||||
protected override DriverResult Display(ContentPart part, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(ContentPart part, string displayType, dynamic shapeHelper) {
|
||||||
return Combined(
|
return Combined(
|
||||||
ContentShape("Parts_Contents_Publish",
|
ContentShape("Parts_Contents_Publish",
|
||||||
() => shapeHelper.Parts_Contents_Publish(ContentPart: part)),
|
() => shapeHelper.Parts_Contents_Publish()),
|
||||||
ContentShape("Parts_Contents_Publish_Summary",
|
ContentShape("Parts_Contents_Publish_Summary",
|
||||||
() => shapeHelper.Parts_Contents_Publish_Summary(ContentPart: part)),
|
() => shapeHelper.Parts_Contents_Publish_Summary()),
|
||||||
ContentShape("Parts_Contents_Publish_SummaryAdmin",
|
ContentShape("Parts_Contents_Publish_SummaryAdmin",
|
||||||
() => shapeHelper.Parts_Contents_Publish_SummaryAdmin(ContentPart: part))
|
() => shapeHelper.Parts_Contents_Publish_SummaryAdmin())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -50,11 +50,11 @@ namespace Orchard.Core.Routable.Drivers {
|
|||||||
protected override DriverResult Display(RoutePart part, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(RoutePart part, string displayType, dynamic shapeHelper) {
|
||||||
return Combined(
|
return Combined(
|
||||||
ContentShape("Parts_RoutableTitle",
|
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",
|
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",
|
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))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -18,11 +18,11 @@ namespace Orchard.Core.Title.Drivers {
|
|||||||
protected override DriverResult Display(TitlePart part, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(TitlePart part, string displayType, dynamic shapeHelper) {
|
||||||
return Combined(
|
return Combined(
|
||||||
ContentShape("Parts_Title",
|
ContentShape("Parts_Title",
|
||||||
() => shapeHelper.Parts_Title(ContentPart: part, Title: part.Title)),
|
() => shapeHelper.Parts_Title(Title: part.Title)),
|
||||||
ContentShape("Parts_Title_Summary",
|
ContentShape("Parts_Title_Summary",
|
||||||
() => shapeHelper.Parts_Title_Summary(ContentPart: part, Title: part.Title)),
|
() => shapeHelper.Parts_Title_Summary(Title: part.Title)),
|
||||||
ContentShape("Parts_Title_SummaryAdmin",
|
ContentShape("Parts_Title_SummaryAdmin",
|
||||||
() => shapeHelper.Parts_Title_SummaryAdmin(ContentPart: part, Title: part.Title))
|
() => shapeHelper.Parts_Title_SummaryAdmin(Title: part.Title))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -30,7 +30,7 @@ namespace Orchard.Blogs.Drivers {
|
|||||||
if (blog == null)
|
if (blog == null)
|
||||||
return 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));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,13 +11,13 @@ namespace Orchard.Blogs.Drivers {
|
|||||||
protected override DriverResult Display(BlogPart part, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(BlogPart part, string displayType, dynamic shapeHelper) {
|
||||||
return Combined(
|
return Combined(
|
||||||
ContentShape("Parts_Blogs_Blog_Manage",
|
ContentShape("Parts_Blogs_Blog_Manage",
|
||||||
() => shapeHelper.Parts_Blogs_Blog_Manage(ContentPart: part)),
|
() => shapeHelper.Parts_Blogs_Blog_Manage()),
|
||||||
ContentShape("Parts_Blogs_Blog_Description",
|
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",
|
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",
|
ContentShape("Parts_Blogs_Blog_BlogPostCount",
|
||||||
() => shapeHelper.Parts_Blogs_Blog_BlogPostCount(ContentPart: part, PostCount: part.PostCount))
|
() => shapeHelper.Parts_Blogs_Blog_BlogPostCount(PostCount: part.PostCount))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -23,13 +23,14 @@ namespace Orchard.Blogs.Drivers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override DriverResult Display(RecentBlogPostsPart part, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(RecentBlogPostsPart part, string displayType, dynamic shapeHelper) {
|
||||||
|
return ContentShape("Parts_Blogs_RecentBlogPosts", () => {
|
||||||
BlogPart blog = GetBlogFromSlug(part.ForBlog);
|
BlogPart blog = GetBlogFromSlug(part.ForBlog);
|
||||||
|
|
||||||
if (blog == null) {
|
if (blog == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var blogPosts =_contentManager.Query(VersionOptions.Published, "BlogPost")
|
var blogPosts = _contentManager.Query(VersionOptions.Published, "BlogPost")
|
||||||
.Join<CommonPartRecord>().Where(cr => cr.Container == blog.Record.ContentItemRecord)
|
.Join<CommonPartRecord>().Where(cr => cr.Container == blog.Record.ContentItemRecord)
|
||||||
.OrderByDescending(cr => cr.CreatedUtc)
|
.OrderByDescending(cr => cr.CreatedUtc)
|
||||||
.Slice(0, part.Count)
|
.Slice(0, part.Count)
|
||||||
@@ -38,9 +39,10 @@ namespace Orchard.Blogs.Drivers {
|
|||||||
var list = shapeHelper.List();
|
var list = shapeHelper.List();
|
||||||
list.AddRange(blogPosts.Select(bp => _contentManager.BuildDisplay(bp, "Summary")));
|
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) {
|
protected override DriverResult Editor(RecentBlogPostsPart part, dynamic shapeHelper) {
|
||||||
|
@@ -21,9 +21,9 @@ namespace Orchard.Comments.Drivers {
|
|||||||
return Combined(
|
return Combined(
|
||||||
|
|
||||||
ContentShape("Parts_Comments_Count",
|
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",
|
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))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -23,11 +23,11 @@ namespace Orchard.Comments.Drivers {
|
|||||||
|
|
||||||
return Combined(
|
return Combined(
|
||||||
ContentShape("Parts_Comments",
|
ContentShape("Parts_Comments",
|
||||||
() => shapeHelper.Parts_Comments(ContentPart: part)),
|
() => shapeHelper.Parts_Comments()),
|
||||||
ContentShape("Parts_Comments_Count",
|
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",
|
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))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,15 +1,11 @@
|
|||||||
using System;
|
using Orchard.ContentManagement.Drivers;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Web;
|
|
||||||
using Orchard.ContentManagement.Drivers;
|
|
||||||
using Orchard.Core.Containers.Models;
|
using Orchard.Core.Containers.Models;
|
||||||
|
|
||||||
namespace Orchard.Lists.Drivers {
|
namespace Orchard.Lists.Drivers {
|
||||||
public class ContainerPartDriver : ContentPartDriver<ContainerPart>{
|
public class ContainerPartDriver : ContentPartDriver<ContainerPart>{
|
||||||
protected override DriverResult Display(ContainerPart part, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(ContainerPart part, string displayType, dynamic shapeHelper) {
|
||||||
return ContentShape("Parts_Container_Contained_SummaryAdmin",
|
return ContentShape("Parts_Container_Contained_SummaryAdmin",
|
||||||
() => shapeHelper.Parts_Container_Contained_SummaryAdmin(ContentPart: part)
|
() => shapeHelper.Parts_Container_Contained_SummaryAdmin()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -27,11 +27,11 @@ namespace Orchard.Localization.Drivers {
|
|||||||
: part.Id;
|
: part.Id;
|
||||||
return Combined(
|
return Combined(
|
||||||
ContentShape("Parts_Localization_ContentTranslations",
|
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",
|
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",
|
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)))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -42,11 +42,11 @@ namespace Orchard.PublishLater.Drivers {
|
|||||||
protected override DriverResult Display(PublishLaterPart part, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(PublishLaterPart part, string displayType, dynamic shapeHelper) {
|
||||||
return Combined(
|
return Combined(
|
||||||
ContentShape("Parts_PublishLater_Metadata",
|
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",
|
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",
|
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))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -33,7 +33,7 @@ namespace Orchard.Tags.Drivers {
|
|||||||
|
|
||||||
protected override DriverResult Display(TagsPart part, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(TagsPart part, string displayType, dynamic shapeHelper) {
|
||||||
return ContentShape("Parts_Tags_ShowTags",
|
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) {
|
protected override DriverResult Editor(TagsPart part, dynamic shapeHelper) {
|
||||||
|
@@ -16,15 +16,27 @@ namespace Orchard.ContentManagement.Drivers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DriverResult IContentFieldDriver.BuildDisplayShape(BuildDisplayContext context) {
|
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) {
|
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) {
|
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) {
|
void IContentFieldDriver.Importing(ImportContentContext context) {
|
||||||
@@ -75,7 +87,7 @@ namespace Orchard.ContentManagement.Drivers {
|
|||||||
return contentFieldInfo;
|
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 Display(ContentPart part, TField field, string displayType, dynamic shapeHelper) { return null; }
|
||||||
protected virtual DriverResult Editor(ContentPart part, TField field, 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<BuildShapeContext, object> shapeBuilder) {
|
private ContentShapeResult ContentShapeImplementation(string shapeType, string differentiator, Func<BuildShapeContext, object> 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
|
// 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
|
// for fields on dynamic parts the part name is the same as the content type name
|
||||||
|
|
||||||
ShapeMetadata metadata = shape.Metadata;
|
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 shapeType = metadata.Type;
|
||||||
var fieldName = differentiator ?? String.Empty;
|
var fieldName = differentiator ?? String.Empty;
|
||||||
var partName = part != null ? part.PartDefinition.Name : String.Empty;
|
var partName = shape.ContentPart.PartDefinition.Name;
|
||||||
var contentType = part != null ? part.ContentItem.ContentType : String.Empty;
|
var contentType = shape.ContentItem.ContentType;
|
||||||
var dynamicType = string.Equals(partName, contentType, StringComparison.Ordinal);
|
var dynamicType = string.Equals(partName, contentType, StringComparison.Ordinal);
|
||||||
|
|
||||||
// [ShapeType__FieldName] e.g. Fields/Common.Text-Teaser
|
// [ShapeType__FieldName] e.g. Fields/Common.Text-Teaser
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
using Orchard.ContentManagement.Handlers;
|
using Orchard.ContentManagement.Handlers;
|
||||||
using Orchard.ContentManagement.MetaData;
|
using Orchard.ContentManagement.MetaData;
|
||||||
using Orchard.DisplayManagement;
|
using Orchard.DisplayManagement;
|
||||||
@@ -17,17 +18,38 @@ namespace Orchard.ContentManagement.Drivers {
|
|||||||
|
|
||||||
DriverResult IContentPartDriver.BuildDisplay(BuildDisplayContext context) {
|
DriverResult IContentPartDriver.BuildDisplay(BuildDisplayContext context) {
|
||||||
var part = context.ContentItem.As<TContent>();
|
var part = context.ContentItem.As<TContent>();
|
||||||
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) {
|
DriverResult IContentPartDriver.BuildEditor(BuildEditorContext context) {
|
||||||
var part = context.ContentItem.As<TContent>();
|
var part = context.ContentItem.As<TContent>();
|
||||||
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) {
|
DriverResult IContentPartDriver.UpdateEditor(UpdateEditorContext context) {
|
||||||
var part = context.ContentItem.As<TContent>();
|
var part = context.ContentItem.As<TContent>();
|
||||||
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) {
|
void IContentPartDriver.Importing(ImportContentContext context) {
|
||||||
@@ -54,16 +76,16 @@ namespace Orchard.ContentManagement.Drivers {
|
|||||||
Exported(part, context);
|
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 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, dynamic shapeHelper) { return null; }
|
||||||
protected virtual DriverResult Editor(TContent part, IUpdateModel updater, 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 Importing(TContent part, ImportContentContext context) {}
|
||||||
protected virtual void Imported(TContent part, ImportContentContext context) { return; }
|
protected virtual void Imported(TContent part, ImportContentContext context) {}
|
||||||
protected virtual void Exporting(TContent part, ExportContentContext context) { return; }
|
protected virtual void Exporting(TContent part, ExportContentContext context) {}
|
||||||
protected virtual void Exported(TContent part, ExportContentContext context) { return; }
|
protected virtual void Exported(TContent part, ExportContentContext context) {}
|
||||||
|
|
||||||
[Obsolete("Provided while transitioning to factory variations")]
|
[Obsolete("Provided while transitioning to factory variations")]
|
||||||
public ContentShapeResult ContentShape(IShape shape) {
|
public ContentShapeResult ContentShape(IShape shape) {
|
||||||
@@ -79,25 +101,29 @@ namespace Orchard.ContentManagement.Drivers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ContentShapeResult ContentShapeImplementation(string shapeType, Func<BuildShapeContext, object> shapeBuilder) {
|
private ContentShapeResult ContentShapeImplementation(string shapeType, Func<BuildShapeContext, object> 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;
|
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 shapeType = metadata.Type;
|
||||||
var contentType = part != null ? part.ContentItem.ContentType : String.Empty;
|
|
||||||
|
|
||||||
// [ShapeType]__[Id] e.g. Parts/Common.Metadata-42
|
// [ShapeType]__[Id] e.g. Parts/Common.Metadata-42
|
||||||
if ( !string.IsNullOrEmpty(id) ) {
|
metadata.Alternates.Add(shapeType + "__" + ctx.ContentItem.Id.ToString(CultureInfo.InvariantCulture));
|
||||||
metadata.Alternates.Add(shapeType + "__" + id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// [ShapeType]__[ContentType] e.g. Parts/Common.Metadata-BlogPost
|
// [ShapeType]__[ContentType] e.g. Parts/Common.Metadata-BlogPost
|
||||||
if ( !string.IsNullOrEmpty(contentType) ) {
|
metadata.Alternates.Add(shapeType + "__" + ctx.ContentItem.ContentType);
|
||||||
metadata.Alternates.Add(shapeType + "__" + contentType);
|
|
||||||
}
|
|
||||||
|
|
||||||
return shape;
|
return shape;
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +1,14 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using JetBrains.Annotations;
|
|
||||||
using Orchard.ContentManagement.Handlers;
|
using Orchard.ContentManagement.Handlers;
|
||||||
using Orchard.ContentManagement.MetaData;
|
using Orchard.ContentManagement.MetaData;
|
||||||
using Orchard.Logging;
|
using Orchard.Logging;
|
||||||
|
|
||||||
namespace Orchard.ContentManagement.Drivers.Coordinators {
|
namespace Orchard.ContentManagement.Drivers.Coordinators {
|
||||||
[UsedImplicitly]
|
/// <summary>
|
||||||
|
/// 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 <see cref="IContentPartDriver"/> implementations.
|
||||||
|
/// </summary>
|
||||||
public class ContentPartDriverCoordinator : ContentHandlerBase {
|
public class ContentPartDriverCoordinator : ContentHandlerBase {
|
||||||
private readonly IEnumerable<IContentPartDriver> _drivers;
|
private readonly IEnumerable<IContentPartDriver> _drivers;
|
||||||
private readonly IContentDefinitionManager _contentDefinitionManager;
|
private readonly IContentDefinitionManager _contentDefinitionManager;
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
using System;
|
using System;
|
||||||
using Orchard.DisplayManagement;
|
using Orchard.DisplayManagement;
|
||||||
using Orchard.DisplayManagement.Descriptors;
|
using Orchard.DisplayManagement.Descriptors;
|
||||||
using Orchard.DisplayManagement.Descriptors.ShapePlacementStrategy;
|
|
||||||
|
|
||||||
namespace Orchard.ContentManagement.Handlers {
|
namespace Orchard.ContentManagement.Handlers {
|
||||||
public class BuildShapeContext {
|
public class BuildShapeContext {
|
||||||
protected BuildShapeContext(IShape shape, IContent content, string groupId, IShapeFactory shapeFactory) {
|
protected BuildShapeContext(IShape shape, IContent content, string groupId, IShapeFactory shapeFactory) {
|
||||||
Shape = shape;
|
Shape = shape;
|
||||||
|
Content = content;
|
||||||
ContentItem = content.ContentItem;
|
ContentItem = content.ContentItem;
|
||||||
New = shapeFactory;
|
New = shapeFactory;
|
||||||
GroupId = groupId;
|
GroupId = groupId;
|
||||||
@@ -14,7 +14,10 @@ namespace Orchard.ContentManagement.Handlers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public dynamic Shape { get; private set; }
|
public dynamic Shape { get; private set; }
|
||||||
|
public IContent Content { get; private set; }
|
||||||
public ContentItem ContentItem { 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 dynamic New { get; private set; }
|
||||||
public string GroupId { get; private set; }
|
public string GroupId { get; private set; }
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user