Kristoffer Lindén
Dec 8, 2021
visibility 3944
star star star star star
(0 votes)

Create your own menu to handle your custom plugin

So in CMS 11 when you wrote your plugin you easily add settings to your plugin using GuiPlugin attribute and adding properties using the PlugInProperty attribute.
In CMS 12 that is not longer possible so the best is instead to create your own top menu item with a submenu that contains for example Dashboard and Settings.

The menu provider could look like this:

[MenuProvider]
public class MyPluginMenuProvider : IMenuProvider
{
    private readonly LocalizationService _localizationService;

    public MyPluginMenuProvider(LocalizationService localizationService)
    {
        _localizationService = localizationService;
    }

    public IEnumerable<MenuItem> GetMenuItems()
    {
        var mainMenuItem =
            new UrlMenuItem("My plugin", MenuPaths.Global + "/cms/myplugin", null)
            {
                IsAvailable = context => true,
                SortIndex = SortIndex.Last + 100,
                AuthorizationPolicy = CmsPolicyNames.CmsAdmin
            };

        var dashboardMenuItem =
            new UrlMenuItem(_localizationService.GetString("/Plugin/DisplayName"),
                MenuPaths.Global + "/cms/myplugin/dashboard", "/MyPlugin/Dashboard/Index")
            {
                IsAvailable = context => true,
                SortIndex = 100,
                AuthorizationPolicy = CmsPolicyNames.CmsAdmin
            };

        var settingsMenuItem =
            new UrlMenuItem(_localizationService.GetString("/Plugin/Settings"),
                MenuPaths.Global + "/cms/myplugin/settings", "/MyPlugin/Settings/Index")
            {
                IsAvailable = context => true,
                SortIndex = 200,
                AuthorizationPolicy = CmsPolicyNames.CmsAdmin
            };

        return new List<MenuItem>
        {
            mainMenuItem,
            dashboardMenuItem,
            settingsMenuItem
        };
    }
}

That would give you this look:

Your layout view should look something like this to have the Optimizely menu to render:

@using EPiServer.Framework.Web.Resources
@using EPiServer.Shell.Navigation

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title>My Plugin</title>

        <!-- Shell -->
        @ClientResources.RenderResources("ShellCore")

        <!-- LightTheme -->
        @ClientResources.RenderResources("ShellCoreLightTheme")
    </head>

    <body>
        @Html.CreatePlatformNavigationMenu()
        <div @Html.ApplyPlatformNavigation()>
            @RenderBody()
        </div>
    </body>
</html>

When this is done you can easily work with your dashboard and settings functions.

Thanks Scott Reed for enlighting me in this forum post:
https://world.optimizely.com/forum/developer-forum/CMS/Thread-Container/2021/12/admin-plugin--tool-in-cms-12/

You can read more here:
https://world.optimizely.com/documentation/developer-guides/CMS/user-interface/extending-the-navigation/using-menu-providers/

/Kristoffer

Dec 08, 2021

Comments

error Please login to comment.
Latest blogs
Architecting an Enterprise-Grade Development Pipeline in Optimizely SaaS CMS

Most enterprise teams show up to Optimizely SaaS CMS with a clear roadmap for their release pipeline: DEV → QA → Stage → Prod. Four logical...

Vipin Banka | Jul 12, 2026

Bynder DAM Connector for Optimizely SaaS CMS: Improved Metadata Property Synchronization

While working with the Bynder DAM Connector for Optimizely SaaS CMS , one of the key areas I explored was how Bynder asset metadata is synchronized...

Vipin Banka | Jul 11, 2026

Optimizely DXP: Every Supported Culture, One Searchable Page

Quick one for anyone building multi-language sites on Optimizely DXP. I put together a reference tool listing all 806 supported cultures. More...

Adnan Zameer | Jul 10, 2026 |

A day in the life of an Optimizely OMVP: London Meetup 2026

On 2nd July 2026 the Optimizely London Developer Meetup returned to The Lightwell, and the running theme across the evening was less about individu...

Graham Carr | Jul 10, 2026