diff --git a/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs index f07a9d085..b72c64d25 100644 --- a/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs @@ -1,5 +1,4 @@ -using System; -using JetBrains.Annotations; +using JetBrains.Annotations; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.Core.Navigation.Models; @@ -32,6 +31,12 @@ namespace Orchard.Core.Navigation.Drivers { public Localizer T { get; set; } + protected override string Prefix { + get { + return "MenuPart"; + } + } + protected override DriverResult Editor(MenuPart part, dynamic shapeHelper) { if (!_authorizationService.TryCheckAccess(Permissions.ManageMainMenu, _orchardServices.WorkContext.CurrentUser, part)) return null; diff --git a/src/Orchard.Web/Core/Navigation/Drivers/NavigationPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/NavigationPartDriver.cs index 8fd9850df..92e305b67 100644 --- a/src/Orchard.Web/Core/Navigation/Drivers/NavigationPartDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/NavigationPartDriver.cs @@ -1,8 +1,12 @@ using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.Core.Navigation.Models; +using Orchard.Core.Navigation.Services; using Orchard.Core.Navigation.ViewModels; +using Orchard.Localization; using Orchard.Security; +using Orchard.UI.Navigation; +using Orchard.Utility; namespace Orchard.Core.Navigation.Drivers { @@ -10,14 +14,30 @@ namespace Orchard.Core.Navigation.Drivers { private readonly IAuthorizationService _authorizationService; private readonly IWorkContextAccessor _workContextAccessor; private readonly IContentManager _contentManager; + private readonly IMenuService _menuService; + private readonly INavigationManager _navigationManager; public NavigationPartDriver( IAuthorizationService authorizationService, IWorkContextAccessor workContextAccessor, - IContentManager contentManager) { + IContentManager contentManager, + IMenuService menuService, + INavigationManager navigationManager) { _authorizationService = authorizationService; _workContextAccessor = workContextAccessor; _contentManager = contentManager; + _menuService = menuService; + _navigationManager = navigationManager; + + T = NullLocalizer.Instance; + } + + public Localizer T { get; set; } + + protected override string Prefix { + get { + return "NavigationPart"; + } } protected override DriverResult Editor(NavigationPart part, dynamic shapeHelper) { @@ -28,14 +48,48 @@ namespace Orchard.Core.Navigation.Drivers { return ContentShape("Parts_Navigation_Edit", () => { // loads all menu part of type ContentMenuItem linking to the current content item - var model = new NavigationPartViewModel() { + var model = new NavigationPartViewModel { Part = part, - ContentMenuItems = _contentManager.Query() - .Join().Where(x => x.ContentMenuItemRecord == part.ContentItem.Record).List() + ContentMenuItems = _contentManager + .Query() + .Join() + .Where(x => x.ContentMenuItemRecord == part.ContentItem.Record) + .List(), + Menus = _menuService.GetMenus(), }; return shapeHelper.EditorTemplate(TemplateName: "Parts.Navigation.Edit", Model: model, Prefix: Prefix); }); } + + protected override DriverResult Editor(NavigationPart part, IUpdateModel updater, dynamic shapeHelper) { + var currentUser = _workContextAccessor.GetContext().CurrentUser; + if (!_authorizationService.TryCheckAccess(Permissions.ManageMainMenu, currentUser, part)) + return null; + + var model = new NavigationPartViewModel(); + + if (updater.TryUpdateModel(model, Prefix, null, null)) { + if(model.AddMenuItem) { + if (string.IsNullOrEmpty(model.MenuText)) { + updater.AddModelError("MenuText", T("The MenuText field is required")); + } + else { + var menu = _contentManager.Get(model.CurrentMenuId); + + if(menu != null) { + var menuItem = _contentManager.Create("ContentMenuItem"); + menuItem.Content = part.ContentItem; + + menuItem.As().MenuText = model.MenuText; + menuItem.As().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu)); + menuItem.As().Menu = menu; + } + } + } + } + + return Editor(part, shapeHelper); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Handlers/MenuPartHandler.cs b/src/Orchard.Web/Core/Navigation/Handlers/MenuPartHandler.cs index ac97ff062..479e0e691 100644 --- a/src/Orchard.Web/Core/Navigation/Handlers/MenuPartHandler.cs +++ b/src/Orchard.Web/Core/Navigation/Handlers/MenuPartHandler.cs @@ -25,16 +25,21 @@ namespace Orchard.Core.Navigation.Handlers { OnActivated(PropertySetHandlers); } - protected static void PropertySetHandlers(ActivatedContentContext context, MenuPart menuPart) { + protected void PropertySetHandlers(ActivatedContentContext context, MenuPart menuPart) { menuPart.MenuField.Setter(menu => { - menuPart.Record.MenuId = menu.ContentItem.Id; + if(menu == null || menu.ContentItem == null) { + menuPart.Record.MenuId = 0; + } + else { + menuPart.Record.MenuId = menu.ContentItem.Id; + } + return menu; }); - } - protected void LazyLoadHandlers(MenuPart menuPart) { menuPart.MenuField.Loader(ctx => - _contentManager.Get(menuPart.Record.MenuId, menuPart.IsPublished() ? VersionOptions.Published : VersionOptions.Latest)); + _contentManager.Get(menuPart.Record.MenuId, menuPart.IsPublished() ? VersionOptions.Published : VersionOptions.Latest) + ); } protected override void GetItemMetadata(GetContentItemMetadataContext context) { diff --git a/src/Orchard.Web/Core/Navigation/Migrations.cs b/src/Orchard.Web/Core/Navigation/Migrations.cs index 703829029..78c3b5580 100644 --- a/src/Orchard.Web/Core/Navigation/Migrations.cs +++ b/src/Orchard.Web/Core/Navigation/Migrations.cs @@ -14,7 +14,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")); + ContentDefinitionManager.AlterTypeDefinition("Page", cfg => cfg.WithPart("NavigationPart")); SchemaBuilder.CreateTable("MenuItemPartRecord", table => table diff --git a/src/Orchard.Web/Core/Navigation/ViewModels/NavigationPartViewModel.cs b/src/Orchard.Web/Core/Navigation/ViewModels/NavigationPartViewModel.cs index 17034dd26..3f5a60686 100644 --- a/src/Orchard.Web/Core/Navigation/ViewModels/NavigationPartViewModel.cs +++ b/src/Orchard.Web/Core/Navigation/ViewModels/NavigationPartViewModel.cs @@ -1,9 +1,14 @@ using System.Collections.Generic; +using Orchard.ContentManagement; using Orchard.Core.Navigation.Models; namespace Orchard.Core.Navigation.ViewModels { public class NavigationPartViewModel { public IEnumerable ContentMenuItems { get; set; } public NavigationPart Part { get; set; } + public IEnumerable Menus { get; set; } + public string MenuText { get; set; } + public bool AddMenuItem { get; set; } + public int CurrentMenuId { 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 index d937d7100..795e74a74 100644 --- a/src/Orchard.Web/Core/Navigation/Views/EditorTemplates/Parts.Navigation.Edit.cshtml +++ b/src/Orchard.Web/Core/Navigation/Views/EditorTemplates/Parts.Navigation.Edit.cshtml @@ -9,18 +9,35 @@ @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 {})
    -
  • - } + @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.") } - +
+ @Html.EditorFor(m => m.AddMenuItem) + +
+ + @T("Select which menu you want the content item to be added on.") + + + @Html.TextBoxFor(m => m.MenuText, new { @class = "text-box single-line" }) + @T("The text that should appear in the menu.") +
+ + +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogCommands.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogCommands.cs index 35f880e6b..e68cddf65 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogCommands.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogCommands.cs @@ -91,9 +91,11 @@ namespace Orchard.Blogs.Commands { var menu = _menuService.GetMenu(MenuName); if (menu != null) { - blog.As().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu)); - blog.As().MenuText = MenuText; - blog.As().Menu = menu.ContentItem; + var menuItem = _contentManager.Create("ContentMenuItem"); + menuItem.Content = blog; + menuItem.As().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu)); + menuItem.As().MenuText = MenuText; + menuItem.As().Menu = menu; } } diff --git a/src/Orchard.Web/Modules/Orchard.Pages/Commands/PageCommands.cs b/src/Orchard.Web/Modules/Orchard.Pages/Commands/PageCommands.cs index 57b22cf02..3f438a014 100644 --- a/src/Orchard.Web/Modules/Orchard.Pages/Commands/PageCommands.cs +++ b/src/Orchard.Web/Modules/Orchard.Pages/Commands/PageCommands.cs @@ -80,9 +80,11 @@ namespace Orchard.Pages.Commands { var menu = _menuService.GetMenu(MenuName); if (menu != null) { - page.As().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu)); - page.As().MenuText = MenuText; - page.As().Menu = menu.ContentItem; + var menuItem = _contentManager.Create("ContentMenuItem"); + menuItem.Content = page; + menuItem.As().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu)); + menuItem.As().MenuText = MenuText; + menuItem.As().Menu = menu; } }