🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 创建后台菜单 菜单数据以数组形式定义,定义好之后可以通`create_menu`函数手动创建菜单,通过`del_menu`函数来手动删除菜单。当然,除了以上方式还支持系统自动判断导入菜单,请参考下面的自动导入方式。 ## 字段说明 <blockquote class="danger"><p>2.1.220220版本之前,字段需要填写完整</p></blockquote> | 字段名 | 说明 | 默认值 | 是否必填 | | --- | --- | --- | --- | | parent_id | 父菜单ID或父菜单的name,默认0,表示最顶级 | 0 | - | | title | 菜单名称,菜单多语言目前需要在admin_route后台路由事件中手动导入菜单语言包 | - | 必填 | | name | 权限规则 | - | 必填 | | route | 路由 | | - | | icon| 图标 | fas fa-align-ustify/far fa-circle | - | | remark | 备注 | | -| | weigh | 排序 | 0 | - | | type | 类型:0-权限规则,1-菜单,2-菜单头(提供的额外标识) | 1 | - | | child | 子级菜单,有子级的话按一级菜单字段填写即可 | - | - | 1. name,权限规则 写法:控制器/方法,二级文件夹则是文件夹名/控制器/方法,注意二级需要填写路由 2. route,路由地址 写法:文件夹名.控制器/方法,常用于有文件夹的情况,注意是“点” 3. icon,图标 基于`fontawesome`,一级菜单默认为`fas fa-align-justify`,二级菜单默认`far fa-circle` 图标地址:<a href="https://fa5.dashgame.com/#/图标">https://fa5.dashgame.com/#/图标</a> 4. type,菜单类型 未填写`type`时系统会自动判断菜单类型,在认为有子级情况下认为是菜单。若有特殊情况,您需要填写`type`字段 ## 自动导入示例 在插件名称类里面增加公共属性`$menu`,在安装时检测到有这个属性就会自动导入,另外在`卸载`、`启用`、`禁用`、`更新`等操作时系统会自动对菜单进行相应的操作,例如插件禁用,菜单也会被禁用。 > 注意:如果菜单已存在并且这个菜单不属于该插件就不会导入,如果已存在,属于该插件则是更新菜单。 > 插件升级操作时,同样会根据menu导入,如果存在则是更新该菜单,如有额外处理,可在upgrade方法中操作 ~~~ <?php declare (strict_types=1); namespace addons\demo; use think\Addons; class Demo extends Addons { // 菜单 public $menu = [ [ 'title'=>'插件测试', 'name'=>'demo', 'child'=>[ ['title'=>'查看','name'=>'demo/index'], ['title'=>'添加','name'=>'demo/add'], ['title'=>'修改','name'=>'demo/edit'], ['title'=>'删除','name'=>'demo/del'], ] ] ]; public function install() { return true; } public function uninstall() { return true; } } ~~~ ## 菜单多语言 在插件目录,在data目录下创建zh-cn.php文件,如下图 ![](https://img.kancloud.cn/a1/45/a14511db706c16ac94ad71d4e4739bdc_212x111.png) 目前后台内置的中英语言包、因此在上面讲的$menu变量里面title全部写成英文,然后下面的写上英文跟中文的对照。 ~~~ <?php return [ 'Addon test' => '插件測試' ]; ~~~ 支持其他语言包写法,例如繁体中文命名为:zh-tw.php,那么代码如下: ~~~ <?php return [ 'Addon test' => '插件測試' ]; ~~~ 创建文件后我们需要在插件初始化时加载语言包 ~~~ public function addonsInitHook() { // 获取语言包对象 $lang = app()->lang; // 加载语言包,$this->addon_path 插件目录,DIRECTORY_SEPARATOR 是 '/' 或 '\',$lang->getLangset() 是当前语言 $lang->load($this->addon_path.'data'.DIRECTORY_SEPARATOR.$lang->getLangset().'.php'); } ~~~ ## 手动导入 如下,我们可以创建PHP文件,放到插件的data目录下,如下 ![](https://img.kancloud.cn/32/5c/325c9630822f033e706715b5654217aa_294x148.png) ~~~ <?php return [ [ // 父菜单ID或父菜单name或0 "parent_id" => 57, // 标题 "title" => '菜单名称', // 权限认证规则 "name"=>"createhtml", // 路由地址 "route" => "", // fontawesome 图标 "icon" => 'fas fa-print', // 备注 "remark" => "", // 排序 "weigh" => 10, // 菜单类型 "type" => 1, // 子级 "child"=>[ [ // 标题 "title" => '菜单名称1', // 权限认证规则 "name"=>"createhtml/index1", // 子级 "child"=>[ ["title" => '菜单名称2',"name"=>"createhtml/index",] ] ], [ // 标题 "title" => '菜单名称3', // 权限认证规则 "name"=>"createhtml/index", ] ] ], ]; ~~~ 在安装的时候导入,使用`create_menu`方法导入。导入后无需管禁用、启用与卸载的操作了,系统会自动去操作菜单。 ~~~ public function install() { // 菜单数组文件路径 $menu = include $this->addon_path.'data'.DIRECTORY_SEPARATOR.'menu.php'; // 参数一给路径,参数二给当前插件的标识 create_menu($menu,$this->getName()); return true; } ~~~ ## 方法的使用 - create_menu 创建菜单 参数1为菜单数组,参数2为菜单属于的插件标识。 > 注意:如果菜单已存在并且这个菜单不属于该插件就不会导入,如果已存在,属于该插件则是更新菜单 ``` // 在插件里面可以直接获取到插件标识,当然你也可以直接写上你的插件标识 create_menu($menu, $this->getName()); ``` - status_menu 更改状态:启用与禁用. 参数1为:1=启用,0=禁用,参数2为插件名称标识 ~~~ status_menu(1, $this->getName()); // 启用菜单 ~~~ ~~~ // 例如插件叫demo status_menu(0, 'demo'); // 禁用demo的菜单 ~~~ - del_menu 删除菜单 ~~~ // 参数1为插件标识 del_menu($name); ~~~