创建菜单

优质
小牛编辑
192浏览
2023-12-01

后台菜单创建

一般我们的插件都会有后台管理的菜单,此时我们需要创建插件的后台管理菜单。以下是常用的方法。以下是Mydemo.php中的代码如下:

<?php

namespace addons\mydemo;

use app\common\library\Menu;
use app\common\model\User;
use fast\Date;
use think\Addons;
use think\Config;
use think\Request;
use think\Route;

/**
 * Mydemo插件
 */
class Mydemo extends Addons
{

    /**
     * 插件安装方法
     * @return bool
     */
    public function install()
    {
        $menu = [
            [
                'name'    => 'mydemo',
                'title'   => 'Mydemo管理',
                'icon'    => 'fa fa-map-marker',
                'sublist' => [
                    ["name"  => "signin/index","title" => "查看"],
                    ["name"  => "signin/add","title" => "添加"],
                    ["name"  => "signin/edit","title" => "编辑"],
                    ["name"  => "signin/del","title" => "删除"],
                    ["name"  => "signin/multi","title" => "批量更新"],
                ]
            ]
        ];
        Menu::create($menu);
        return true;
    }

    /**
     * 插件卸载方法
     * @return bool
     */
    public function uninstall()
    {
        Menu::delete("mydemo");
        return true;
    }

    /**
     * 插件启用方法
     * @return bool
     */
    public function enable()
    {
        Menu::enable("mydemo");
        return true;
    }

    /**
     * 插件禁用方法
     * @return bool
     */
    public function disable()
    {
        Menu::disable("mydemo");
        return true;
    }

    /**
     * 会员中心边栏后
     * @return mixed
     * @throws \Exception
     */
    public function userSidenavAfter()
    {
        $request = Request::instance();
        $controllername = strtolower($request->controller());
        $actionname = strtolower($request->action());
        $data = [
            'actionname'     => $actionname,
            'controllername' => $controllername
        ];
        return $this->fetch('view/hook/user_sidenav_after', $data);
    }

}

其中我们可以在install方法中使用Menu::create($menu, $parent)来创建菜单,其中$menu是我们的菜单配置信息,$parent是我们父菜单,父菜单可以是id,亦可以是菜单的name。默认为0表示顶级菜单。

后台多级菜单

如果我们需要创建多级菜单,我们的$menu值应该是这样

$menu = [
    [
        'name'    => 'mydemo',
        'title'   => 'Mydemo管理',
        'icon'    => 'fa fa-magic',
        'sublist' => [
            [
                'name'    => 'mydemo/menu1',
                'title'   => '菜单示例1',
                'icon'    => 'fa fa-table',
                'sublist' => [
                    ['name' => 'mydemo/menu1/index', 'title' => '查看'],
                    ['name' => 'mydemo/menu1/detail', 'title' => '详情'],
                    ['name' => 'mydemo/menu1/change', 'title' => '变更'],
                    ['name' => 'mydemo/menu1/del', 'title' => '删除'],
                    ['name' => 'mydemo/menu1/multi', 'title' => '批量更新'],
                ]
            ],
            [
                'name'    => 'mydemo/menu2',
                'title'   => '菜单示例2',
                'icon'    => 'fa fa-table',
                'sublist' => [
                    ['name' => 'mydemo/menu2/index', 'title' => '查看'],
                    ['name' => 'mydemo/menu2/del', 'title' => '删除'],
                    ['name' => 'mydemo/menu2/multi', 'title' => '批量更新'],
                ]
            ],
            [
                'name'    => 'mydemo/menu3',
                'title'   => '菜单示例3',
                'icon'    => 'fa fa-edit',
                'sublist' => [
                    ['name' => 'mydemo/menu2/index', 'title' => '查看'],
                ]
            ],
        ]
    ]
];

其中sublist表示下级菜单的配置,FastAdmin无限级菜单配置,但建议菜单级数不宜过多,合理的栏目规划能更方便后台的使用。

后台菜单操作

我们在后台禁用、启用、卸载插件是需要对菜单进行操作的。因此我们需要在Mydemo.php对应的方法中添加上相应的操作。如

/**
 * 插件卸载方法
 * @return bool
 */
public function uninstall()
{
    Menu::delete("mydemo");
    return true;
}

/**
 * 插件启用方法
 * @return bool
 */
public function enable()
{
    Menu::enable("mydemo");
    return true;
}

/**
 * 插件禁用方法
 * @return bool
 */
public function disable()
{
    Menu::disable("mydemo");
    return true;
}

会员中心菜单

如果我们开发的插件有前台会员中心菜单,我们可以通过在Mydemo.php中添加

/**
 * 会员中心边栏后
 * @return mixed
 * @throws \Exception
 */
public function userSidenavAfter()
{
    $request = Request::instance();
    $controllername = strtolower($request->controller());
    $actionname = strtolower($request->action());
    $data = [
        'actionname'     => $actionname,
        'controllername' => $controllername
    ];
    return $this->fetch('view/hook/user_sidenav_after', $data);
}

用此行为事件返回一个HTML即可将菜单显示在会员中心的边栏。
注意view/hook/user_sidenav_after文件位于addons/mydemo/view/hook/user_sidenav_after.html

常见问题

  1. 开发阶段由于创建了错误的后台菜单,导致安装插件时索引错误,此时可以到权限管理->规则菜单中去删除错误的菜单规则。
  2. 插件卸载重装后。管理组权限菜单需要重新分配,否则对应的管理员会没有相关权限。