From 7248d34812b9b5db1bd3baf9528cc26ebe219136 Mon Sep 17 00:00:00 2001 From: loudej Date: Thu, 3 Dec 2009 06:30:11 +0000 Subject: [PATCH] rough concept work around some item template zones --HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4043037 --- .../Common/Providers/BodyAspectProvider.cs | 6 +-- .../Models/DebugLinkProvider.cs | 4 +- .../Models/DisplayTemplates/SandboxPage.ascx | 28 ++++++++----- .../Orchard.Sandbox/Views/Page/Edit.aspx | 3 +- .../Orchard.Tags/Models/TagsHandler.cs | 4 +- .../Models/ViewModels/TemplateViewModel.cs | 1 + src/Orchard/Mvc/Html/ItemDisplayExtensions.cs | 42 +++++++++++++++++++ 7 files changed, 69 insertions(+), 19 deletions(-) diff --git a/src/Orchard.Web/Core/Common/Providers/BodyAspectProvider.cs b/src/Orchard.Web/Core/Common/Providers/BodyAspectProvider.cs index 050b53c7b..93f4a5370 100644 --- a/src/Orchard.Web/Core/Common/Providers/BodyAspectProvider.cs +++ b/src/Orchard.Web/Core/Common/Providers/BodyAspectProvider.cs @@ -16,18 +16,18 @@ namespace Orchard.Core.Common.Providers { OnGetDisplays((context, body) => { var model = new BodyDisplayViewModel { BodyAspect = body }; - context.AddDisplay(new TemplateViewModel(model, TemplatePrefix) { TemplateName = TemplateName, Position = "3" }); + context.AddDisplay(new TemplateViewModel(model, TemplatePrefix) { TemplateName = TemplateName, ZoneName = "body" }); }); OnGetEditors((context, body) => { var model = new BodyEditorViewModel { BodyAspect = body, TextEditorTemplate = DefaultTextEditorTemplate }; - context.AddEditor(new TemplateViewModel(model, TemplatePrefix) { TemplateName = TemplateName, Position = "3" }); + context.AddEditor(new TemplateViewModel(model, TemplatePrefix) { TemplateName = TemplateName, ZoneName = "body" }); }); OnUpdateEditors((context, body) => { var model = new BodyEditorViewModel { BodyAspect = body, TextEditorTemplate = DefaultTextEditorTemplate }; context.Updater.TryUpdateModel(model, TemplatePrefix, null, null); - context.AddEditor(new TemplateViewModel(model, TemplatePrefix) { TemplateName = TemplateName, Position = "3" }); + context.AddEditor(new TemplateViewModel(model, TemplatePrefix) { TemplateName = TemplateName, ZoneName = "body" }); }); } } diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Models/DebugLinkProvider.cs b/src/Orchard.Web/Packages/Orchard.DevTools/Models/DebugLinkProvider.cs index e0a8b5408..e2554b7a9 100644 --- a/src/Orchard.Web/Packages/Orchard.DevTools/Models/DebugLinkProvider.cs +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Models/DebugLinkProvider.cs @@ -4,10 +4,10 @@ using Orchard.Models.ViewModels; namespace Orchard.DevTools.Models { public class DebugLinkProvider : ContentProvider { protected override void GetDisplays(GetDisplaysContext context) { - context.AddDisplay(new TemplateViewModel(new ShowDebugLink { ContentItem = context.ContentItem }) { Position = "10" }); + context.AddDisplay(new TemplateViewModel(new ShowDebugLink { ContentItem = context.ContentItem }) { ZoneName = "last", Position = "10" }); } protected override void GetEditors(GetEditorsContext context) { - context.AddEditor(new TemplateViewModel(new ShowDebugLink { ContentItem = context.ContentItem }) { Position = "10" }); + context.AddEditor(new TemplateViewModel(new ShowDebugLink { ContentItem = context.ContentItem }) { ZoneName = "last", Position = "10" }); } } } diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPage.ascx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPage.ascx index 579ea4b88..5b3486427 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPage.ascx +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPage.ascx @@ -1,14 +1,22 @@ <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl>" %> -<%@ Import Namespace="Orchard.Mvc.Html"%> +<%@ 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.DisplayFor(m=>display.Model, display.TemplateName, display.Prefix) %> -<%} %> - -

- <%=Html.ItemEditLink("Edit this page", Model.Item) %>, <%=Html.ActionLink("Return to list", "index") %>

+<%=Html.DisplayZone("before")%> +
+ <%=Html.DisplayZone("first")%> +

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

+ <%=Html.DisplayZone("metatop")%> +
+ <%=Html.DisplayZone("body")%>
+ <%=Html.DisplayZone("metabottom")%> +
+ <%=Html.ItemEditLink("Edit this page", Model.Item) %>, + <%=Html.ActionLink("Return to list", "index") %> + <%=Html.DisplayZone("actions") %>
+ <%=Html.DisplayZonesExcept("last","after") %> + <%=Html.DisplayZone("last")%> +
+<%=Html.DisplayZone("after")%> 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 64ec2764d..8fd178f63 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Edit.aspx +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Edit.aspx @@ -20,8 +20,7 @@
<% Html.RenderPartial("Messages", Model.Messages); %> -

- Edit Page

+

Edit Page

<%using (Html.BeginForm()) { %> <%=Html.EditorForItem(m=>m.Page) %> diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Models/TagsHandler.cs b/src/Orchard.Web/Packages/Orchard.Tags/Models/TagsHandler.cs index 5312f7e96..fab7cfd6e 100644 --- a/src/Orchard.Web/Packages/Orchard.Tags/Models/TagsHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Tags/Models/TagsHandler.cs @@ -27,8 +27,8 @@ namespace Orchard.Tags.Models { Filters.Add(new ActivatingFilter("blogpost")); OnGetDisplays((context, hasTags) => { - context.AddDisplay(new TemplateViewModel(hasTags) { Position = "2", TemplateName = "HasTagsList" }); - context.AddDisplay(new TemplateViewModel(hasTags) { Position = "5" }); + context.AddDisplay(new TemplateViewModel(hasTags) { ZoneName="metatop", Position = "2", TemplateName = "HasTagsList" }); + context.AddDisplay(new TemplateViewModel(hasTags) { ZoneName = "metabottom", Position = "5" }); }); } diff --git a/src/Orchard/Models/ViewModels/TemplateViewModel.cs b/src/Orchard/Models/ViewModels/TemplateViewModel.cs index 7ee49a7b5..6d9beddd0 100644 --- a/src/Orchard/Models/ViewModels/TemplateViewModel.cs +++ b/src/Orchard/Models/ViewModels/TemplateViewModel.cs @@ -15,5 +15,6 @@ public string ZoneName { get; set; } public string Position { get; set; } + public bool WasUsed { get; set; } } } diff --git a/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs b/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs index b4b0619ed..741c6e540 100644 --- a/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs +++ b/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Linq.Expressions; using System.Web.Mvc; using System.Web.Mvc.Html; @@ -13,5 +15,45 @@ namespace Orchard.Mvc.Html { return html.DisplayFor(expression, model.TemplateName, model.Prefix ?? ""); } + + public static MvcHtmlString DisplayZone(this HtmlHelper html, string zoneName) where TModel : ItemDisplayViewModel { + var templates = html.ViewData.Model.Displays.Where(x => x.ZoneName == zoneName && x.WasUsed == false); + return DisplayZoneImplementation(html, templates); + } + + public static MvcHtmlString DisplayZonesAny(this HtmlHelper html) where TModel : ItemDisplayViewModel { + var templates = html.ViewData.Model.Displays.Where(x => x.WasUsed == false); + return DisplayZoneImplementation(html, templates); + } + + public static MvcHtmlString DisplayZones(this HtmlHelper html, params string[] include) where TModel : ItemDisplayViewModel { + var templates = html.ViewData.Model.Displays.Where(x => include.Contains(x.ZoneName) && x.WasUsed == false); + return DisplayZoneImplementation(html, templates); + } + + public static MvcHtmlString DisplayZonesExcept(this HtmlHelper html, params string[] exclude) where TModel : ItemDisplayViewModel { + var templates = html.ViewData.Model.Displays.Where(x => !exclude.Contains(x.ZoneName) && x.WasUsed == false); + return DisplayZoneImplementation(html, templates); + } + + private static MvcHtmlString DisplayZoneImplementation(HtmlHelper html, IEnumerable templates) { + var count = templates.Count(); + if (count == 0) + return null; + + if (count == 1) { + var t = templates.Single(); + t.WasUsed = true; + return html.DisplayFor(m => t.Model, t.TemplateName, t.Prefix ?? ""); + } + + var strings = new List(); + foreach (var template in templates) { + var t = template; + t.WasUsed = true; + strings.Add(html.DisplayFor(m => t.Model, t.TemplateName, t.Prefix ?? "")); + } + return MvcHtmlString.Create(string.Concat(strings.ToArray())); + } } } \ No newline at end of file