From 1e648699559292fcdb5047357dd33cdd9a44a6b4 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 1 Jun 2012 17:30:06 -0700 Subject: [PATCH] Adding NavigationPart to display the menus a content item is on --HG-- branch : 1.x --- .hgsubstate | 2 +- .../Navigation/Drivers/MenuItemPartDriver.cs | 4 ++ .../Drivers/NavigationPartDriver.cs | 41 +++++++++++++++++++ src/Orchard.Web/Core/Navigation/Migrations.cs | 5 ++- .../Core/Navigation/Models/NavigationPart.cs | 9 ++++ .../Core/Navigation/Placement.info | 1 + .../ViewModels/NavigationPartViewModel.cs | 9 ++++ .../Parts.Navigation.Edit.cshtml | 26 ++++++++++++ src/Orchard.Web/Core/Orchard.Core.csproj | 6 +++ 9 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 src/Orchard.Web/Core/Navigation/Drivers/NavigationPartDriver.cs create mode 100644 src/Orchard.Web/Core/Navigation/Models/NavigationPart.cs create mode 100644 src/Orchard.Web/Core/Navigation/ViewModels/NavigationPartViewModel.cs create mode 100644 src/Orchard.Web/Core/Navigation/Views/EditorTemplates/Parts.Navigation.Edit.cshtml diff --git a/.hgsubstate b/.hgsubstate index 9e6557632..080ea7d78 100644 --- a/.hgsubstate +++ b/.hgsubstate @@ -9,4 +9,4 @@ cfc264d41c1d299c104d76c5032d8ffee3047dcd src/Orchard.Web/Modules/Orchard.Rules f6fecd1702066225a84a482ac029e3e6daff38f3 src/Orchard.Web/Modules/Orchard.ViewPermissions 4ed51e0e76c2aacc2de90ce9984fd00cfdfae2ce src/orchard.web/Modules/Orchard.Alias 29857523c5275b8566ee3a6f4ba2a3d641e7fa0c src/orchard.web/Modules/Orchard.Projections -e8d6ad7df228083093e57d5b5d489a949bd68cfb src/orchard.web/modules/Orchard.Fields +279e1454557e7c36b3c0d87d6dc9b3b553511dd7 src/orchard.web/modules/Orchard.Fields diff --git a/src/Orchard.Web/Core/Navigation/Drivers/MenuItemPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/MenuItemPartDriver.cs index 84bdc1da0..134e93a24 100644 --- a/src/Orchard.Web/Core/Navigation/Drivers/MenuItemPartDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/MenuItemPartDriver.cs @@ -16,6 +16,10 @@ namespace Orchard.Core.Navigation.Drivers { } protected override DriverResult Editor(MenuItemPart part, dynamic shapeHelper) { + var currentUser = _workContextAccessor.GetContext().CurrentUser; + if (!_authorizationService.TryCheckAccess(Permissions.ManageMainMenu, currentUser, part)) + return null; + return ContentShape("Parts_MenuItem_Edit", () => shapeHelper.EditorTemplate(TemplateName: "Parts.MenuItem.Edit", Model: part, Prefix: Prefix)); } diff --git a/src/Orchard.Web/Core/Navigation/Drivers/NavigationPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/NavigationPartDriver.cs new file mode 100644 index 000000000..8fd9850df --- /dev/null +++ b/src/Orchard.Web/Core/Navigation/Drivers/NavigationPartDriver.cs @@ -0,0 +1,41 @@ +using Orchard.ContentManagement; +using Orchard.ContentManagement.Drivers; +using Orchard.Core.Navigation.Models; +using Orchard.Core.Navigation.ViewModels; +using Orchard.Security; + +namespace Orchard.Core.Navigation.Drivers { + + public class NavigationPartDriver : ContentPartDriver { + private readonly IAuthorizationService _authorizationService; + private readonly IWorkContextAccessor _workContextAccessor; + private readonly IContentManager _contentManager; + + public NavigationPartDriver( + IAuthorizationService authorizationService, + IWorkContextAccessor workContextAccessor, + IContentManager contentManager) { + _authorizationService = authorizationService; + _workContextAccessor = workContextAccessor; + _contentManager = contentManager; + } + + protected override DriverResult Editor(NavigationPart part, dynamic shapeHelper) { + var currentUser = _workContextAccessor.GetContext().CurrentUser; + if (!_authorizationService.TryCheckAccess(Permissions.ManageMainMenu, currentUser, part)) + return null; + + return ContentShape("Parts_Navigation_Edit", + () => { + // loads all menu part of type ContentMenuItem linking to the current content item + var model = new NavigationPartViewModel() { + Part = part, + ContentMenuItems = _contentManager.Query() + .Join().Where(x => x.ContentMenuItemRecord == part.ContentItem.Record).List() + }; + + return shapeHelper.EditorTemplate(TemplateName: "Parts.Navigation.Edit", Model: model, Prefix: Prefix); + }); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Migrations.cs b/src/Orchard.Web/Core/Navigation/Migrations.cs index 691dd9fba..f4c360130 100644 --- a/src/Orchard.Web/Core/Navigation/Migrations.cs +++ b/src/Orchard.Web/Core/Navigation/Migrations.cs @@ -7,6 +7,7 @@ namespace Orchard.Core.Navigation { public int Create() { ContentDefinitionManager.AlterPartDefinition("MenuPart", builder => builder.Attachable()); + ContentDefinitionManager.AlterPartDefinition("NavigationPart", builder => builder.Attachable()); ContentDefinitionManager.AlterTypeDefinition("Page", cfg => cfg.WithPart("MenuPart")); SchemaBuilder.CreateTable("MenuItemPartRecord", @@ -138,7 +139,7 @@ namespace Orchard.Core.Navigation { ; ContentDefinitionManager.AlterTypeDefinition("HtmlMenuItem", cfg => cfg - .WithPart("MenuPart") + .WithPart("MenuPart") .WithPart("BodyPart") .WithPart("CommonPart") .DisplayedAs("Html Menu Item") @@ -147,6 +148,8 @@ namespace Orchard.Core.Navigation { .WithSetting("Stereotype", "MenuItem") ); + ContentDefinitionManager.AlterPartDefinition("NavigationPart", builder => builder.Attachable()); + return 3; } } diff --git a/src/Orchard.Web/Core/Navigation/Models/NavigationPart.cs b/src/Orchard.Web/Core/Navigation/Models/NavigationPart.cs new file mode 100644 index 000000000..b1fddfc11 --- /dev/null +++ b/src/Orchard.Web/Core/Navigation/Models/NavigationPart.cs @@ -0,0 +1,9 @@ +using Orchard.ContentManagement; + +namespace Orchard.Core.Navigation.Models { + /// + /// Allows the management of Content Menu Items associated with a Content Item + /// + public class NavigationPart : ContentPart { + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Placement.info b/src/Orchard.Web/Core/Navigation/Placement.info index 4f6a565e7..ee35a0b4b 100644 --- a/src/Orchard.Web/Core/Navigation/Placement.info +++ b/src/Orchard.Web/Core/Navigation/Placement.info @@ -1,6 +1,7 @@  + diff --git a/src/Orchard.Web/Core/Navigation/ViewModels/NavigationPartViewModel.cs b/src/Orchard.Web/Core/Navigation/ViewModels/NavigationPartViewModel.cs new file mode 100644 index 000000000..17034dd26 --- /dev/null +++ b/src/Orchard.Web/Core/Navigation/ViewModels/NavigationPartViewModel.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; +using Orchard.Core.Navigation.Models; + +namespace Orchard.Core.Navigation.ViewModels { + public class NavigationPartViewModel { + public IEnumerable ContentMenuItems { get; set; } + public NavigationPart Part { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Views/EditorTemplates/Parts.Navigation.Edit.cshtml b/src/Orchard.Web/Core/Navigation/Views/EditorTemplates/Parts.Navigation.Edit.cshtml new file mode 100644 index 000000000..d937d7100 --- /dev/null +++ b/src/Orchard.Web/Core/Navigation/Views/EditorTemplates/Parts.Navigation.Edit.cshtml @@ -0,0 +1,26 @@ +@model Orchard.Core.Navigation.ViewModels.NavigationPartViewModel +@using Orchard.ContentManagement + +@{ + var contentManager = WorkContext.Resolve(); +} +
+ + @T("The menu items linking to this content item.") + @if(Model.ContentMenuItems.Any()) { +
    + @foreach(var menuPart in Model.ContentMenuItems) { + var menuContentItem = contentManager.Get(menuPart.Menu.Id); + var menuName = Html.ItemDisplayText(menuContentItem).ToString(); +
  • +
    @menuPart.MenuText @T("on") @Html.ActionLink(menuName, "Index", "Admin", new { area = "Navigation", menuId = menuContentItem.Id }, new {})
    +
  • + } +
+ } + else { + @T("Not displayed in any menu.") + } + + +
diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 5afbb274e..15db472d0 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -131,6 +131,7 @@ + @@ -140,6 +141,7 @@ + @@ -150,6 +152,7 @@ + @@ -538,6 +541,9 @@ + + +