mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-12-02 19:44:02 +08:00
#19222: Fixing MenuWidgetPartDriver to correctly start and cut-off menu item hierarchies.
Work Item: 19222 --HG-- branch : 1.x
This commit is contained in:
@@ -56,9 +56,7 @@ namespace Orchard.Core.Navigation.Drivers {
|
|||||||
|
|
||||||
var menuName = menu.As<TitlePart>().Title.HtmlClassify();
|
var menuName = menu.As<TitlePart>().Title.HtmlClassify();
|
||||||
var currentCulture = _workContextAccessor.GetContext().CurrentCulture;
|
var currentCulture = _workContextAccessor.GetContext().CurrentCulture;
|
||||||
|
var menuItems = _navigationManager.BuildMenu(menu);
|
||||||
IEnumerable<MenuItem> menuItems = _navigationManager.BuildMenu(menu);
|
|
||||||
|
|
||||||
var localized = new List<MenuItem>();
|
var localized = new List<MenuItem>();
|
||||||
foreach(var menuItem in menuItems) {
|
foreach(var menuItem in menuItems) {
|
||||||
// if there is no associated content, it as culture neutral
|
// if there is no associated content, it as culture neutral
|
||||||
@@ -75,10 +73,8 @@ namespace Orchard.Core.Navigation.Drivers {
|
|||||||
menuItems = localized;
|
menuItems = localized;
|
||||||
|
|
||||||
var routeData = _workContextAccessor.GetContext().HttpContext.Request.RequestContext.RouteData;
|
var routeData = _workContextAccessor.GetContext().HttpContext.Request.RequestContext.RouteData;
|
||||||
|
|
||||||
var selectedPath = NavigationHelper.SetSelectedPath(menuItems, routeData);
|
var selectedPath = NavigationHelper.SetSelectedPath(menuItems, routeData);
|
||||||
|
var menuShape = shapeHelper.Menu();
|
||||||
dynamic menuShape = shapeHelper.Menu();
|
|
||||||
|
|
||||||
if (part.Breadcrumb) {
|
if (part.Breadcrumb) {
|
||||||
menuItems = selectedPath ?? new Stack<MenuItem>();
|
menuItems = selectedPath ?? new Stack<MenuItem>();
|
||||||
@@ -113,57 +109,41 @@ namespace Orchard.Core.Navigation.Drivers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
menuItems = result;
|
menuItems = result;
|
||||||
|
|
||||||
menuShape = shapeHelper.Breadcrumb();
|
menuShape = shapeHelper.Breadcrumb();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
IEnumerable<MenuItem> topLevelItems = menuItems.ToList();
|
var topLevelItems = menuItems.ToList();
|
||||||
|
|
||||||
if (part.StartLevel > 1) {
|
// apply start level by pushing children as top level items. When the start level is
|
||||||
|
// greater than 1 (ie. below the top level), only menu items along the selected path
|
||||||
|
// will be displayed.
|
||||||
|
for (var i = 0; topLevelItems.Any() && i < part.StartLevel - 1; i++) {
|
||||||
|
var temp = new List<MenuItem>();
|
||||||
if (selectedPath != null) {
|
if (selectedPath != null) {
|
||||||
// the selected path will return the whole selected hierarchy
|
|
||||||
// intersecting will return the root selected menu item
|
|
||||||
topLevelItems = topLevelItems.Intersect(selectedPath.Where(x => x.Selected)).ToList();
|
topLevelItems = topLevelItems.Intersect(selectedPath.Where(x => x.Selected)).ToList();
|
||||||
}
|
|
||||||
else {
|
|
||||||
topLevelItems = new List<MenuItem>();
|
|
||||||
menuItems = topLevelItems;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (topLevelItems.Any()) {
|
|
||||||
// apply start level by pushing childrens as top level items
|
|
||||||
int i = 0;
|
|
||||||
for (; i < part.StartLevel - 1; i++) {
|
|
||||||
var temp = new List<MenuItem>();
|
|
||||||
foreach (var menuItem in topLevelItems) {
|
foreach (var menuItem in topLevelItems) {
|
||||||
temp.AddRange(menuItem.Items);
|
temp.AddRange(menuItem.Items);
|
||||||
}
|
}
|
||||||
topLevelItems = temp;
|
|
||||||
}
|
}
|
||||||
|
topLevelItems = temp;
|
||||||
// apply display level ?
|
|
||||||
if(part.Levels > 0) {
|
|
||||||
var current = topLevelItems.ToList();
|
|
||||||
for (int j=1; j < part.Levels; j++ ) {
|
|
||||||
var temp = new List<MenuItem>();
|
|
||||||
foreach (var menuItem in current) {
|
|
||||||
temp.AddRange(menuItem.Items);
|
|
||||||
}
|
|
||||||
current = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
topLevelItems = current;
|
|
||||||
|
|
||||||
// cut the sub-levels of any selected menu item
|
|
||||||
foreach (var menuItem in topLevelItems) {
|
|
||||||
menuItem.Items = Enumerable.Empty<MenuItem>();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
menuItems = topLevelItems;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// limit the number of levels to display (down from and including the start level)
|
||||||
|
if(part.Levels > 0) {
|
||||||
|
var current = topLevelItems.ToList();
|
||||||
|
for (var i = 1; current.Any() && i < part.Levels; i++ ) {
|
||||||
|
var temp = new List<MenuItem>();
|
||||||
|
foreach (var menuItem in current) {
|
||||||
|
temp.AddRange(menuItem.Items);
|
||||||
|
}
|
||||||
|
current = temp;
|
||||||
|
}
|
||||||
|
// cut the sub-levels beneath any menu items that are at the lowest level being displayed
|
||||||
|
foreach (var menuItem in current) {
|
||||||
|
menuItem.Items = Enumerable.Empty<MenuItem>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
menuItems = topLevelItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
menuShape.MenuName(menuName);
|
menuShape.MenuName(menuName);
|
||||||
|
|||||||
Reference in New Issue
Block a user