mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Getting the Main Menu management (IndexPOST) wired up. Manage/create still needs validation.
--HG-- branch : dev
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.Core.Navigation.Drivers;
|
||||
using Orchard.Core.Navigation.Models;
|
||||
using Orchard.Core.Navigation.Services;
|
||||
using Orchard.Core.Navigation.ViewModels;
|
||||
using Orchard.Localization;
|
||||
using Orchard.UI.Navigation;
|
||||
@@ -12,10 +15,12 @@ using MenuItem=Orchard.Core.Navigation.Models.MenuItem;
|
||||
namespace Orchard.Core.Navigation.Controllers {
|
||||
[ValidateInput(false)]
|
||||
public class AdminController : Controller, IUpdateModel {
|
||||
private readonly IMenuService _menuService;
|
||||
private readonly IOrchardServices _services;
|
||||
private readonly INavigationManager _navigationManager;
|
||||
|
||||
public AdminController(IOrchardServices services, INavigationManager navigationManager) {
|
||||
public AdminController(IMenuService menuService, IOrchardServices services, INavigationManager navigationManager) {
|
||||
_menuService = menuService;
|
||||
_services = services;
|
||||
_navigationManager = navigationManager;
|
||||
T = NullLocalizer.Instance;
|
||||
@@ -30,17 +35,43 @@ namespace Orchard.Core.Navigation.Controllers {
|
||||
if (model == null)
|
||||
model = new NavigationManagementViewModel();
|
||||
|
||||
if (model.Menu == null || model.Menu.Count() < 1)
|
||||
model.Menu = _navigationManager.BuildMenu("main");
|
||||
if (model.MenuItemEntries == null || model.MenuItemEntries.Count() < 1)
|
||||
model.MenuItemEntries = _menuService.Get().Select(menuPart => CreateMenuItemEntries(menuPart)).OrderBy(menuPartEntry => menuPartEntry.MenuItem.Position, new PositionComparer()).ToList();
|
||||
|
||||
return View("Index", model);
|
||||
}
|
||||
|
||||
[HttpPost, ActionName("Index")]
|
||||
public ActionResult IndexPOST() {
|
||||
public ActionResult IndexPOST(IList<MenuItemEntry> menuItemEntries) {
|
||||
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
|
||||
return new HttpUnauthorizedResult();
|
||||
|
||||
foreach (var menuItemEntry in menuItemEntries) {
|
||||
MenuPart menuPart = _menuService.Get(menuItemEntry.MenuItemId);
|
||||
|
||||
menuPart.MenuText = menuItemEntry.MenuItem.Text;
|
||||
menuPart.MenuPosition = menuItemEntry.MenuItem.Position;
|
||||
if (menuPart.Is<MenuItem>())
|
||||
menuPart.As<MenuItem>().Url = menuItemEntry.MenuItem.Url;
|
||||
|
||||
_services.ContentManager.UpdateEditorModel(menuPart, this);
|
||||
}
|
||||
|
||||
return RedirectToAction("Index");
|
||||
}
|
||||
|
||||
private static MenuItemEntry CreateMenuItemEntries(MenuPart menuPart) {
|
||||
return new MenuItemEntry {
|
||||
MenuItem = new UI.Navigation.MenuItem {
|
||||
Text = menuPart.MenuText,
|
||||
Position = menuPart.MenuPosition,
|
||||
Url = menuPart.As<MenuItem>().Url
|
||||
},
|
||||
MenuItemId = menuPart.Id
|
||||
};
|
||||
}
|
||||
|
||||
public ActionResult Create() {
|
||||
return RedirectToAction("Index");
|
||||
}
|
||||
|
||||
@@ -49,17 +80,17 @@ namespace Orchard.Core.Navigation.Controllers {
|
||||
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
|
||||
return new HttpUnauthorizedResult();
|
||||
|
||||
var menuItem = _services.ContentManager.New<MenuItem>(MenuItemDriver.ContentType.Name);
|
||||
model.MenuItem = _services.ContentManager.UpdateEditorModel(menuItem, this);
|
||||
var menuPart = _services.ContentManager.New<MenuPart>(MenuItemDriver.ContentType.Name);
|
||||
model.MenuItem = _services.ContentManager.UpdateEditorModel(menuPart, this);
|
||||
|
||||
if (!ModelState.IsValid) {
|
||||
_services.TransactionManager.Cancel();
|
||||
return Index(new NavigationManagementViewModel {NewMenuItem = model});
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(menuItem.As<MenuPart>().MenuPosition))
|
||||
menuItem.As<MenuPart>().MenuPosition = Position.GetNext(_navigationManager.BuildMenu("main"));
|
||||
menuItem.As<MenuPart>().OnMainMenu = true;
|
||||
if (string.IsNullOrEmpty(menuPart.MenuPosition))
|
||||
menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu("main"));
|
||||
menuPart.OnMainMenu = true;
|
||||
|
||||
_services.ContentManager.Create(model.MenuItem.Item.ContentItem);
|
||||
|
||||
@@ -67,8 +98,8 @@ namespace Orchard.Core.Navigation.Controllers {
|
||||
}
|
||||
|
||||
//[ValidateAntiForgeryTokenOrchard, ActionName("Delete")]
|
||||
[HttpPost, ActionName("Delete")]
|
||||
public ActionResult DeletePOST(int menuItemId)
|
||||
[HttpPost]
|
||||
public ActionResult Delete(int menuItemId)
|
||||
{
|
||||
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
|
||||
return new HttpUnauthorizedResult();
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.Core.Navigation.Models;
|
||||
using Orchard.Core.Navigation.Records;
|
||||
@@ -6,7 +7,7 @@ using Orchard.UI.Navigation;
|
||||
using MenuItem=Orchard.Core.Navigation.Models.MenuItem;
|
||||
|
||||
namespace Orchard.Core.Navigation.Services {
|
||||
public class MainMenu : INavigationProvider {
|
||||
public class MainMenu : INavigationProvider, IMenuService {
|
||||
private readonly IContentManager _contentManager;
|
||||
|
||||
public MainMenu(IContentManager contentManager) {
|
||||
@@ -15,6 +16,14 @@ namespace Orchard.Core.Navigation.Services {
|
||||
|
||||
public string MenuName { get { return "main"; } }
|
||||
|
||||
public IEnumerable<MenuPart> Get() {
|
||||
return _contentManager.Query<MenuPart, MenuPartRecord>().Where(x => x.OnMainMenu).List();
|
||||
}
|
||||
|
||||
public MenuPart Get(int menuPartId) {
|
||||
return _contentManager.Get<MenuPart>(menuPartId);
|
||||
}
|
||||
|
||||
public void GetNavigation(NavigationBuilder builder) {
|
||||
IEnumerable<MenuPart> menuParts = _contentManager.Query<MenuPart, MenuPartRecord>().Where(x => x.OnMainMenu).List();
|
||||
foreach (var menuPart in menuParts) {
|
||||
@@ -34,4 +43,9 @@ namespace Orchard.Core.Navigation.Services {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface IMenuService : IDependency {
|
||||
IEnumerable<MenuPart> Get();
|
||||
MenuPart Get(int menuPartId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,6 @@ using Orchard.Mvc.ViewModels;
|
||||
|
||||
namespace Orchard.Core.Navigation.ViewModels {
|
||||
public class CreateMenuItemViewModel : AdminViewModel {
|
||||
public ContentItemViewModel<MenuItem> MenuItem { get; set; }
|
||||
public ContentItemViewModel<MenuPart> MenuItem { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
using Orchard.UI.Navigation;
|
||||
|
||||
namespace Orchard.Core.Navigation.ViewModels {
|
||||
public class MenuItemEntry {
|
||||
public MenuItem MenuItem { get; set; }
|
||||
public int MenuItemId { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,14 @@
|
||||
using Orchard.Mvc.ViewModels;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Orchard.Mvc.ViewModels;
|
||||
|
||||
namespace Orchard.Core.Navigation.ViewModels {
|
||||
public class NavigationManagementViewModel : AdminViewModel {
|
||||
public NavigationManagementViewModel() {
|
||||
MenuItemEntries = Enumerable.Empty<MenuItemEntry>().ToList();
|
||||
}
|
||||
|
||||
public CreateMenuItemViewModel NewMenuItem { get; set; }
|
||||
public IList<MenuItemEntry> MenuItemEntries { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<NavigationManagementViewModel>" %>
|
||||
<%@ Import Namespace="Orchard.ContentManagement"%>
|
||||
<%@ Import Namespace="Orchard.Core.Navigation.Models"%>
|
||||
<%@ Import Namespace="Orchard.Core.Navigation.ViewModels"%><%
|
||||
var menu = Model.Menu.FirstOrDefault(); %>
|
||||
<%@ Import Namespace="Orchard.Core.Navigation.ViewModels"%>
|
||||
<h1><%=Html.TitleForPage(T("Manage Main Menu").ToString())%></h1><%
|
||||
using (Html.BeginFormAntiForgeryPost()) { %>
|
||||
<table class="items">
|
||||
@@ -21,13 +20,16 @@ using (Html.BeginFormAntiForgeryPost()) { %>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><%
|
||||
foreach (var menuItem in menu.Items) { %>
|
||||
var menuPartEntryIndex = 0;
|
||||
foreach (var menuPartEntry in Model.MenuItemEntries) {
|
||||
var i = menuPartEntryIndex; %>
|
||||
<tr>
|
||||
<td><%=Html.TextBox("text", menuItem.Text) %></td>
|
||||
<td><%=Html.TextBox("position", menuItem.Position) %></td>
|
||||
<td><%=Html.TextBox("url", menuItem.Url) %></td>
|
||||
<td><a href="#" class="remove button">delete</a></td>
|
||||
<td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Text) %>" value="<%=menuPartEntry.MenuItem.Text %>" /></td>
|
||||
<td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Position) %>" value="<%=menuPartEntry.MenuItem.Position %>" /></td>
|
||||
<td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Url) %>" value="<%=menuPartEntry.MenuItem.Url %>" /></td>
|
||||
<td><input type="hidden" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItemId) %>" value="<%=menuPartEntry.MenuItemId %>" /><a href="#" class="remove button">delete</a></td>
|
||||
</tr><%
|
||||
++menuPartEntryIndex;
|
||||
} %>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -118,6 +118,7 @@
|
||||
<Compile Include="Navigation\Services\MainMenu.cs" />
|
||||
<Compile Include="Navigation\Filters\MainMenuFilter.cs" />
|
||||
<Compile Include="Navigation\ViewModels\CreateMenuItemViewModel.cs" />
|
||||
<Compile Include="Navigation\ViewModels\MenuItemEntry.cs" />
|
||||
<Compile Include="Navigation\ViewModels\NavigationManagementViewModel.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Scheduling\Records\ScheduledTaskRecord.cs" />
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace Orchard.Utility {
|
||||
var topMenuItem = menuItems.FirstOrDefault();
|
||||
|
||||
if (topMenuItem != null) {
|
||||
var maxMenuItem = topMenuItem.Items.OrderByDescending(mi => mi.Position, new PositionComparer()).FirstOrDefault();
|
||||
var maxMenuItem = topMenuItem.Items.Where(PositionHasMojorNumber).OrderByDescending(mi => mi.Position, new PositionComparer()).FirstOrDefault();
|
||||
var positionParts = maxMenuItem.Position.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries).Where(s => s.Trim() != "");
|
||||
if (positionParts.Count() > 0) {
|
||||
int result;
|
||||
@@ -21,5 +21,11 @@ namespace Orchard.Utility {
|
||||
|
||||
return "1";
|
||||
}
|
||||
|
||||
private static bool PositionHasMojorNumber(MenuItem mi) {
|
||||
int foo;
|
||||
var major = mi.Position.Split('.')[0];
|
||||
return !string.IsNullOrEmpty(major) && int.TryParse(major, out foo);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user