Instead of an isBreadcrumb parameter we now use BreadcrumbMenuItemPart to distinguish breadcrumb-only menu items

This commit is contained in:
Lombiq
2016-01-29 17:03:07 +01:00
parent cce9b3172e
commit f44ddc623c
11 changed files with 112 additions and 94 deletions

View File

@@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Orchard.ContentManagement.Drivers;
using Orchard.Core.Navigation.Models;
namespace Orchard.Core.Navigation.Drivers {
public class BreadcrumbMenuItemPartDriver : ContentPartDriver<BreadcrumbMenuItemPart> {
}
}

View File

@@ -11,6 +11,7 @@ using Orchard.Core.Title.Models;
using Orchard.Localization;
using Orchard.UI.Navigation;
using Orchard.Utility.Extensions;
using Orchard.ContentManagement.Utilities;
namespace Orchard.Core.Navigation.Drivers {
public class MenuWidgetPartDriver : ContentPartDriver<MenuWidgetPart> {
@@ -49,7 +50,12 @@ namespace Orchard.Core.Navigation.Drivers {
var menuName = menu.As<TitlePart>().Title.HtmlClassify();
var currentCulture = _workContextAccessor.GetContext().CurrentCulture;
var menuItems = _navigationManager.BuildMenu(menu, part.Breadcrumb);
var menuItems = _navigationManager.BuildMenu(menu);
if (!part.Breadcrumb) {
menuItems = menuItems.Where(x => !x.Content.Has<BreadcrumbMenuItemPart>());
}
var localized = new List<MenuItem>();
foreach(var menuItem in menuItems) {
// if there is no associated content, it as culture neutral

View File

@@ -0,0 +1,6 @@
using Orchard.ContentManagement;
namespace Orchard.Core.Navigation.Models {
public class BreadcrumbMenuItemPart : ContentPart {
}
}

View File

@@ -44,29 +44,21 @@ namespace Orchard.Core.Navigation.Services {
public ILogger Logger { get; set; }
public IEnumerable<MenuItem> BuildMenu(string menuName) {
return BuildMenu(menuName, false);
}
public IEnumerable<MenuItem> BuildMenu(string menuName, bool isBreadcrumb) {
var sources = GetSources(menuName);
var hasDebugShowAllMenuItems = _authorizationService.TryCheckAccess(Permission.Named("DebugShowAllMenuItems"), _orchardServices.WorkContext.CurrentUser, null);
return FinishMenu(Reduce(Filter(Merge(sources), isBreadcrumb), menuName == "admin", hasDebugShowAllMenuItems).ToArray());
return FinishMenu(Reduce(Filter(Merge(sources)), menuName == "admin", hasDebugShowAllMenuItems).ToArray());
}
public IEnumerable<MenuItem> BuildMenu(IContent menu) {
return BuildMenu(menu,false);
}
public IEnumerable<MenuItem> BuildMenu(IContent menu, bool isBreadcrumb) {
var sources = GetSources(menu);
var hasDebugShowAllMenuItems = _authorizationService.TryCheckAccess(Permission.Named("DebugShowAllMenuItems"), _orchardServices.WorkContext.CurrentUser, null);
return FinishMenu(Reduce(Arrange(Filter(Merge(sources), isBreadcrumb)), false, hasDebugShowAllMenuItems).ToArray());
return FinishMenu(Reduce(Arrange(Filter(Merge(sources))), false, hasDebugShowAllMenuItems).ToArray());
}
public string GetNextPosition(IContent menu) {
var sources = GetSources(menu);
var hasDebugShowAllMenuItems = _authorizationService.TryCheckAccess(Permission.Named("DebugShowAllMenuItems"), _orchardServices.WorkContext.CurrentUser, null);
return Position.GetNext(Reduce(Arrange(Filter(Merge(sources), false)), false, hasDebugShowAllMenuItems).ToArray());
return Position.GetNext(Reduce(Arrange(Filter(Merge(sources))), false, hasDebugShowAllMenuItems).ToArray());
}
public IEnumerable<string> BuildImageSets(string menuName) {
@@ -82,10 +74,10 @@ namespace Orchard.Core.Navigation.Services {
return menuItems;
}
private IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> menuItems, bool isBreadcrumb) {
private IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> menuItems) {
IEnumerable<MenuItem> result = menuItems;
foreach (var filter in _navigationFilters) {
result = filter.Filter(result, isBreadcrumb);
result = filter.Filter(result);
}
return result;

View File

@@ -172,6 +172,7 @@
<Compile Include="Dashboard\Services\CompilationErrorBanner.cs" />
<Compile Include="Navigation\Commands\MenuCommands.cs" />
<Compile Include="Navigation\Drivers\AdminMenuPartDriver.cs" />
<Compile Include="Navigation\Drivers\BreadcrumbMenuItemPartDriver.cs" />
<Compile Include="Navigation\Drivers\MenuItemPartDriver.cs" />
<Compile Include="Navigation\Drivers\MenuWidgetPartDriver.cs" />
<Compile Include="Navigation\Drivers\ShapeMenuItemPartDriver.cs" />
@@ -182,6 +183,7 @@
<Compile Include="Navigation\Handlers\MenuWidgetPartHandler.cs" />
<Compile Include="Navigation\Models\AdminMenuPart.cs" />
<Compile Include="Navigation\Models\AdminMenuPartRecord.cs" />
<Compile Include="Navigation\Models\BreadcrumbMenuItemPart.cs" />
<Compile Include="Navigation\Models\MenuWidgetPart.cs" />
<Compile Include="Navigation\Models\ShapeMenuItemPart.cs" />
<Compile Include="Navigation\Security\AuthorizationEventHandler.cs" />

View File

@@ -1,6 +1,7 @@
using Orchard.Data.Migration;
using Orchard.ContentManagement.MetaData;
using Orchard.Environment.Extensions;
using Orchard.Core.Navigation.Models;
namespace Orchard.Alias {
[OrchardFeature("Orchard.Alias.BreadcrumbLink")]
@@ -8,6 +9,7 @@ namespace Orchard.Alias {
public int Create() {
ContentDefinitionManager.AlterTypeDefinition("AliasBreadcrumbMenuItem",
cfg => cfg
.WithPart("BreadcrumbMenuItemPart")
.WithPart("MenuPart")
.WithPart("CommonPart")
.WithIdentity()

View File

@@ -27,10 +27,9 @@ namespace Orchard.Alias.Navigation {
_hca = hca;
}
public IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> items, bool isBreadcrumb = false) {
public IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> items) {
foreach (var item in items) {
if (item.Content != null && item.Content.ContentItem.ContentType == "AliasBreadcrumbMenuItem") {
if (isBreadcrumb) {
var request = _hca.Current().Request;
var path = request.Path;
var appPath = request.ApplicationPath ?? "/";
@@ -46,7 +45,7 @@ namespace Orchard.Alias.Navigation {
// or it's an unneccessary element according to the url.
RouteValueDictionary contentRoute;
if (menuLevel == urlLevel) {
contentRoute = _aliasService.Get(requestUrl);
contentRoute = request.RequestContext.RouteData.Values;
}
else {
// If menuLevel doesn't equal with urlLevel it can mean that this menu item is
@@ -70,6 +69,9 @@ namespace Orchard.Alias.Navigation {
// because we don't know if the alias was created with a slash at the end or not.
contentRoute = _aliasService.Get(requestUrl.Insert(requestUrl.Length, "/"));
path = path.Insert(path.Length, "/");
if (contentRoute == null) {
contentRoute = new RouteValueDictionary();
}
}
}
else {
@@ -109,14 +111,13 @@ namespace Orchard.Alias.Navigation {
Items = Enumerable.Empty<MenuItem>(),
Position = menuPosition,
Permissions = item.Permissions,
Content = currentContentItem
Content = item.Content
};
yield return inserted;
}
}
}
}
else {
yield return item;
}

View File

@@ -21,7 +21,7 @@ namespace Orchard.Projections.Navigation {
_projectionManager = projectionManager;
}
public IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> items, bool isBreadcrumb) {
public IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> items) {
foreach (var item in items) {
if (item.Content != null && item.Content.ContentItem.ContentType == "NavigationQueryMenuItem") {

View File

@@ -24,7 +24,7 @@ namespace Orchard.Taxonomies.Navigation {
_taxonomyService = taxonomyService;
}
public IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> items, bool isBreadcrumb) {
public IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> items) {
foreach (var item in items) {
if (item.Content != null && item.Content.ContentItem.ContentType == "TaxonomyNavigationMenuItem") {

View File

@@ -5,6 +5,6 @@ namespace Orchard.UI.Navigation {
/// Provides a way to alter the main navigation, for instance by dynamically injecting new items
/// </summary>
public interface INavigationFilter : IDependency {
IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> menuItems, bool isBreadcrumb = false);
IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> menuItems);
}
}

View File

@@ -5,9 +5,7 @@ using Orchard.ContentManagement;
namespace Orchard.UI.Navigation {
public interface INavigationManager : IDependency {
IEnumerable<MenuItem> BuildMenu(string menuName);
IEnumerable<MenuItem> BuildMenu(string menuName, bool isBreadcrumbMenu);
IEnumerable<MenuItem> BuildMenu(IContent menu);
IEnumerable<MenuItem> BuildMenu(IContent menu, bool isBreadcrumbMenu);
IEnumerable<string> BuildImageSets(string menuName);
string GetUrl(string menuItemUrl, RouteValueDictionary routeValueDictionary);
string GetNextPosition(IContent menu);