#18797, 18799: Fixing MenuPart and NavigationPart

Work Items: 18797, 18799
This commit is contained in:
Sebastien Ros
2012-07-11 11:23:04 -07:00
parent 09e3d6d4c2
commit e04cba683f
8 changed files with 116 additions and 26 deletions

View File

@@ -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;

View File

@@ -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<MenuPart>()
.Join<ContentMenuItemPartRecord>().Where(x => x.ContentMenuItemRecord == part.ContentItem.Record).List()
ContentMenuItems = _contentManager
.Query<MenuPart>()
.Join<ContentMenuItemPartRecord>()
.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<ContentMenuItemPart>("ContentMenuItem");
menuItem.Content = part.ContentItem;
menuItem.As<MenuPart>().MenuText = model.MenuText;
menuItem.As<MenuPart>().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
menuItem.As<MenuPart>().Menu = menu;
}
}
}
}
return Editor(part, shapeHelper);
}
}
}

View File

@@ -25,16 +25,21 @@ namespace Orchard.Core.Navigation.Handlers {
OnActivated<MenuPart>(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) {

View File

@@ -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

View File

@@ -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<MenuPart> ContentMenuItems { get; set; }
public NavigationPart Part { get; set; }
public IEnumerable<ContentItem> Menus { get; set; }
public string MenuText { get; set; }
public bool AddMenuItem { get; set; }
public int CurrentMenuId { get; set; }
}
}

View File

@@ -9,18 +9,35 @@
<span class="hint">@T("The menu items linking to this content item.")</span>
@if(Model.ContentMenuItems.Any()) {
<ul>
@foreach(var menuPart in Model.ContentMenuItems) {
var menuContentItem = contentManager.Get(menuPart.Menu.Id);
var menuName = Html.ItemDisplayText(menuContentItem).ToString();
<li>
<div><span>@menuPart.MenuText</span> @T("on") <span>@Html.ActionLink(menuName, "Index", "Admin", new { area = "Navigation", menuId = menuContentItem.Id }, new {}) </span></div>
</li>
}
@foreach(var menuPart in Model.ContentMenuItems) {
var menuContentItem = contentManager.Get(menuPart.Menu.Id);
var menuName = Html.ItemDisplayText(menuContentItem).ToString();
<li>
<div><span>@menuPart.MenuText</span> @T("on") <span>@Html.ActionLink(menuName, "Index", "Admin", new { area = "Navigation", menuId = menuContentItem.Id }, new {}) </span></div>
</li>
}
</ul>
}
else {
@T("Not displayed in any menu.")
}
</fieldset>
<fieldset>
@Html.EditorFor(m => m.AddMenuItem)
<label for="@Html.FieldIdFor(m => m.AddMenuItem)" class="forcheckbox">@T("Add on a menu")</label>
<div data-controllerid="@Html.FieldIdFor(m => m.AddMenuItem)">
<select id="@Html.FieldIdFor(m => m.CurrentMenuId)" name="@Html.FieldNameFor(m => m.CurrentMenuId)">
@foreach (ContentItem menu in Model.Menus) {
@Html.SelectOption(Model.CurrentMenuId, menu.Id, Html.ItemDisplayText(menu).ToString())
}
</select>
<span class="hint">@T("Select which menu you want the content item to be added on.")</span>
<label for="MenuText">@T("Menu text")</label>
@Html.TextBoxFor(m => m.MenuText, new { @class = "text-box single-line" })
<span class="hint">@T("The text that should appear in the menu.")</span>
</div>
</fieldset>

View File

@@ -91,9 +91,11 @@ namespace Orchard.Blogs.Commands {
var menu = _menuService.GetMenu(MenuName);
if (menu != null) {
blog.As<MenuPart>().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
blog.As<MenuPart>().MenuText = MenuText;
blog.As<MenuPart>().Menu = menu.ContentItem;
var menuItem = _contentManager.Create<ContentMenuItemPart>("ContentMenuItem");
menuItem.Content = blog;
menuItem.As<MenuPart>().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
menuItem.As<MenuPart>().MenuText = MenuText;
menuItem.As<MenuPart>().Menu = menu;
}
}

View File

@@ -80,9 +80,11 @@ namespace Orchard.Pages.Commands {
var menu = _menuService.GetMenu(MenuName);
if (menu != null) {
page.As<MenuPart>().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
page.As<MenuPart>().MenuText = MenuText;
page.As<MenuPart>().Menu = menu.ContentItem;
var menuItem = _contentManager.Create<ContentMenuItemPart>("ContentMenuItem");
menuItem.Content = page;
menuItem.As<MenuPart>().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
menuItem.As<MenuPart>().MenuText = MenuText;
menuItem.As<MenuPart>().Menu = menu;
}
}