From 3a60f63e95b72daf7403b8b5accd46afe11cebff Mon Sep 17 00:00:00 2001 From: loudej Date: Thu, 3 Dec 2009 05:10:35 +0000 Subject: [PATCH] Adding html helper for content item templates. Streamlining. --HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4043017 --- .../Controllers/PageController.cs | 18 +++++--- .../Models/SandboxContentProvider.cs | 10 +--- .../Orchard.Sandbox/Orchard.Sandbox.csproj | 4 +- .../ViewModels/PageEditViewModel.cs | 3 +- .../ViewModels/PageIndexViewModel.cs | 3 +- .../ViewModels/PageShowViewModel.cs | 3 +- ...andboxPageDetail.ascx => SandboxPage.ascx} | 0 ...xPageList.ascx => SandboxPageSummary.ascx} | 6 ++- .../Orchard.Sandbox/Views/Page/Edit.aspx | 15 +----- .../Orchard.Sandbox/Views/Page/Index.aspx | 12 ++--- .../Orchard.Sandbox/Views/Page/Show.aspx | 11 ++--- .../Models/Driver/ContentItemTemplates.cs | 46 +++++++++++++++++++ src/Orchard/Mvc/Html/ContentItemExtensions.cs | 2 +- src/Orchard/Mvc/Html/ItemDisplayExtensions.cs | 17 +++++++ src/Orchard/Mvc/Html/ItemEditorExtensions.cs | 17 +++++++ src/Orchard/Orchard.csproj | 3 ++ 16 files changed, 118 insertions(+), 52 deletions(-) rename src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/{SandboxPageDetail.ascx => SandboxPage.ascx} (100%) rename src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/{SandboxPageList.ascx => SandboxPageSummary.ascx} (68%) create mode 100644 src/Orchard/Models/Driver/ContentItemTemplates.cs create mode 100644 src/Orchard/Mvc/Html/ItemDisplayExtensions.cs create mode 100644 src/Orchard/Mvc/Html/ItemEditorExtensions.cs diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs index a6f07804c..3bc11ade6 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs @@ -32,6 +32,7 @@ namespace Orchard.Sandbox.Controllers { Pages = _contentManager.Query() .OrderBy(x => x.Name) .List() + .Select(x => _contentManager.GetDisplays(x, null, "SummaryList")) }; return View(model); } @@ -39,8 +40,7 @@ namespace Orchard.Sandbox.Controllers { public ActionResult Show(int id) { var page = _contentManager.Get(id); var model = new PageShowViewModel { - Page = page, - ItemView = _contentManager.GetDisplays(page, null, "Detail") + Page = _contentManager.GetDisplays(page, null, "Detail") }; return View(model); } @@ -78,8 +78,10 @@ namespace Orchard.Sandbox.Controllers { return RedirectToAction("show", new { id }); } - var model = new PageEditViewModel { Page = _contentManager.Get(id) }; - model.ItemView = _contentManager.GetEditors(model.Page, null); + var page = _contentManager.Get(id); + var model = new PageEditViewModel { + Page = _contentManager.GetEditors(page, null) + }; return View(model); } @@ -91,9 +93,11 @@ namespace Orchard.Sandbox.Controllers { return RedirectToAction("show", new { id }); } - var model = new PageEditViewModel { Page = _contentManager.Get(id) }; - model.ItemView = _contentManager.UpdateEditors(model.Page, null, this); - if (!TryUpdateModel(model, input.ToValueProvider())) + var page = _contentManager.Get(id); + var model = new PageEditViewModel { + Page = _contentManager.UpdateEditors(page, null, this) + }; + if (!ModelState.IsValid) return View(model); return RedirectToAction("show", new { id }); diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentProvider.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentProvider.cs index 7b4110010..056875790 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentProvider.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentProvider.cs @@ -4,7 +4,6 @@ using Orchard.Core.Common.Models; using Orchard.Data; using Orchard.Models; using Orchard.Models.Driver; -using Orchard.Models.ViewModels; namespace Orchard.Sandbox.Models { public class SandboxContentProvider : ContentProvider { @@ -23,6 +22,7 @@ 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("SandboxPage", "Summary")); OnGetItemMetadata((context, page) => { context.Metadata.DisplayText = page.Record.Name; @@ -44,14 +44,8 @@ namespace Orchard.Sandbox.Models { }); }); - //TODO: helper that glues this for free - include list of known-displaytype prefixes - OnGetDisplays((context, page) => context.ItemView.TemplateName = "SandboxPage" + context.DisplayType); - OnGetEditors((context, page) => context.ItemView.TemplateName = "SandboxPage"); - OnUpdateEditors((context, page) => { - context.Updater.TryUpdateModel((ItemEditorViewModel)context.ItemView, "", null, null); - context.ItemView.TemplateName = "SandboxPage"; - }); + // add settings to site, and simple record-template gui Filters.Add(new ActivatingFilter>("site")); diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj b/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj index 674219e2a..94f1f4242 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj @@ -75,8 +75,8 @@ - - + + diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageEditViewModel.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageEditViewModel.cs index efa4f51bf..2a7022978 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageEditViewModel.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageEditViewModel.cs @@ -6,7 +6,6 @@ using Orchard.Sandbox.Models; namespace Orchard.Sandbox.ViewModels { public class PageEditViewModel : BaseViewModel { - public SandboxPage Page { get; set; } - public ItemEditorViewModel ItemView { get; set; } + public ItemEditorViewModel Page { get; set; } } } diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageIndexViewModel.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageIndexViewModel.cs index 9c6792cbc..5fd9bef8e 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageIndexViewModel.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageIndexViewModel.cs @@ -1,9 +1,10 @@ using System.Collections.Generic; +using Orchard.Models.ViewModels; using Orchard.Mvc.ViewModels; using Orchard.Sandbox.Models; namespace Orchard.Sandbox.ViewModels { public class PageIndexViewModel : BaseViewModel { - public IEnumerable Pages { get; set; } + public IEnumerable> Pages { get; set; } } } diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageShowViewModel.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageShowViewModel.cs index 126def521..642b1f22b 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageShowViewModel.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/ViewModels/PageShowViewModel.cs @@ -4,7 +4,6 @@ using Orchard.Sandbox.Models; namespace Orchard.Sandbox.ViewModels { public class PageShowViewModel : BaseViewModel { - public SandboxPage Page { get; set; } - public ItemDisplayViewModel ItemView { get; set; } + public ItemDisplayViewModel Page { get; set; } } } diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageDetail.ascx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPage.ascx similarity index 100% rename from src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageDetail.ascx rename to src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPage.ascx diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageList.ascx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageSummary.ascx similarity index 68% rename from src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageList.ascx rename to src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageSummary.ascx index 273d6919f..9aea2f49c 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageList.ascx +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageSummary.ascx @@ -1,8 +1,10 @@ <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl>" %> +<%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.Sandbox.Models" %> <%@ Import Namespace="Orchard.Models.ViewModels" %> <%@ Import Namespace="Orchard.Models" %> -

<%=Html.Encode(Model.Item.Record.Name) %>

-<%foreach (var display in Model.Displays) { %> +

<%=Html.ItemDisplayLink(Model.Item) %>

+<%--<%foreach (var display in Model.Displays) { %> <%=Html.DisplayFor(m=>display.Model, display.TemplateName, display.Prefix??"") %> <%} %> +--%> \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Edit.aspx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Edit.aspx index acfee75d1..64ec2764d 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Edit.aspx +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Edit.aspx @@ -23,19 +23,8 @@

Edit Page

<%using (Html.BeginForm()) { %> -
    - <%=Html.EditorFor(m => m.ItemView, Model.ItemView.TemplateName, Model.ItemView.Prefix ?? "")%> - -
  • - - <%--
  • - <%=Html.LabelFor(x => x.Page.Record.Name)%><%=Html.EditorFor(x => x.Page.Record.Name)%>
  • - <%foreach (var x in Model.ItemView.Editors) { %> - <%=Html.EditorFor(m=>x.Model, x.TemplateName, x.Prefix) %> - <%} %> -
  • -
  • --%> -
+ <%=Html.EditorForItem(m=>m.Page) %> + <%} %> diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Show.aspx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Show.aspx index 9f4bbc563..0e616600f 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Show.aspx +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Show.aspx @@ -20,14 +20,9 @@
<% Html.RenderPartial("Messages", Model.Messages); %> - <%=Html.DisplayFor(m => m.ItemView, Model.ItemView.TemplateName, "")%> -<%--

<%=Html.Encode(Model.Page.Record.Name) %>

- <%foreach (var display in Model.ItemView.Displays) { %> - <%=Html.DisplayFor(m=>display.Model, display.TemplateName, display.Prefix) %> - <%} %> -

- <%=Html.ActionLink("Edit this page", "edit", new{Model.Page.ContentItem.Id}, new{}) %>, <%=Html.ActionLink("Return to list", "index") %>

---%>
+ + <%= Html.DisplayForItem(m => m.Page) %> + diff --git a/src/Orchard/Models/Driver/ContentItemTemplates.cs b/src/Orchard/Models/Driver/ContentItemTemplates.cs new file mode 100644 index 000000000..e9eda5cac --- /dev/null +++ b/src/Orchard/Models/Driver/ContentItemTemplates.cs @@ -0,0 +1,46 @@ +using System; +using System.Linq; +using Orchard.Models.ViewModels; + +namespace Orchard.Models.Driver { + public class ContentItemTemplates : TemplateFilterBase where TContent : class, IContent { + private readonly string _templateName; + private readonly string _prefix; + private readonly string[] _displayTypes; + private Action> _updater; + + public ContentItemTemplates(string templateName, params string[] displayTypes) { + _templateName = templateName; + _displayTypes = displayTypes; + _updater = (context, viewModel) => context.Updater.TryUpdateModel(viewModel, "", null, null); + } + + protected override void GetDisplays(GetDisplaysContext context, TContent instance) { + var longestMatch = LongestMatch(context.DisplayType); + context.ItemView.TemplateName = _templateName + longestMatch; + context.ItemView.Prefix = _prefix; + } + + private string LongestMatch(string displayType) { + return _displayTypes.Aggregate("", (best, x) => { + if (displayType.StartsWith(x) && x.Length > best.Length) return x; + return best; + }); + } + + protected override void GetEditors(GetEditorsContext context, TContent instance) { + context.ItemView.TemplateName = _templateName; + context.ItemView.Prefix = _prefix; + } + + protected override void UpdateEditors(UpdateContentContext context, TContent instance) { + _updater(context, (ItemEditorViewModel)context.ItemView); + context.ItemView.TemplateName = _templateName; + context.ItemView.Prefix = _prefix; + } + + public void Updater(Action> updater) { + _updater = updater; + } + } +} \ No newline at end of file diff --git a/src/Orchard/Mvc/Html/ContentItemExtensions.cs b/src/Orchard/Mvc/Html/ContentItemExtensions.cs index 4c86ea195..db481cd90 100644 --- a/src/Orchard/Mvc/Html/ContentItemExtensions.cs +++ b/src/Orchard/Mvc/Html/ContentItemExtensions.cs @@ -20,7 +20,7 @@ namespace Orchard.Mvc.Html { return html.ActionLink( linkText ?? metadata.DisplayText, - Convert.ToString(metadata.DisplayRouteValues["action"]), + Convert.ToString(metadata.DisplayRouteValues["action"]), metadata.DisplayRouteValues); } diff --git a/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs b/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs new file mode 100644 index 000000000..b4b0619ed --- /dev/null +++ b/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs @@ -0,0 +1,17 @@ +using System; +using System.Linq.Expressions; +using System.Web.Mvc; +using System.Web.Mvc.Html; +using Orchard.Models.ViewModels; + +namespace Orchard.Mvc.Html { + public static class ItemDisplayExtensions { + public static MvcHtmlString DisplayForItem(this HtmlHelper html, Expression> expression) where TItemViewModel : ItemDisplayViewModel { + + var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); + var model = (TItemViewModel)metadata.Model; + + return html.DisplayFor(expression, model.TemplateName, model.Prefix ?? ""); + } + } +} \ No newline at end of file diff --git a/src/Orchard/Mvc/Html/ItemEditorExtensions.cs b/src/Orchard/Mvc/Html/ItemEditorExtensions.cs new file mode 100644 index 000000000..563d0ba3f --- /dev/null +++ b/src/Orchard/Mvc/Html/ItemEditorExtensions.cs @@ -0,0 +1,17 @@ +using System; +using System.Linq.Expressions; +using System.Web.Mvc; +using System.Web.Mvc.Html; +using Orchard.Models.ViewModels; + +namespace Orchard.Mvc.Html { + public static class ItemEditorExtensions { + public static MvcHtmlString EditorForItem(this HtmlHelper html, Expression> expression) where TItemViewModel : ItemEditorViewModel { + + var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); + var model = (TItemViewModel)metadata.Model; + + return html.EditorFor(expression, model.TemplateName, model.Prefix ?? ""); + } + } +} \ No newline at end of file diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index 132cf9508..a7394190a 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -134,6 +134,7 @@ + @@ -178,6 +179,8 @@ + +