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 System.Web.Mvc;
|
||||||
using Orchard.ContentManagement;
|
using Orchard.ContentManagement;
|
||||||
using Orchard.Core.Navigation.Drivers;
|
using Orchard.Core.Navigation.Drivers;
|
||||||
using Orchard.Core.Navigation.Models;
|
using Orchard.Core.Navigation.Models;
|
||||||
|
using Orchard.Core.Navigation.Services;
|
||||||
using Orchard.Core.Navigation.ViewModels;
|
using Orchard.Core.Navigation.ViewModels;
|
||||||
using Orchard.Localization;
|
using Orchard.Localization;
|
||||||
using Orchard.UI.Navigation;
|
using Orchard.UI.Navigation;
|
||||||
@@ -12,10 +15,12 @@ using MenuItem=Orchard.Core.Navigation.Models.MenuItem;
|
|||||||
namespace Orchard.Core.Navigation.Controllers {
|
namespace Orchard.Core.Navigation.Controllers {
|
||||||
[ValidateInput(false)]
|
[ValidateInput(false)]
|
||||||
public class AdminController : Controller, IUpdateModel {
|
public class AdminController : Controller, IUpdateModel {
|
||||||
|
private readonly IMenuService _menuService;
|
||||||
private readonly IOrchardServices _services;
|
private readonly IOrchardServices _services;
|
||||||
private readonly INavigationManager _navigationManager;
|
private readonly INavigationManager _navigationManager;
|
||||||
|
|
||||||
public AdminController(IOrchardServices services, INavigationManager navigationManager) {
|
public AdminController(IMenuService menuService, IOrchardServices services, INavigationManager navigationManager) {
|
||||||
|
_menuService = menuService;
|
||||||
_services = services;
|
_services = services;
|
||||||
_navigationManager = navigationManager;
|
_navigationManager = navigationManager;
|
||||||
T = NullLocalizer.Instance;
|
T = NullLocalizer.Instance;
|
||||||
@@ -30,17 +35,43 @@ namespace Orchard.Core.Navigation.Controllers {
|
|||||||
if (model == null)
|
if (model == null)
|
||||||
model = new NavigationManagementViewModel();
|
model = new NavigationManagementViewModel();
|
||||||
|
|
||||||
if (model.Menu == null || model.Menu.Count() < 1)
|
if (model.MenuItemEntries == null || model.MenuItemEntries.Count() < 1)
|
||||||
model.Menu = _navigationManager.BuildMenu("main");
|
model.MenuItemEntries = _menuService.Get().Select(menuPart => CreateMenuItemEntries(menuPart)).OrderBy(menuPartEntry => menuPartEntry.MenuItem.Position, new PositionComparer()).ToList();
|
||||||
|
|
||||||
return View("Index", model);
|
return View("Index", model);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost, ActionName("Index")]
|
[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")))
|
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
|
||||||
return new HttpUnauthorizedResult();
|
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");
|
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")))
|
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
|
||||||
return new HttpUnauthorizedResult();
|
return new HttpUnauthorizedResult();
|
||||||
|
|
||||||
var menuItem = _services.ContentManager.New<MenuItem>(MenuItemDriver.ContentType.Name);
|
var menuPart = _services.ContentManager.New<MenuPart>(MenuItemDriver.ContentType.Name);
|
||||||
model.MenuItem = _services.ContentManager.UpdateEditorModel(menuItem, this);
|
model.MenuItem = _services.ContentManager.UpdateEditorModel(menuPart, this);
|
||||||
|
|
||||||
if (!ModelState.IsValid) {
|
if (!ModelState.IsValid) {
|
||||||
_services.TransactionManager.Cancel();
|
_services.TransactionManager.Cancel();
|
||||||
return Index(new NavigationManagementViewModel {NewMenuItem = model});
|
return Index(new NavigationManagementViewModel {NewMenuItem = model});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(menuItem.As<MenuPart>().MenuPosition))
|
if (string.IsNullOrEmpty(menuPart.MenuPosition))
|
||||||
menuItem.As<MenuPart>().MenuPosition = Position.GetNext(_navigationManager.BuildMenu("main"));
|
menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu("main"));
|
||||||
menuItem.As<MenuPart>().OnMainMenu = true;
|
menuPart.OnMainMenu = true;
|
||||||
|
|
||||||
_services.ContentManager.Create(model.MenuItem.Item.ContentItem);
|
_services.ContentManager.Create(model.MenuItem.Item.ContentItem);
|
||||||
|
|
||||||
@@ -67,8 +98,8 @@ namespace Orchard.Core.Navigation.Controllers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//[ValidateAntiForgeryTokenOrchard, ActionName("Delete")]
|
//[ValidateAntiForgeryTokenOrchard, ActionName("Delete")]
|
||||||
[HttpPost, ActionName("Delete")]
|
[HttpPost]
|
||||||
public ActionResult DeletePOST(int menuItemId)
|
public ActionResult Delete(int menuItemId)
|
||||||
{
|
{
|
||||||
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
|
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
|
||||||
return new HttpUnauthorizedResult();
|
return new HttpUnauthorizedResult();
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using Orchard.ContentManagement;
|
using Orchard.ContentManagement;
|
||||||
using Orchard.Core.Navigation.Models;
|
using Orchard.Core.Navigation.Models;
|
||||||
using Orchard.Core.Navigation.Records;
|
using Orchard.Core.Navigation.Records;
|
||||||
@@ -6,7 +7,7 @@ using Orchard.UI.Navigation;
|
|||||||
using MenuItem=Orchard.Core.Navigation.Models.MenuItem;
|
using MenuItem=Orchard.Core.Navigation.Models.MenuItem;
|
||||||
|
|
||||||
namespace Orchard.Core.Navigation.Services {
|
namespace Orchard.Core.Navigation.Services {
|
||||||
public class MainMenu : INavigationProvider {
|
public class MainMenu : INavigationProvider, IMenuService {
|
||||||
private readonly IContentManager _contentManager;
|
private readonly IContentManager _contentManager;
|
||||||
|
|
||||||
public MainMenu(IContentManager contentManager) {
|
public MainMenu(IContentManager contentManager) {
|
||||||
@@ -15,6 +16,14 @@ namespace Orchard.Core.Navigation.Services {
|
|||||||
|
|
||||||
public string MenuName { get { return "main"; } }
|
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) {
|
public void GetNavigation(NavigationBuilder builder) {
|
||||||
IEnumerable<MenuPart> menuParts = _contentManager.Query<MenuPart, MenuPartRecord>().Where(x => x.OnMainMenu).List();
|
IEnumerable<MenuPart> menuParts = _contentManager.Query<MenuPart, MenuPartRecord>().Where(x => x.OnMainMenu).List();
|
||||||
foreach (var menuPart in menuParts) {
|
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 {
|
namespace Orchard.Core.Navigation.ViewModels {
|
||||||
public class CreateMenuItemViewModel : AdminViewModel {
|
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 {
|
namespace Orchard.Core.Navigation.ViewModels {
|
||||||
public class NavigationManagementViewModel : AdminViewModel {
|
public class NavigationManagementViewModel : AdminViewModel {
|
||||||
|
public NavigationManagementViewModel() {
|
||||||
|
MenuItemEntries = Enumerable.Empty<MenuItemEntry>().ToList();
|
||||||
|
}
|
||||||
|
|
||||||
public CreateMenuItemViewModel NewMenuItem { get; set; }
|
public CreateMenuItemViewModel NewMenuItem { get; set; }
|
||||||
|
public IList<MenuItemEntry> MenuItemEntries { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<NavigationManagementViewModel>" %>
|
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<NavigationManagementViewModel>" %>
|
||||||
<%@ Import Namespace="Orchard.ContentManagement"%>
|
<%@ Import Namespace="Orchard.ContentManagement"%>
|
||||||
<%@ Import Namespace="Orchard.Core.Navigation.Models"%>
|
<%@ Import Namespace="Orchard.Core.Navigation.Models"%>
|
||||||
<%@ Import Namespace="Orchard.Core.Navigation.ViewModels"%><%
|
<%@ Import Namespace="Orchard.Core.Navigation.ViewModels"%>
|
||||||
var menu = Model.Menu.FirstOrDefault(); %>
|
|
||||||
<h1><%=Html.TitleForPage(T("Manage Main Menu").ToString())%></h1><%
|
<h1><%=Html.TitleForPage(T("Manage Main Menu").ToString())%></h1><%
|
||||||
using (Html.BeginFormAntiForgeryPost()) { %>
|
using (Html.BeginFormAntiForgeryPost()) { %>
|
||||||
<table class="items">
|
<table class="items">
|
||||||
@@ -21,13 +20,16 @@ using (Html.BeginFormAntiForgeryPost()) { %>
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody><%
|
<tbody><%
|
||||||
foreach (var menuItem in menu.Items) { %>
|
var menuPartEntryIndex = 0;
|
||||||
|
foreach (var menuPartEntry in Model.MenuItemEntries) {
|
||||||
|
var i = menuPartEntryIndex; %>
|
||||||
<tr>
|
<tr>
|
||||||
<td><%=Html.TextBox("text", menuItem.Text) %></td>
|
<td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Text) %>" value="<%=menuPartEntry.MenuItem.Text %>" /></td>
|
||||||
<td><%=Html.TextBox("position", menuItem.Position) %></td>
|
<td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Position) %>" value="<%=menuPartEntry.MenuItem.Position %>" /></td>
|
||||||
<td><%=Html.TextBox("url", menuItem.Url) %></td>
|
<td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Url) %>" value="<%=menuPartEntry.MenuItem.Url %>" /></td>
|
||||||
<td><a href="#" class="remove button">delete</a></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><%
|
</tr><%
|
||||||
|
++menuPartEntryIndex;
|
||||||
} %>
|
} %>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -118,6 +118,7 @@
|
|||||||
<Compile Include="Navigation\Services\MainMenu.cs" />
|
<Compile Include="Navigation\Services\MainMenu.cs" />
|
||||||
<Compile Include="Navigation\Filters\MainMenuFilter.cs" />
|
<Compile Include="Navigation\Filters\MainMenuFilter.cs" />
|
||||||
<Compile Include="Navigation\ViewModels\CreateMenuItemViewModel.cs" />
|
<Compile Include="Navigation\ViewModels\CreateMenuItemViewModel.cs" />
|
||||||
|
<Compile Include="Navigation\ViewModels\MenuItemEntry.cs" />
|
||||||
<Compile Include="Navigation\ViewModels\NavigationManagementViewModel.cs" />
|
<Compile Include="Navigation\ViewModels\NavigationManagementViewModel.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Scheduling\Records\ScheduledTaskRecord.cs" />
|
<Compile Include="Scheduling\Records\ScheduledTaskRecord.cs" />
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace Orchard.Utility {
|
|||||||
var topMenuItem = menuItems.FirstOrDefault();
|
var topMenuItem = menuItems.FirstOrDefault();
|
||||||
|
|
||||||
if (topMenuItem != null) {
|
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() != "");
|
var positionParts = maxMenuItem.Position.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries).Where(s => s.Trim() != "");
|
||||||
if (positionParts.Count() > 0) {
|
if (positionParts.Count() > 0) {
|
||||||
int result;
|
int result;
|
||||||
@@ -21,5 +21,11 @@ namespace Orchard.Utility {
|
|||||||
|
|
||||||
return "1";
|
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