创建菜单
后台菜单创建
一般我们的应用插件都会有后台管理的菜单,此时我们需要创建插件的后台管理菜单。以下是常用的方法。以下是addons/mydemo/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
{
protected $menu = [
[
'name' => 'mydemo', //权限规则标识,首个菜单标识必须和插件标识相同
'title' => 'Mydemo管理', //菜单标题
'icon' => 'fa fa-map-marker', //菜单按钮,可使用Font-Awesome的图标
'ismenu' => 1, //是否为菜单
'weigh' => 1, //权重,值越大越靠前
'remark' => 'Demo管理描述内容', //菜单描述内容,在列表处显示
'sublist' => [ //子菜单配置,子菜单name必须以 插件标识/ 开始,这里如 mydemo/
["name" => "mydemo/signin/index","title" => "查看"],
["name" => "mydemo/signin/add","title" => "添加"],
["name" => "mydemo/signin/edit","title" => "编辑"],
["name" => "mydemo/signin/del","title" => "删除"],
["name" => "mydemo/signin/multi","title" => "批量更新"],
]
]
];
/**
* 插件安装方法
* @return bool
*/
public function install()
{
Menu::create($this->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 bool
*/
public function upgrade()
{
//如果菜单有变更则升级菜单
Menu::upgrade('mydemo', $this->menu);
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是我们父菜单,父菜单是父菜单的name。默认为0表示顶级菜单。
后台多级菜单
如果我们需要创建多级菜单,我们的$menu值应该是这样
$menu = [
[
'name' => 'mydemo',
'title' => 'Mydemo管理',
'icon' => 'fa fa-magic',
'ismenu' => 1,
'weigh' => 1,
'remark' => 'Demo管理描述内容',
'sublist' => [
[
'name' => 'mydemo/menu1',
'title' => '菜单示例1',
'icon' => 'fa fa-table',
'ismenu' => 1,
'weigh' => 3,
'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',
'ismenu' => 1,
'weigh' => 2,
'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',
'ismenu' => 1,
'weigh' => 1,
'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;
}后台菜单升级
请检查是否存在upgrade方法,如
/**
* 插件升级方法
* @return bool
*/
public function upgrade()
{
//如果菜单有变更则升级菜单
Menu::upgrade('mydemo', $this->menu);
return true;
}调用Menu::upgrage('插件标识', 菜单数组);会自动进行菜单的升级
会员中心菜单
如果我们开发的插件有前台会员中心菜单,我们可以通过在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
菜单规则
通常情况下我们在后台控制器的所有public方法都需要添加到菜单规则中,特别是在继承自\app\common\controller\Backend这个后台基类控制器的时候,由于基类中存在使用traits引入CRUD的基础方法,因此add/edit/del/index/recyclebin/multi/restore/destroy这几个方法也需要添加到菜单规则中。
如果我们的控制器没有相应add/edit/del/index/recyclebin/multi/restore/destroy的功能,此时我们需要在当前控制器添加相应的方法来阻止自动继承的基类控制器方法,如下:
切记不可以在$noNeedLogin和$noNeedRight中配置index/add/edit/del/recyclebin/restore/multi这几个方法!!!
//列表
public function index() {
return;
}
//添加
public function add() {
return;
}
//编辑
public function edit($ids = null) {
return;
}
//删除
public function del($ids = null) {
return;
}
//回收站列表
public function recyclebin() {
return;
}
//回收站(真实删除或清空)
public function destroy($ids = null) {
return;
}
//回收站还原
public function restore($ids = null) {
return;
}
//批量操作(修改状态)
public function multi($ids = null) {
return;
}常见问题
- 开发阶段由于创建了错误的后台菜单,导致安装插件时索引错误,此时可以到
权限管理->规则菜单中去删除错误的菜单规则。 - 插件卸载重装后,管理组权限菜单需要重新分配,否则对应的管理员会没有相关权限。