首页 文章

OctoberCMS后端主菜单,其中包含不同插件的子菜单

提问于
浏览
0

我在OctoberCMS中有一个要求,我想实现后端(管理员端),下面是我要实现的内容 .

我正在使用Builder Plugin并且我已经创建了很多插件,这些插件显示在 Headers 的顶部,并在admin(后端)中显示各自的名称和链接 . 如果我点击它,我可以做任何我想要的(CRUD操作),它适用于所有这些插件 .

但是现在我只想要一个主菜单(比如说 - “ Plugins ”),如果我点击它或悬停在它上面,我应该能够看到我将添加的所有列出的插件,并且能够在将来添加如果我创造更多 .

我应该能够在悬停或左侧看到这些插件链接,它应该能够添加/删除这些链接 .

目前我正在尝试在构建器插件后端菜单中执行此操作,但我无法这样做,因为它与这些菜单选项卡的代码字段保持冲突 . 因此,如果我能实施,我现在正以其他方式展望未来 .

有人可以指导我如何实现这一目标?

2 回答

  • 1

    您可以通过在插件中创建boot()函数来操作菜单 .

    例子来自https://github.com/scottbedard/blogtags/blob/master/Plugin.php#L54

    class Plugin extends PluginBase
        {
    
            public function pluginDetails()
            {
                [..]
            }
    
            public function boot()
            {
                // extend the blog navigation
                Event::listen('backend.menu.extendItems', function($manager) {
                   $manager->addSideMenuItems('RainLab.Blog', 'blog', [
                        'tags' => [
                            'label' => 'bedard.blogtags::lang.navigation.tags',
                            'icon'  => 'icon-tags',
                            'code'  => 'tags',
                            'owner' => 'RainLab.Blog',
                            'url'   => Backend::url('bedard/blogtags/tags')
                        ]
                    ]);
                });
    }
    

    要删除可以使用的菜单项

    • $ manager-> removeMainMenuItem()

    • $ manager-> removeSideMenuItem()

    导航管理器的API文档:https://octobercms.com/docs/api/backend/classes/navigationmanager

  • 1

    好的伙计们,最终,我能够让它发挥作用 . 这就是我在下面所做的

    比方说,我有2个名为 PartnersProperties 的插件 .

    Partners 插件中,我在 Plugin.php 文件中编写了类似的内容 .

    plugins\technobrave\partners\Plugin.php

    <?php namespace Technobrave\Partners;
    
    use System\Classes\PluginBase;
    use Backend;
    use Event;
    class Plugin extends PluginBase
    {
    
        public function registerNavigation()
        {
            return [
                'modules' => [
                    'label'       => 'Modules',
                    'url'         => Backend::url('technobrave/properties/properties'),
                    'icon'        => 'icon-bars',
                    'permissions' => ['Technobrave.Property.*'],
    
                    'sideMenu'    => [
                        'properties' => [
                                'label' => 'Properties',
                                'icon'        => 'icon-home',
                                'url'         => Backend::url('technobrave/properties/properties'),
                                'permissions' => ['Technobrave.Property.*']
                        ],
                        'partner' => [
                                'label' => 'Partners',
                                'icon'        => 'icon-thumbs-up',
                                'url'         => Backend::url('technobrave/partners/partners'),
                                'permissions' => ['Technobrave.Partner.*']
    
                        ], 
                         ]
                ]
            ];
        }
    

    在这里,如您所见,我的 Headers 菜单链接将根据我的要求重定向到 Properties 插件,对于左侧栏菜单,我的第一个链接也将重定向到 Properties 插件,下一个子菜单链接将重定向到 Partners 插件 .

    然后我去了Partners控制器并输入类似下面的代码 .

    plugins\technobrave\partners\controllers\Partners.php

    <?php namespace Technobrave\Partners\Controllers;
    
    use Backend\Classes\Controller;
    use BackendMenu;
    
    class Partners extends Controller
    {
        public function __construct()
        {
            parent::__construct();             
            BackendMenu::setContext('Technobrave.Partners', 'modules', 'partner');        
        }
    }
    

    在上面,正如您所看到的,我只有 executed 菜单到合作伙伴插件,以便能够在我在合作伙伴列表或CRUD操作或某个地方时显示它 .

    我也为 Properties 插件做了类似的事情,以便能够在 Properties 插件中显示菜单 . 这就是我的代码的样子 .

    plugins\technobrave\properties\controllers\Properties.php

    <?php namespace Technobrave\Properties\Controllers;
    use Backend\Classes\Controller;
    use BackendMenu;
    class Properties extends Controller
    {
        public function __construct() {
            parent::__construct();       
            BackendMenu::setContext('Technobrave.Partners', 'modules', 'properties');
        }
    }
    

    在此代码中需要注意的一件事 BackendMenu::setContext('Technobrave.Partners', 'modules', 'properties');

    Last参数与我们在 Partners 插件中添加的参数不同 . BackendMenu::setContext('Technobrave.Partners', 'modules', 'properties'); 这是从左侧栏的列表中设置为默认选择菜单 .

    希望这可以帮助 .

相关问题