Making a ContentItem's menu items URL resolved and not editable

--HG--
branch : dev
This commit is contained in:
Nathan Heskew
2010-02-16 15:17:11 -08:00
parent 32683280df
commit 06e36a9a37
4 changed files with 29 additions and 23 deletions

View File

@@ -60,12 +60,14 @@ namespace Orchard.Core.Navigation.Controllers {
return RedirectToAction("Index"); return RedirectToAction("Index");
} }
private static MenuItemEntry CreateMenuItemEntries(MenuPart menuPart) { private MenuItemEntry CreateMenuItemEntries(MenuPart menuPart) {
return new MenuItemEntry { return new MenuItemEntry {
MenuItem = new UI.Navigation.MenuItem { MenuItem = new UI.Navigation.MenuItem {
Text = menuPart.MenuText, Text = menuPart.MenuText,
Position = menuPart.MenuPosition, Position = menuPart.MenuPosition,
Url = menuPart.Is<MenuItem>() ? menuPart.As<MenuItem>().Url : "menu part url" Url = menuPart.Is<MenuItem>()
? menuPart.As<MenuItem>().Url
: _navigationManager.GetUrl(null, _services.ContentManager.GetItemMetadata(menuPart).DisplayRouteValues)
}, },
MenuItemId = menuPart.Id, MenuItemId = menuPart.Id,
IsMenuItem = menuPart.Is<MenuItem>() IsMenuItem = menuPart.Is<MenuItem>()

View File

@@ -1,5 +1,4 @@
using System; using System.Collections.Generic;
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;

View File

@@ -1,7 +1,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Web.Routing;
namespace Orchard.UI.Navigation { namespace Orchard.UI.Navigation {
public interface INavigationManager : IDependency { public interface INavigationManager : IDependency {
IEnumerable<MenuItem> BuildMenu(string menuName); IEnumerable<MenuItem> BuildMenu(string menuName);
string GetUrl(string menuItemUrl, RouteValueDictionary routeValueDictionary);
} }
} }

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Web;
using System.Web.Mvc; using System.Web.Mvc;
using System.Web.Routing;
using JetBrains.Annotations; using JetBrains.Annotations;
using Orchard.Security; using Orchard.Security;
using Orchard.Security.Permissions; using Orchard.Security.Permissions;
@@ -26,30 +26,33 @@ namespace Orchard.UI.Navigation {
private IEnumerable<MenuItem> FinishMenu(IEnumerable<MenuItem> menuItems) { private IEnumerable<MenuItem> FinishMenu(IEnumerable<MenuItem> menuItems) {
foreach (var menuItem in menuItems) { foreach (var menuItem in menuItems) {
var url = string.IsNullOrEmpty(menuItem.Url) && (menuItem.RouteValues == null || menuItem.RouteValues.Count == 0) menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues);
? null
: !string.IsNullOrEmpty(menuItem.Url)
? menuItem.Url
: _urlHelper.RouteUrl(menuItem.RouteValues);
if (!string.IsNullOrEmpty(url) && _urlHelper.RequestContext.HttpContext != null &&
!(url.StartsWith("http://") || url.StartsWith("https://") || url.StartsWith("/"))) {
if (url.StartsWith("~/")) {
url = url.Substring(2);
}
var appPath = _urlHelper.RequestContext.HttpContext.Request.ApplicationPath;
if (appPath == "/")
appPath = "";
url = string.Format("{0}/{1}", appPath, url);
}
menuItem.Href = url;
menuItem.Items = FinishMenu(menuItem.Items.ToArray()); menuItem.Items = FinishMenu(menuItem.Items.ToArray());
} }
return menuItems; return menuItems;
} }
public string GetUrl(string menuItemUrl, RouteValueDictionary routeValueDictionary) {
var url = string.IsNullOrEmpty(menuItemUrl) && (routeValueDictionary == null || routeValueDictionary.Count == 0)
? null
: !string.IsNullOrEmpty(menuItemUrl)
? menuItemUrl
: _urlHelper.RouteUrl(routeValueDictionary);
if (!string.IsNullOrEmpty(url) && _urlHelper.RequestContext.HttpContext != null &&
!(url.StartsWith("http://") || url.StartsWith("https://") || url.StartsWith("/"))) {
if (url.StartsWith("~/")) {
url = url.Substring(2);
}
var appPath = _urlHelper.RequestContext.HttpContext.Request.ApplicationPath;
if (appPath == "/")
appPath = "";
url = string.Format("{0}/{1}", appPath, url);
}
return url;
}
private IEnumerable<MenuItem> Crop(IEnumerable<MenuItem> items) { private IEnumerable<MenuItem> Crop(IEnumerable<MenuItem> items) {
foreach(var item in items) { foreach(var item in items) {
if (item.Items.Any() || item.RouteValues != null) if (item.Items.Any() || item.RouteValues != null)