在Orchard中创建导航菜单项

时间:2015-03-24 14:41:14

标签: orchardcms

我已经编写了一个Orchard模块,并希望在模块启用时项目显示在导航列表中。理想情况下,我希望能够在禁用模块时删除该项目。

  1. 启用和禁用模块时,我应该在哪里插入?
  2. 如何以编程方式将菜单项添加到现有导航?

2 个答案:

答案 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)

问题没有说明模块的功能,所以我想我们假设它创建了一个内容类型。在这种情况下,您有(至少)两个选项:

  • 在内容类型的内容定义中,转到添加部件并添加菜单部分。这样您就可以从项目的内容编辑器中将内容项添加到菜单中。
  • 从导航菜单中选择相应的菜单,然后选择添加内容菜单项。请注意,内容类型必须设置为" listable"在内容定义中,以便将项目列为选项。

在任何一种情况下,禁用该模块都应该从导航中删除该项目。