Phil Peace
Phil Peace

Reputation: 753

Creating a navigation menu item in Orchard

I have written an Orchard Module and would like an item to appear in a Navigation list when the module is Enabled. Ideally, I would like to be able to remove the item when the Module is disabled.

  1. Where should I hook into to for when the module is enabled and disabled?
  2. How do I programmatically add a menu item to an already existing Navigation?

Upvotes: 1

Views: 630

Answers (2)

Hazza
Hazza

Reputation: 6581

You can implement the IMenuProvider interface for this. An example implementation might look something like this:

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" }));
            }
        }
    }
}

This will appear on all menus on the front end. You may want to put in the name of the menu you are targeting if you know for sure that is what it is called (default in Orchard is "Main Menu", people don't generally change it to be honest). This could be a little brittle, so you may want it customizable, either with a site setting or you could create a part that you attach to the menu content type that lets the admin specify whether to show your menu items on the said menu.

An alternative approach would be to hook into the modules enable event using IFeatureEventHandler and using the content manager to create menu items with urls and adding them to a specified Menu. I don't really recommend this approach; you lose control of the menu items (e.g. to update a url), they can be removed from the menu accidentally, you have to know the name of the Menu you are adding them to, you are more limited (cant do permissions checks etc.).

I assume you are talking about showing up on the front end. If you talking about the admin menu then check out pretty much any module for a file generally called AdminMenu.cs, plenty of examples :)

Upvotes: 2

wentz
wentz

Reputation: 700

The question doesn't specify what the module does so I guess we're to assume that it creates a content type. In that case you have (at least) two options:

  • In the Content Type's Content Definition go to Add Parts and add the Menu part. This will allow you to add a content item to a menu from the item's content editor.
  • From the Navigation menu choose the appropriate Menu and select add a Content Menu Item. Note that the content type must be set as "listable" in Content Definition in order for the items to be listed as a choice.

Disabling the module should remove the item from the navigation in either case.

Upvotes: 0

Related Questions