From 88457c63b22a832192bbb8ed107b9a04bfb6fdb1 Mon Sep 17 00:00:00 2001 From: loudej Date: Tue, 22 Dec 2009 01:31:55 +0000 Subject: [PATCH] Moving item template support into item driver. Further control moved out of various handlers. --HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4044433 --- .../Models/PartDriverHandlerTests.cs | 8 +- .../Orchard.Blogs/Controllers/BlogDriver.cs | 29 ++++--- .../Controllers/BlogPostDriver.cs | 8 +- .../Orchard.Blogs/Models/BlogHandler.cs | 1 - .../Orchard.Blogs/Models/BlogPostHandler.cs | 2 +- .../Controllers/UserRolesDriver.cs | 4 +- .../Controllers/HomeController.cs | 7 -- .../Controllers/PageController.cs | 5 -- .../Controllers/SandboxPageDriver.cs | 55 +++++++++++++ .../Models/SandboxContentHandler.cs | 28 +------ .../Orchard.Sandbox/Orchard.Sandbox.csproj | 1 + .../Orchard.Tags/Controllers/HasTagsDriver.cs | 42 ++++++++++ .../Packages/Orchard.Tags/Models/HasTags.cs | 14 ++++ .../Orchard.Tags/Models/HasTagsHandler.cs | 36 +++++++++ .../Orchard.Tags/Models/TagsHandler.cs | 77 ------------------- .../Packages/Orchard.Tags/Orchard.Tags.csproj | 9 ++- .../ViewModels/EditTagsViewModel.cs | 5 ++ .../{Tags.HasTags.ascx => Tags.ShowTags.ascx} | 0 .../EditorTemplates/Parts/Tags.EditTags.ascx | 9 +++ .../EditorTemplates/Parts/Tags.HasTags.ascx | 8 -- .../Drivers/AutomaticPartDriver.cs | 6 +- .../ContentManagement/Drivers/DriverResult.cs | 2 +- .../ContentManagement/Drivers/ItemDriver.cs | 76 ++++++++++++++++-- .../Drivers/ItemDriverHandler.cs | 33 ++++++-- .../Drivers/ItemTemplateResult.cs | 61 +++++++++++++++ .../ContentManagement/Drivers/PartDriver.cs | 26 +++---- ...emplateResult.cs => PartTemplateResult.cs} | 8 +- .../ViewModels/ItemDisplayModel.cs | 1 + src/Orchard/Orchard.csproj | 3 +- 29 files changed, 379 insertions(+), 185 deletions(-) create mode 100644 src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/SandboxPageDriver.cs create mode 100644 src/Orchard.Web/Packages/Orchard.Tags/Controllers/HasTagsDriver.cs create mode 100644 src/Orchard.Web/Packages/Orchard.Tags/Models/HasTags.cs create mode 100644 src/Orchard.Web/Packages/Orchard.Tags/Models/HasTagsHandler.cs delete mode 100644 src/Orchard.Web/Packages/Orchard.Tags/Models/TagsHandler.cs create mode 100644 src/Orchard.Web/Packages/Orchard.Tags/ViewModels/EditTagsViewModel.cs rename src/Orchard.Web/Packages/Orchard.Tags/Views/DisplayTemplates/Parts/{Tags.HasTags.ascx => Tags.ShowTags.ascx} (100%) create mode 100644 src/Orchard.Web/Packages/Orchard.Tags/Views/EditorTemplates/Parts/Tags.EditTags.ascx delete mode 100644 src/Orchard.Web/Packages/Orchard.Tags/Views/EditorTemplates/Parts/Tags.HasTags.ascx create mode 100644 src/Orchard/ContentManagement/Drivers/ItemTemplateResult.cs rename src/Orchard/ContentManagement/Drivers/{TemplateResult.cs => PartTemplateResult.cs} (83%) diff --git a/src/Orchard.Tests/Models/PartDriverHandlerTests.cs b/src/Orchard.Tests/Models/PartDriverHandlerTests.cs index 6ae58182c..7f09e9984 100644 --- a/src/Orchard.Tests/Models/PartDriverHandlerTests.cs +++ b/src/Orchard.Tests/Models/PartDriverHandlerTests.cs @@ -75,21 +75,21 @@ namespace Orchard.Tests.Models { protected override DriverResult Display(StubPart part, string displayType) { var viewModel = new StubViewModel { Foo = string.Join(",", part.Foo) }; if (displayType.StartsWith("Summary")) - return PartialView(viewModel, "StubViewModelTerse").Location("topmeta"); + return PartTemplate(viewModel, "StubViewModelTerse").Location("topmeta"); - return PartialView(viewModel).Location("topmeta"); + return PartTemplate(viewModel).Location("topmeta"); } protected override DriverResult Editor(StubPart part) { var viewModel = new StubViewModel { Foo = string.Join(",", part.Foo) }; - return PartialView(viewModel).Location("last", "10"); + return PartTemplate(viewModel).Location("last", "10"); } protected override DriverResult Editor(StubPart part, IUpdateModel updater) { var viewModel = new StubViewModel { Foo = string.Join(",", part.Foo) }; updater.TryUpdateModel(viewModel, Prefix, null, null); part.Foo = viewModel.Foo.Split(new[] { ',' }).Select(x => x.Trim()).ToArray(); - return PartialView(viewModel).Location("last", "10"); + return PartTemplate(viewModel).Location("last", "10"); } } diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogDriver.cs b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogDriver.cs index 6191c4844..37190dcca 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogDriver.cs +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogDriver.cs @@ -14,7 +14,8 @@ namespace Orchard.Blogs.Controllers { private readonly IContentManager _contentManager; private readonly IBlogPostService _blogPostService; - public BlogDriver(IContentManager contentManager, IBlogPostService blogPostService) { + public BlogDriver(IContentManager contentManager, IBlogPostService blogPostService) + : base(Blog.ContentType) { _contentManager = contentManager; _blogPostService = blogPostService; } @@ -44,29 +45,33 @@ namespace Orchard.Blogs.Controllers { } protected override DriverResult Display(Blog blog, string displayType) { - if (!displayType.StartsWith("Detail")) - return null; - var posts = _blogPostService.Get(blog); - - IEnumerable> model; + IEnumerable> blogPosts = null; if (displayType.StartsWith("DetailAdmin")) { - model = posts.Select(bp => _contentManager.BuildDisplayModel(bp, "SummaryAdmin")); + blogPosts = _blogPostService.Get(blog) + .Select(bp => _contentManager.BuildDisplayModel(bp, "SummaryAdmin")); } - else { - model = posts.Select(bp => _contentManager.BuildDisplayModel(bp, "Summary")); + else if (displayType.StartsWith("Detail")) { + blogPosts = _blogPostService.Get(blog) + .Select(bp => _contentManager.BuildDisplayModel(bp, "Summary")); } - return PartialView(model, "Parts/Blogs.BlogPost.List", "").Location("body"); + return Combined( + ItemTemplate("Items/Blogs.Blog").LongestMatch(displayType, "Summary", "DetailAdmin", "SummaryAdmin"), + blogPosts == null ? null : PartTemplate(blogPosts, "Parts/Blogs.BlogPost.List", "").Location("body")); } protected override DriverResult Editor(Blog blog) { - return PartialView(blog, "Parts/Blogs.Blog.Fields").Location("primary", "1"); + return Combined( + ItemTemplate("Items/Blogs.Blog"), + PartTemplate(blog, "Parts/Blogs.Blog.Fields").Location("primary", "1")); } protected override DriverResult Editor(Blog blog, IUpdateModel updater) { updater.TryUpdateModel(blog, Prefix, null, null); - return PartialView(blog, "Parts/Blogs.Blog.Fields").Location("primary", "1"); + return Combined( + ItemTemplate("Items/Blogs.Blog"), + PartTemplate(blog, "Parts/Blogs.Blog.Fields").Location("primary", "1")); } } } diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostDriver.cs b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostDriver.cs index a10814f81..5b786f6ee 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostDriver.cs +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostDriver.cs @@ -11,6 +11,10 @@ using Orchard.ContentManagement.Drivers; namespace Orchard.Blogs.Controllers { [UsedImplicitly] public class BlogPostDriver : ItemDriver { + public BlogPostDriver() + : base(BlogPost.ContentType) { + } + protected override string Prefix { get { return ""; } } protected override string GetDisplayText(BlogPost post) { @@ -39,8 +43,8 @@ namespace Orchard.Blogs.Controllers { protected override DriverResult Editor(BlogPost post) { return Combined( - PartialView(post, "Parts/Blogs.BlogPost.Fields").Location("primary", "1"), - PartialView(post, "Parts/Blogs.BlogPost.Publish").Location("secondary", "1") + PartTemplate(post, "Parts/Blogs.BlogPost.Fields").Location("primary", "1"), + PartTemplate(post, "Parts/Blogs.BlogPost.Publish").Location("secondary", "1") ); } diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogHandler.cs b/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogHandler.cs index 871ee3f37..c73518d23 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogHandler.cs @@ -15,7 +15,6 @@ namespace Orchard.Blogs.Models { Filters.Add(new ActivatingFilter("blog")); Filters.Add(new ActivatingFilter("blog")); Filters.Add(new StorageFilter(repository)); - Filters.Add(new ContentItemTemplates("Items/Blogs.Blog", "Summary DetailAdmin SummaryAdmin")); } } } diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogPostHandler.cs b/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogPostHandler.cs index b23d4a9eb..1358d02a2 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogPostHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogPostHandler.cs @@ -24,7 +24,7 @@ namespace Orchard.Blogs.Models { Filters.Add(new ActivatingFilter("blogpost")); Filters.Add(new ActivatingFilter("blogpost")); Filters.Add(new StorageFilter(repository)); - Filters.Add(new ContentItemTemplates("Items/Blogs.BlogPost", "Summary SummaryAdmin")); + OnCreated((context, bp) => bp.Blog.PostCount++); } diff --git a/src/Orchard.Web/Packages/Orchard.Roles/Controllers/UserRolesDriver.cs b/src/Orchard.Web/Packages/Orchard.Roles/Controllers/UserRolesDriver.cs index 58604c13e..2a760f040 100644 --- a/src/Orchard.Web/Packages/Orchard.Roles/Controllers/UserRolesDriver.cs +++ b/src/Orchard.Web/Packages/Orchard.Roles/Controllers/UserRolesDriver.cs @@ -49,7 +49,7 @@ namespace Orchard.Roles.Controllers { UserRoles = userRoles, Roles = roles.ToList(), }; - return PartialView(model, "Parts/Roles.UserRoles"); + return PartTemplate(model, "Parts/Roles.UserRoles"); } protected override DriverResult Editor(UserRoles userRoles, IUpdateModel updater) { @@ -75,7 +75,7 @@ namespace Orchard.Roles.Controllers { } } - return PartialView(model, "Parts/Roles.UserRoles"); + return PartTemplate(model, "Parts/Roles.UserRoles"); } } } diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/HomeController.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/HomeController.cs index cfa552abf..9c31d280c 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/HomeController.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/HomeController.cs @@ -1,11 +1,4 @@ -using System; -using System.Linq; using System.Web.Mvc; -using Orchard.Data; -using Orchard.ContentManagement; -using Orchard.ContentManagement.Handlers; -using Orchard.Sandbox.Models; -using Orchard.Sandbox.ViewModels; namespace Orchard.Sandbox.Controllers { diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs index b90d8bdcf..4ffa9793d 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs @@ -1,12 +1,7 @@ -using System; using System.Linq; using System.Web.Mvc; -using JetBrains.Annotations; -using Orchard.Core.Common.Models; -using Orchard.Data; using Orchard.Localization; using Orchard.ContentManagement; -using Orchard.ContentManagement.Handlers; using Orchard.Sandbox.Models; using Orchard.Sandbox.ViewModels; using Orchard.Security; diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/SandboxPageDriver.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/SandboxPageDriver.cs new file mode 100644 index 000000000..4e534cdc1 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/SandboxPageDriver.cs @@ -0,0 +1,55 @@ +using System; +using System.Web.Routing; +using JetBrains.Annotations; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.ViewModels; +using Orchard.Sandbox.Models; + +namespace Orchard.Sandbox.Controllers { + [UsedImplicitly] + public class SandboxPageDriver : ItemDriver { + public SandboxPageDriver() + : base(SandboxPage.ContentType) { + } + + protected override string GetDisplayText(SandboxPage item) { + return item.Record.Name; + } + + protected override RouteValueDictionary GetDisplayRouteValues(SandboxPage item) { + return new RouteValueDictionary( + new { + area = "Orchard.Sandbox", + controller = "Page", + action = "Show", + id = item.ContentItem.Id, + }); + } + + protected override RouteValueDictionary GetEditorRouteValues(SandboxPage item) { + return new RouteValueDictionary( + new { + area = "Orchard.Sandbox", + controller = "Page", + action = "Edit", + id = item.ContentItem.Id, + }); + } + + protected override DriverResult Display(SandboxPage part, string displayType) { + return Combined( + ItemTemplate("Items/Sandbox.Page").LongestMatch(displayType, "Summary"), + PartTemplate(part, "Parts/Sandbox.Page.Title").Location("title")); + } + + protected override DriverResult Editor(ItemEditorModel model) { + return ItemTemplate("Items/Sandbox.Page"); + } + + protected override DriverResult Editor(ItemEditorModel model, IUpdateModel updater) { + updater.TryUpdateModel(model, Prefix, null, null); + return ItemTemplate("Items/Sandbox.Page"); + } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentHandler.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentHandler.cs index c5bde8363..9adc53655 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentHandler.cs @@ -1,12 +1,12 @@ using System.Collections.Generic; -using System.Web.Routing; +using JetBrains.Annotations; using Orchard.Core.Common.Models; using Orchard.Data; using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; -using Orchard.ContentManagement.ViewModels; namespace Orchard.Sandbox.Models { + [UsedImplicitly] public class SandboxContentHandler : ContentHandler { public override IEnumerable GetContentTypes() { return new[] { SandboxPage.ContentType }; @@ -22,30 +22,6 @@ namespace Orchard.Sandbox.Models { Filters.Add(new ActivatingFilter(SandboxPage.ContentType.Name)); Filters.Add(new ActivatingFilter(SandboxPage.ContentType.Name)); Filters.Add(new StorageFilter(pageRepository) { AutomaticallyCreateMissingRecord = true }); - Filters.Add(new ContentItemTemplates("Items/Sandbox.Page", "Summary")); - - OnGetItemMetadata((context, page) => { - context.Metadata.DisplayText = page.Record.Name; - context.Metadata.DisplayRouteValues = - new RouteValueDictionary( - new { - area = "Orchard.Sandbox", - controller = "Page", - action = "Show", - id = context.ContentItem.Id, - }); - context.Metadata.EditorRouteValues = - new RouteValueDictionary( - new { - area = "Orchard.Sandbox", - controller = "Page", - action = "Edit", - id = context.ContentItem.Id, - }); - }); - - OnGetDisplayViewModel((context, page) => - context.AddDisplay(new TemplateViewModel(page) { TemplateName = "Parts/Sandbox.Page.Title", ZoneName = "title" })); diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj b/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj index b393540ce..078028a96 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj @@ -63,6 +63,7 @@ + diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HasTagsDriver.cs b/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HasTagsDriver.cs new file mode 100644 index 000000000..c9d7971b6 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HasTagsDriver.cs @@ -0,0 +1,42 @@ +using System.Linq; +using JetBrains.Annotations; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Drivers; +using Orchard.Tags.Helpers; +using Orchard.Tags.Models; +using Orchard.Tags.Services; +using Orchard.Tags.ViewModels; + +namespace Orchard.Tags.Controllers { + + [UsedImplicitly] + public class HasTagsDriver : PartDriver { + private readonly ITagService _tagService; + + public HasTagsDriver(ITagService tagService) { + _tagService = tagService; + } + + protected override DriverResult Display(HasTags part, string displayType) { + return PartTemplate(part, "Parts/Tags.ShowTags").Location("body:above"); + } + + protected override DriverResult Editor(HasTags part) { + var model = new EditTagsViewModel { + Tags = string.Join(", ", part.CurrentTags.Select((t, i) => t.TagName).ToArray()) + }; + return PartTemplate(model, "Parts/Tags.EditTags"); + } + + protected override DriverResult Editor(HasTags part, IUpdateModel updater) { + + var model = new EditTagsViewModel(); + updater.TryUpdateModel(model, Prefix, null, null); + + var tagNames = TagHelpers.ParseCommaSeparatedTagNames(model.Tags); + _tagService.UpdateTagsForContentItem(part.ContentItem.Id, tagNames); + + return PartTemplate(model, "Parts/Tags.EditTags"); + } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Models/HasTags.cs b/src/Orchard.Web/Packages/Orchard.Tags/Models/HasTags.cs new file mode 100644 index 000000000..d73e2d518 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Tags/Models/HasTags.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Orchard.ContentManagement; + +namespace Orchard.Tags.Models { + public class HasTags : ContentPart { + public HasTags() { + AllTags = new List(); + CurrentTags = new List(); + } + + public IList AllTags { get; set; } + public IList CurrentTags { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Models/HasTagsHandler.cs b/src/Orchard.Web/Packages/Orchard.Tags/Models/HasTagsHandler.cs new file mode 100644 index 000000000..57b62b17c --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Tags/Models/HasTagsHandler.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using System.Linq; +using JetBrains.Annotations; +using Orchard.Data; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Handlers; + +namespace Orchard.Tags.Models { + [UsedImplicitly] + public class HasTagsHandler : ContentHandler { + private readonly IRepository _tagsRepository; + private readonly IRepository _tagsContentItemsRepository; + + public HasTagsHandler(IRepository tagsRepository, IRepository tagsContentItemsRepository) { + _tagsRepository = tagsRepository; + _tagsContentItemsRepository = tagsContentItemsRepository; + Filters.Add(new ActivatingFilter("sandboxpage")); + Filters.Add(new ActivatingFilter("blogpost")); + } + + + protected override void Loading(LoadContentContext context) { + if (context.ContentItem.Has() == false) { + return; + } + + HasTags tags = context.ContentItem.Get(); + tags.AllTags = _tagsRepository.Table.ToList(); + IEnumerable tagsContentItems = _tagsContentItemsRepository.Fetch(x => x.ContentItemId == context.ContentItem.Id); + foreach (var tagContentItem in tagsContentItems) { + Tag tag = _tagsRepository.Get(tagContentItem.TagId); + tags.CurrentTags.Add(tag); + } + } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Models/TagsHandler.cs b/src/Orchard.Web/Packages/Orchard.Tags/Models/TagsHandler.cs deleted file mode 100644 index fdbe97294..000000000 --- a/src/Orchard.Web/Packages/Orchard.Tags/Models/TagsHandler.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Orchard.Data; -using Orchard.ContentManagement; -using Orchard.ContentManagement.Handlers; -using Orchard.ContentManagement.ViewModels; -using Orchard.Tags.Helpers; -using Orchard.Tags.Services; - -namespace Orchard.Tags.Models { - public class HasTags : ContentPart { - public HasTags() { - AllTags = new List(); - CurrentTags = new List(); - } - - public IList AllTags { get; set; } - public IList CurrentTags { get; set; } - } - - public class HasTagsHandler : ContentHandler { - private readonly IRepository _tagsRepository; - private readonly IRepository _tagsContentItemsRepository; - private readonly ITagService _tagService; - - public HasTagsHandler(IRepository tagsRepository, IRepository tagsContentItemsRepository, ITagService tagService) { - _tagsRepository = tagsRepository; - _tagsContentItemsRepository = tagsContentItemsRepository; - _tagService = tagService; - Filters.Add(new ActivatingFilter("sandboxpage")); - Filters.Add(new ActivatingFilter("blogpost")); - - OnGetDisplayViewModel((context, hasTags) => { - context.AddDisplay(new TemplateViewModel(hasTags) { TemplateName = "Parts/Tags.HasTags", Position = "6" }); - }); - } - - protected override void BuildEditorModel(BuildEditorModelContext context) { - if (context.ContentItem.Has() == false) { - return; - } - context.AddEditor(new TemplateViewModel(context.ContentItem.Get()) { TemplateName = "Parts/Tags.HasTags", Position = "0" }); - } - - protected override void UpdateEditorModel(UpdateEditorModelContext context) { - if (context.ContentItem.Has() == false) { - return; - } - - TagsViewModel viewModel = new TagsViewModel(); - context.Updater.TryUpdateModel(viewModel, String.Empty, null, null); - List tagNames = TagHelpers.ParseCommaSeparatedTagNames(viewModel.Tags); - _tagService.UpdateTagsForContentItem(context.ContentItem.Id, tagNames); - - context.AddEditor(new TemplateViewModel(context.ContentItem.Get()) { TemplateName = "Parts/Tags.HasTags" }); - } - - protected override void Loading(LoadContentContext context) { - if (context.ContentItem.Has() == false) { - return; - } - - HasTags tags = context.ContentItem.Get(); - tags.AllTags = _tagsRepository.Table.ToList(); - IEnumerable tagsContentItems = _tagsContentItemsRepository.Fetch(x => x.ContentItemId == context.ContentItem.Id); - foreach (var tagContentItem in tagsContentItems) { - Tag tag = _tagsRepository.Get(tagContentItem.TagId); - tags.CurrentTags.Add(tag); - } - } - - public class TagsViewModel { - public string Tags { get; set; } - } - } -} diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Orchard.Tags.csproj b/src/Orchard.Web/Packages/Orchard.Tags/Orchard.Tags.csproj index 7a6a07910..56e9dcf4a 100644 --- a/src/Orchard.Web/Packages/Orchard.Tags/Orchard.Tags.csproj +++ b/src/Orchard.Web/Packages/Orchard.Tags/Orchard.Tags.csproj @@ -63,11 +63,14 @@ + + + - + @@ -87,8 +90,8 @@ - - + + diff --git a/src/Orchard.Web/Packages/Orchard.Tags/ViewModels/EditTagsViewModel.cs b/src/Orchard.Web/Packages/Orchard.Tags/ViewModels/EditTagsViewModel.cs new file mode 100644 index 000000000..dce583ec2 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Tags/ViewModels/EditTagsViewModel.cs @@ -0,0 +1,5 @@ +namespace Orchard.Tags.ViewModels { + public class EditTagsViewModel { + public string Tags { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Views/DisplayTemplates/Parts/Tags.HasTags.ascx b/src/Orchard.Web/Packages/Orchard.Tags/Views/DisplayTemplates/Parts/Tags.ShowTags.ascx similarity index 100% rename from src/Orchard.Web/Packages/Orchard.Tags/Views/DisplayTemplates/Parts/Tags.HasTags.ascx rename to src/Orchard.Web/Packages/Orchard.Tags/Views/DisplayTemplates/Parts/Tags.ShowTags.ascx diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Views/EditorTemplates/Parts/Tags.EditTags.ascx b/src/Orchard.Web/Packages/Orchard.Tags/Views/EditorTemplates/Parts/Tags.EditTags.ascx new file mode 100644 index 000000000..63705d588 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Tags/Views/EditorTemplates/Parts/Tags.EditTags.ascx @@ -0,0 +1,9 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Tags.ViewModels" %> +<%@ Import Namespace="Orchard.Mvc.Html" %> +<%@ Import Namespace="Orchard.Tags.Models" %> +
+ <%=Html.LabelFor(m=>m.Tags) %> + <%=Html.EditorFor(m=>m.Tags) %> +
+<%----%> diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Views/EditorTemplates/Parts/Tags.HasTags.ascx b/src/Orchard.Web/Packages/Orchard.Tags/Views/EditorTemplates/Parts/Tags.HasTags.ascx deleted file mode 100644 index b429bd034..000000000 --- a/src/Orchard.Web/Packages/Orchard.Tags/Views/EditorTemplates/Parts/Tags.HasTags.ascx +++ /dev/null @@ -1,8 +0,0 @@ -<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> -<%@ Import Namespace="Orchard.Mvc.Html"%> -<%@ Import Namespace="Orchard.Tags.Models"%> - - - t.TagName).ToArray()) %>" /> - -<%--<% Html.BeginForm("Update", "Home", new { area = "Orchard.Tags" }); %>--%> \ No newline at end of file diff --git a/src/Orchard/ContentManagement/Drivers/AutomaticPartDriver.cs b/src/Orchard/ContentManagement/Drivers/AutomaticPartDriver.cs index add30bfe8..525a7b742 100644 --- a/src/Orchard/ContentManagement/Drivers/AutomaticPartDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/AutomaticPartDriver.cs @@ -8,14 +8,14 @@ namespace Orchard.ContentManagement.Drivers { } } protected override DriverResult Display(TPart part, string displayType) { - return PartialView(part); + return PartTemplate(part); } protected override DriverResult Editor(TPart part) { - return PartialView(part); + return PartTemplate(part); } protected override DriverResult Editor(TPart part, IUpdateModel updater) { updater.TryUpdateModel(part, Prefix, null, null); - return PartialView(part); + return PartTemplate(part); } } } \ No newline at end of file diff --git a/src/Orchard/ContentManagement/Drivers/DriverResult.cs b/src/Orchard/ContentManagement/Drivers/DriverResult.cs index 1f68bef17..5c2105ab7 100644 --- a/src/Orchard/ContentManagement/Drivers/DriverResult.cs +++ b/src/Orchard/ContentManagement/Drivers/DriverResult.cs @@ -5,4 +5,4 @@ namespace Orchard.ContentManagement.Drivers { public virtual void Apply(BuildDisplayModelContext context) { } public virtual void Apply(BuildEditorModelContext context) { } } -} \ No newline at end of file +} diff --git a/src/Orchard/ContentManagement/Drivers/ItemDriver.cs b/src/Orchard/ContentManagement/Drivers/ItemDriver.cs index 0133da213..d97fa3b0e 100644 --- a/src/Orchard/ContentManagement/Drivers/ItemDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/ItemDriver.cs @@ -1,18 +1,37 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Web.Routing; using Orchard.ContentManagement.Handlers; +using Orchard.ContentManagement.ViewModels; namespace Orchard.ContentManagement.Drivers { public interface IItemDriver : IEvents { + IEnumerable GetContentTypes(); void GetItemMetadata(GetItemMetadataContext context); + + DriverResult BuildDisplayModel(BuildDisplayModelContext context); + DriverResult BuildEditorModel(BuildEditorModelContext context); + DriverResult UpdateEditorModel(UpdateEditorModelContext context); } - public abstract class ItemDriver : PartDriver, IItemDriver where TItemPart : class, IContent { - public void GetItemMetadata(GetItemMetadataContext context) { - var item = context.ContentItem.As(); + public abstract class ItemDriver : PartDriver, IItemDriver where TContent : class, IContent { + private ContentType _contentType; + + public ItemDriver() { + } + + public ItemDriver(ContentType contentType) { + _contentType = contentType; + } + + IEnumerable IItemDriver.GetContentTypes() { + var contentType = GetContentType(); + return contentType != null ? new[] { contentType } : Enumerable.Empty(); + } + + void IItemDriver.GetItemMetadata(GetItemMetadataContext context) { + var item = context.ContentItem.As(); if (item != null) { context.Metadata.DisplayText = GetDisplayText(item) ?? context.Metadata.DisplayText; context.Metadata.DisplayRouteValues = GetDisplayRouteValues(item) ?? context.Metadata.DisplayRouteValues; @@ -20,8 +39,51 @@ namespace Orchard.ContentManagement.Drivers { } } - protected virtual string GetDisplayText(TItemPart item) { return null; } - protected virtual RouteValueDictionary GetDisplayRouteValues(TItemPart item) { return null; } - protected virtual RouteValueDictionary GetEditorRouteValues(TItemPart item) { return null; } + DriverResult IItemDriver.BuildDisplayModel(BuildDisplayModelContext context) { + var part = context.ContentItem.As(); + if (part == null) { + return null; + } + if (context.DisplayModel.GetType() != typeof(ItemDisplayModel)) { + return Display(new ItemDisplayModel(context.DisplayModel), context.DisplayType); + } + return Display((ItemDisplayModel)context.DisplayModel, context.DisplayType); + } + + DriverResult IItemDriver.BuildEditorModel(BuildEditorModelContext context) { + var part = context.ContentItem.As(); + if (part == null) { + return null; + } + if (context.EditorModel.GetType() != typeof(ItemEditorModel)) { + return Editor(new ItemEditorModel(context.EditorModel)); + } + return Editor((ItemEditorModel)context.EditorModel); + } + + DriverResult IItemDriver.UpdateEditorModel(UpdateEditorModelContext context) { + var part = context.ContentItem.As(); + if (part == null) { + return null; + } + if (context.EditorModel.GetType() != typeof(ItemEditorModel)) { + return Editor(new ItemEditorModel(context.EditorModel), context.Updater); + } + return Editor((ItemEditorModel)context.EditorModel, context.Updater); + } + + protected virtual ContentType GetContentType() { return _contentType; } + protected virtual string GetDisplayText(TContent item) { return null; } + protected virtual RouteValueDictionary GetDisplayRouteValues(TContent item) { return null; } + protected virtual RouteValueDictionary GetEditorRouteValues(TContent item) { return null; } + + protected virtual DriverResult Display(ItemDisplayModel displayModel, string displayType) { return null; } + protected virtual DriverResult Editor(ItemEditorModel editorModel) { return null; } + protected virtual DriverResult Editor(ItemEditorModel editorModel, IUpdateModel updater) { return null; } + + public ItemTemplateResult ItemTemplate(string templateName) { + return new ItemTemplateResult(templateName); + } + } } diff --git a/src/Orchard/ContentManagement/Drivers/ItemDriverHandler.cs b/src/Orchard/ContentManagement/Drivers/ItemDriverHandler.cs index b75d8b229..c1a491ba8 100644 --- a/src/Orchard/ContentManagement/Drivers/ItemDriverHandler.cs +++ b/src/Orchard/ContentManagement/Drivers/ItemDriverHandler.cs @@ -18,8 +18,10 @@ namespace Orchard.ContentManagement.Drivers { public ILogger Logger { get; set; } - System.Collections.Generic.IEnumerable IContentHandler.GetContentTypes() { - return Enumerable.Empty(); + IEnumerable IContentHandler.GetContentTypes() { + var contentTypes = new List(); + _drivers.Invoke(driver=>contentTypes.AddRange(driver.GetContentTypes()), Logger); + return contentTypes; } void IContentHandler.Activating(ActivatingContentContext context) { } @@ -35,17 +37,32 @@ namespace Orchard.ContentManagement.Drivers { void IContentHandler.Loaded(LoadContentContext context) { } void IContentHandler.GetItemMetadata(GetItemMetadataContext context) { + _drivers.Invoke(driver => driver.GetItemMetadata(context), Logger); + } + + void IContentHandler.BuildDisplayModel(BuildDisplayModelContext context) { _drivers.Invoke(driver => { - driver.GetItemMetadata(context); + var result = driver.BuildDisplayModel(context); + if (result != null) + result.Apply(context); }, Logger); } - void IContentHandler.BuildDisplayModel(BuildDisplayModelContext context) { } - - void IContentHandler.BuildEditorModel(BuildEditorModelContext context) { } - - void IContentHandler.UpdateEditorModel(UpdateEditorModelContext context) { } + void IContentHandler.BuildEditorModel(BuildEditorModelContext context) { + _drivers.Invoke(driver => { + var result = driver.BuildEditorModel(context); + if (result != null) + result.Apply(context); + }, Logger); + } + void IContentHandler.UpdateEditorModel(UpdateEditorModelContext context) { + _drivers.Invoke(driver => { + var result = driver.UpdateEditorModel(context); + if (result != null) + result.Apply(context); + }, Logger); + } } } diff --git a/src/Orchard/ContentManagement/Drivers/ItemTemplateResult.cs b/src/Orchard/ContentManagement/Drivers/ItemTemplateResult.cs new file mode 100644 index 000000000..6833e756c --- /dev/null +++ b/src/Orchard/ContentManagement/Drivers/ItemTemplateResult.cs @@ -0,0 +1,61 @@ +using System; +using System.Linq; +using System.Web.Mvc; +using Orchard.ContentManagement.Handlers; +using Orchard.ContentManagement.ViewModels; + +namespace Orchard.ContentManagement.Drivers { + public class ItemTemplateResult : DriverResult where TContent : class, IContent { + public ItemTemplateResult(string templateName) { + TemplateName = templateName; + } + + public string TemplateName { get; set; } + + public override void Apply(BuildDisplayModelContext context) { + context.DisplayModel.TemplateName = TemplateName; + if (context.DisplayModel.GetType() != typeof(ItemDisplayModel)) { + context.DisplayModel.Adaptor = (html, viewModel) => { + return new HtmlHelper>( + html.ViewContext, + new ViewDataContainer { ViewData = new ViewDataDictionary(new ItemDisplayModel(viewModel)) }, + html.RouteCollection); + }; + } + } + + public override void Apply(BuildEditorModelContext context) { + context.EditorModel.TemplateName = TemplateName; + if (context.EditorModel.GetType() != typeof(ItemEditorModel)) { + context.EditorModel.Adaptor = (html, viewModel) => { + return new HtmlHelper>( + html.ViewContext, + new ViewDataContainer { ViewData = new ViewDataDictionary(new ItemEditorModel(viewModel)) }, + html.RouteCollection); + }; + } + } + + + class ViewDataContainer : IViewDataContainer { + public ViewDataDictionary ViewData { get; set; } + } + + public ItemTemplateResult LongestMatch(string displayType, params string[] knownDisplayTypes) { + + if (string.IsNullOrEmpty(displayType)) + return this; + + var longest = knownDisplayTypes.Aggregate("", (best, x) => { + if (displayType.StartsWith(x) && x.Length > best.Length) return x; + return best; + }); + + if (string.IsNullOrEmpty(longest)) + return this; + + TemplateName += "." + longest; + return this; + } + } +} \ No newline at end of file diff --git a/src/Orchard/ContentManagement/Drivers/PartDriver.cs b/src/Orchard/ContentManagement/Drivers/PartDriver.cs index 5bfe4374c..79567c8ff 100644 --- a/src/Orchard/ContentManagement/Drivers/PartDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/PartDriver.cs @@ -8,39 +8,39 @@ namespace Orchard.ContentManagement.Drivers { DriverResult UpdateEditorModel(UpdateEditorModelContext context); } - public abstract class PartDriver : IPartDriver where TPart : class, IContent { + public abstract class PartDriver : IPartDriver where TContent : class, IContent { protected virtual string Prefix { get { return ""; } } protected virtual string Zone { get { return "body"; } } DriverResult IPartDriver.BuildDisplayModel(BuildDisplayModelContext context) { - var part = context.ContentItem.As(); + var part = context.ContentItem.As(); return part == null ? null : Display(part, context.DisplayType); } DriverResult IPartDriver.BuildEditorModel(BuildEditorModelContext context) { - var part = context.ContentItem.As(); + var part = context.ContentItem.As(); return part == null ? null : Editor(part); } DriverResult IPartDriver.UpdateEditorModel(UpdateEditorModelContext context) { - var part = context.ContentItem.As(); + var part = context.ContentItem.As(); return part == null ? null : Editor(part, context.Updater); } - protected virtual DriverResult Display(TPart part, string displayType) {return null;} - protected virtual DriverResult Editor(TPart part) {return null;} - protected virtual DriverResult Editor(TPart part, IUpdateModel updater) {return null;} + protected virtual DriverResult Display(TContent part, string displayType) {return null;} + protected virtual DriverResult Editor(TContent part) {return null;} + protected virtual DriverResult Editor(TContent part, IUpdateModel updater) {return null;} - public TemplateResult PartialView(object model) { - return new TemplateResult(model, null, Prefix).Location(Zone); + public PartTemplateResult PartTemplate(object model) { + return new PartTemplateResult(model, null, Prefix).Location(Zone); } - public TemplateResult PartialView(object model, string template) { - return new TemplateResult(model, template, Prefix).Location(Zone); + public PartTemplateResult PartTemplate(object model, string template) { + return new PartTemplateResult(model, template, Prefix).Location(Zone); } - public TemplateResult PartialView(object model, string template, string prefix) { - return new TemplateResult(model, template, prefix).Location(Zone); + public PartTemplateResult PartTemplate(object model, string template, string prefix) { + return new PartTemplateResult(model, template, prefix).Location(Zone); } public CombinedResult Combined(params DriverResult[] results) { return new CombinedResult(results); diff --git a/src/Orchard/ContentManagement/Drivers/TemplateResult.cs b/src/Orchard/ContentManagement/Drivers/PartTemplateResult.cs similarity index 83% rename from src/Orchard/ContentManagement/Drivers/TemplateResult.cs rename to src/Orchard/ContentManagement/Drivers/PartTemplateResult.cs index b14531002..a1b647ee2 100644 --- a/src/Orchard/ContentManagement/Drivers/TemplateResult.cs +++ b/src/Orchard/ContentManagement/Drivers/PartTemplateResult.cs @@ -2,14 +2,14 @@ using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.ViewModels; namespace Orchard.ContentManagement.Drivers { - public class TemplateResult : DriverResult { + public class PartTemplateResult : DriverResult { public object Model { get; set; } public string TemplateName { get; set; } public string Prefix { get; set; } public string Zone { get; set; } public string Position { get; set; } - public TemplateResult(object model, string templateName, string prefix) { + public PartTemplateResult(object model, string templateName, string prefix) { Model = model; TemplateName = templateName; Prefix = prefix; @@ -31,12 +31,12 @@ namespace Orchard.ContentManagement.Drivers { }); } - public TemplateResult Location(string zone) { + public PartTemplateResult Location(string zone) { Zone = zone; return this; } - public TemplateResult Location(string zone, string position) { + public PartTemplateResult Location(string zone, string position) { Zone = zone; Position = position; return this; diff --git a/src/Orchard/ContentManagement/ViewModels/ItemDisplayModel.cs b/src/Orchard/ContentManagement/ViewModels/ItemDisplayModel.cs index 2f8f12cf7..fce508730 100644 --- a/src/Orchard/ContentManagement/ViewModels/ItemDisplayModel.cs +++ b/src/Orchard/ContentManagement/ViewModels/ItemDisplayModel.cs @@ -43,6 +43,7 @@ namespace Orchard.ContentManagement.ViewModels { public ItemDisplayModel() { } + public ItemDisplayModel(ItemDisplayModel displayModel) : base(displayModel) { } diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index 05ec85ad3..31f87284d 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -137,8 +137,9 @@ + - +