mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-07-31 20:01:11 +08:00
Adding INavigationFilter to alter the menu dynamically
--HG-- branch : 1.x
This commit is contained in:
parent
f1d3458afa
commit
43232e2c63
@ -18,7 +18,7 @@ namespace Orchard.Tests.UI.Navigation {
|
||||
public class NavigationManagerTests {
|
||||
[Test]
|
||||
public void EmptyMenuIfNameDoesntMatch() {
|
||||
var manager = new NavigationManager(new[] { new StubProvider() }, new IMenuProvider[] { }, new StubAuth(), new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
|
||||
var manager = new NavigationManager(new[] { new StubProvider() }, new IMenuProvider[] { }, new StubAuth(), new INavigationFilter[0], new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
|
||||
|
||||
var menuItems = manager.BuildMenu("primary");
|
||||
Assert.That(menuItems.Count(), Is.EqualTo(0));
|
||||
@ -35,7 +35,7 @@ namespace Orchard.Tests.UI.Navigation {
|
||||
|
||||
[Test]
|
||||
public void NavigationManagerShouldUseProvidersToBuildNamedMenu() {
|
||||
var manager = new NavigationManager(new[] { new StubProvider() }, new IMenuProvider[] {}, new StubAuth(), new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
|
||||
var manager = new NavigationManager(new[] { new StubProvider() }, new IMenuProvider[] { }, new StubAuth(), new INavigationFilter[0], new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
|
||||
|
||||
var menuItems = manager.BuildMenu("admin");
|
||||
Assert.That(menuItems.Count(), Is.EqualTo(2));
|
||||
@ -47,7 +47,7 @@ namespace Orchard.Tests.UI.Navigation {
|
||||
|
||||
[Test]
|
||||
public void NavigationManagerShouldCatchProviderErrors() {
|
||||
var manager = new NavigationManager(new[] { new BrokenProvider() }, new IMenuProvider[] { }, new StubAuth(), new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
|
||||
var manager = new NavigationManager(new[] { new BrokenProvider() }, new IMenuProvider[] { }, new StubAuth(), new INavigationFilter[0], new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
|
||||
|
||||
var menuItems = manager.BuildMenu("admin");
|
||||
Assert.That(menuItems.Count(), Is.EqualTo(0));
|
||||
@ -55,7 +55,7 @@ namespace Orchard.Tests.UI.Navigation {
|
||||
|
||||
[Test]
|
||||
public void NavigationManagerShouldMergeAndOrderNavigation() {
|
||||
var manager = new NavigationManager(new INavigationProvider[] { new StubProvider(), new Stub2Provider() }, new IMenuProvider[] { }, new StubAuth(), new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
|
||||
var manager = new NavigationManager(new INavigationProvider[] { new StubProvider(), new Stub2Provider() }, new IMenuProvider[] { }, new StubAuth(), new INavigationFilter[0], new UrlHelper(new RequestContext(new StubHttpContext("~/"), new RouteData())), new StubOrchardServices());
|
||||
|
||||
var menuItems = manager.BuildMenu("admin");
|
||||
Assert.That(menuItems.Count(), Is.EqualTo(3));
|
||||
|
@ -268,6 +268,7 @@
|
||||
<Compile Include="Time\TimeZoneSelectorResult.cs" />
|
||||
<Compile Include="UI\FlatPositionComparer.cs" />
|
||||
<Compile Include="UI\Navigation\IMenuProvider.cs" />
|
||||
<Compile Include="UI\Navigation\INavigationFilter.cs" />
|
||||
<Compile Include="UI\Navigation\NavigationHelper.cs" />
|
||||
<Compile Include="UI\Navigation\Pager.cs" />
|
||||
<Compile Include="UI\Navigation\PagerParameters.cs" />
|
||||
|
7
src/Orchard/UI/Navigation/INavigationFilter.cs
Normal file
7
src/Orchard/UI/Navigation/INavigationFilter.cs
Normal file
@ -0,0 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Orchard.UI.Navigation {
|
||||
public interface INavigationFilter : IDependency {
|
||||
IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> menuItems);
|
||||
}
|
||||
}
|
@ -34,7 +34,5 @@ namespace Orchard.UI.Navigation {
|
||||
_classes = value;
|
||||
}
|
||||
}
|
||||
|
||||
public int MenuId { get; set; }
|
||||
}
|
||||
}
|
@ -41,6 +41,11 @@ namespace Orchard.UI.Navigation {
|
||||
return Add(caption, null, x => { }, classes);
|
||||
}
|
||||
|
||||
public NavigationBuilder Remove(MenuItem item) {
|
||||
Contained.Remove(item);
|
||||
return this;
|
||||
}
|
||||
|
||||
public NavigationBuilder AddImageSet(string imageSet) {
|
||||
_imageSets.Add(imageSet);
|
||||
return this;
|
||||
@ -49,6 +54,7 @@ namespace Orchard.UI.Navigation {
|
||||
public IEnumerable<MenuItem> Build() {
|
||||
return (Contained ?? Enumerable.Empty<MenuItem>()).ToList();
|
||||
}
|
||||
|
||||
public IEnumerable<string> BuildImageSets() {
|
||||
return _imageSets.Distinct();
|
||||
}
|
||||
|
@ -23,11 +23,6 @@ namespace Orchard.UI.Navigation {
|
||||
return this;
|
||||
}
|
||||
|
||||
public NavigationItemBuilder MenuId(int menuId) {
|
||||
_item.MenuId = menuId;
|
||||
return this;
|
||||
}
|
||||
|
||||
public NavigationItemBuilder Url(string url) {
|
||||
_item.Url = url;
|
||||
return this;
|
||||
|
@ -7,24 +7,28 @@ using Orchard.ContentManagement;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Security;
|
||||
using Orchard.Security.Permissions;
|
||||
using Orchard.UI.Admin;
|
||||
|
||||
namespace Orchard.UI.Navigation {
|
||||
public class NavigationManager : INavigationManager {
|
||||
private readonly IEnumerable<INavigationProvider> _navigationProviders;
|
||||
private readonly IEnumerable<IMenuProvider> _menuProviders;
|
||||
private readonly IAuthorizationService _authorizationService;
|
||||
private readonly IEnumerable<INavigationFilter> _navigationFilters;
|
||||
private readonly UrlHelper _urlHelper;
|
||||
private readonly IOrchardServices _orchardServices;
|
||||
|
||||
public NavigationManager(
|
||||
IEnumerable<INavigationProvider> navigationProviders,
|
||||
IEnumerable<IMenuProvider> menuProviders,
|
||||
IAuthorizationService authorizationService,
|
||||
IAuthorizationService authorizationService,
|
||||
IEnumerable<INavigationFilter> navigationFilters,
|
||||
UrlHelper urlHelper,
|
||||
IOrchardServices orchardServices) {
|
||||
_navigationProviders = navigationProviders;
|
||||
_menuProviders = menuProviders;
|
||||
_authorizationService = authorizationService;
|
||||
_navigationFilters = navigationFilters;
|
||||
_urlHelper = urlHelper;
|
||||
_orchardServices = orchardServices;
|
||||
Logger = NullLogger.Instance;
|
||||
@ -39,7 +43,7 @@ namespace Orchard.UI.Navigation {
|
||||
|
||||
public IEnumerable<MenuItem> BuildMenu(IContent menu) {
|
||||
var sources = GetSources(menu);
|
||||
return FinishMenu(Reduce(Arrange(Merge(sources))).ToArray());
|
||||
return FinishMenu(Reduce(Arrange(Filter(Merge(sources)))).ToArray());
|
||||
}
|
||||
|
||||
public IEnumerable<string> BuildImageSets(string menuName) {
|
||||
@ -55,6 +59,15 @@ namespace Orchard.UI.Navigation {
|
||||
return menuItems;
|
||||
}
|
||||
|
||||
private IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> menuItems) {
|
||||
IEnumerable<MenuItem> result = menuItems;
|
||||
foreach(var filter in _navigationFilters) {
|
||||
result = filter.Filter(result);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public string GetUrl(string menuItemUrl, RouteValueDictionary routeValueDictionary) {
|
||||
var url = string.IsNullOrEmpty(menuItemUrl) && (routeValueDictionary == null || routeValueDictionary.Count == 0)
|
||||
? "~/"
|
||||
@ -82,8 +95,8 @@ namespace Orchard.UI.Navigation {
|
||||
var hasDebugShowAllMenuItems = _authorizationService.TryCheckAccess(Permission.Named("DebugShowAllMenuItems"), _orchardServices.WorkContext.CurrentUser, null);
|
||||
foreach (var item in items) {
|
||||
if (hasDebugShowAllMenuItems ||
|
||||
!item.Permissions.Any() ||
|
||||
item.Permissions.Any(x => _authorizationService.TryCheckAccess(x, _orchardServices.WorkContext.CurrentUser, null))) {
|
||||
AdminFilter.IsApplied(_urlHelper.RequestContext) ||
|
||||
item.Permissions.Concat(new [] { Permission.Named("ViewContent") }).Any(x => _authorizationService.TryCheckAccess(x, _orchardServices.WorkContext.CurrentUser, item.Content))) {
|
||||
yield return new MenuItem {
|
||||
Items = Reduce(item.Items),
|
||||
Permissions = item.Permissions,
|
||||
@ -96,7 +109,6 @@ namespace Orchard.UI.Navigation {
|
||||
Url = item.Url,
|
||||
LinkToFirstChild = item.LinkToFirstChild,
|
||||
Href = item.Href,
|
||||
MenuId = item.MenuId,
|
||||
Content = item.Content
|
||||
};
|
||||
}
|
||||
@ -225,9 +237,9 @@ namespace Orchard.UI.Navigation {
|
||||
Items = Merge(items.Select(x => x.Items)).ToArray(),
|
||||
Position = SelectBestPositionValue(items.Select(x => x.Position)),
|
||||
Permissions = items.SelectMany(x => x.Permissions).Distinct(),
|
||||
MenuId = items.First().MenuId,
|
||||
Content = items.First().Content
|
||||
};
|
||||
|
||||
return joined;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user