我已经编写了一个Orchard模块,并希望在模块启用时项目显示在导航列表中。理想情况下,我希望能够在禁用模块时删除该项目。
答案 0 :(得分:1)
您可以为此实现IMenuProvider
接口。示例实现可能如下所示:
namespace Orchard.Bar {
public class SuperMenuProvider : IMenuProvider {
private readonly IOrchardServices _orchardServices;
public SuperMenuProvider(IOrchardServices orchardServices) {
_orchardServices = orchardServices;
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
public void GetMenu(IContent menu, NavigationBuilder builder) {
string position = "10";
builder.Add(T("Foo"), position, item => item.Url("http://foo.com").AddClass("someClass"));
builder.Add(T("Bar"), position + ".1", item => item.Action("Index", "Foo", new { area = "Orchard.Bar" }));
if (_orchardServices.Authorizer.Authorize(Orchard.Security.StandardPermissions.AccessAdminPanel)) {
builder.Add(T("Secure FooBar"), position + ".2", item => item.Action("Index", "Secure", new { area = "Orchard.Bar" }));
}
}
}
}
这将出现在前端的所有菜单上。你可能想要确定你所定位的菜单的名称,如果你知道它的名称是肯定的(在Orchard默认为“主菜单”,人们通常不会将其改为诚实)。这可能有点脆弱,因此您可能希望它可以自定义,或者使用网站设置,或者您可以创建一个附加到菜单内容类型的部分,让管理员指定是否在所述菜单上显示您的菜单项。 / p>
另一种方法是使用IFeatureEventHandler
挂钩模块启用事件,并使用内容管理器创建带有网址的菜单项并将其添加到指定的菜单。我不是真的推荐这种方法;你失去了对菜单项的控制(例如更新网址),它们可能会被意外地从菜单中删除,你必须知道你要添加它们的菜单的名称,你是更有限的(不能做权限检查等。 )。
我假设你正在谈论出现在前端。如果您谈论管理菜单,那么请查看几乎所有模块的文件,通常称为AdminMenu.cs,大量示例:)
答案 1 :(得分:0)
问题没有说明模块的功能,所以我想我们假设它创建了一个内容类型。在这种情况下,您有(至少)两个选项:
在任何一种情况下,禁用该模块都应该从导航中删除该项目。