yii2 rbac权限控制之菜单menu详细教程

做者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归做者,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。php

前面咱们在博文 yii2搭建完美后台并实现rbac权限控制实例教程中完美实现了yii2的后台搭建和rbac权限控制,若是你尚未实现,请先看上文再回来参考本文,由于本文是在上文的基础上进行完善和补充。html

先认个错,罪过了,你将要看的这篇教程是菜单权限的扩展,若是你的菜单出不来,非常建议你参考 yii2 rbac权限控制详细操做步骤json

部分小伙们纷纷反映,最后菜单menu怎么控制权限呀,看不懂,搞不定,并且你那貌似没搞完,瞎忽悠!确实没那么全,今天看咱们如何实现菜单完美权限化。先罗列下主要讲的内容,不须要的不必看下去,只为分享给有须要的人。yii2

  • 利用menu表添加菜单app

  • 左侧菜单结果adminlte完美呈现框架

  • 菜单前面自定义icon小图标并呈现yii

  • 如何控制菜单的显示或者隐藏ide

  • 页面操做按钮没权限的不作显示优化

  • gridview中也只显示有操做权限的按钮url

嗯,差很少就这么多,若是你还有其余的有关权限控制菜单的需求,请下方留言,我们共同切磋交流。

先看图预览下大体效果,否则怎么激起大家好学的心。

首先咱们先访问路由页面 /dmin/route/index ,尽量的把左侧的所有选中,而后移动到右侧,,而后记得给当前用户分配相关的可访问权限哦。

接下来访问菜单列表 /admin/menu/index 点击添加菜单,若是这个时候你没有权限访问了,请你在配置文件的 as access文件内暂时容许当前用户访问任意权限,并在咱们添加完权限的时候去掉as access的设置,必定要记得哦,否则权限失效了可别回来找我。

这里咱们先填写上图中标红的四个字段

举个例子:咱们要添加一级菜单"权限管理"

名称请填写"权限管理",由于是一级菜单,父级名称请留空,路由咱们这里选择"/admin/default/index",注意了,若是匹配到任何路由,请访问路由页面把左侧的选中移动到右侧。

映射,其实就是排序高低的问题,好比说我添加了两个菜单,映射值为1的就在上面 值为2的就在1的下面,咱们这里填写数字1。

"数据"这一项咱们后面再说。

按照刚刚介绍的这种方式添加吧,举一个添加二级菜单"权限控制"的例子

只须要把父级名称这里填写咱们刚刚添加成功的一级名称"权限管理"便可。其余照旧。不会操做的多看两遍,这里最好把权限管理的几个菜单所有添加完毕,由于接下来咱们须要且你能够多练练手嘛。

到此咱们已经会添加菜单了。

咱们来看下一步,利用咱们以前搭建的后台框架进行展示。

use mdm\admin\components\MenuHelper; 
echo dmstr\widgets\Menu::widget( [
     'options' => ['class' => 'sidebar-menu'], 
    'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id), 
] );

 

是否是很简单,What?个人怎么没有dmstr这玩意,很差意思,已经说的不少遍,须要先看上文再有这个菜单的结合。

ok,刷新页面看看你的菜单,虽然咱们还没彻底实现咱们想要的功能,不过到此你应该能看到你的菜单展示了。

接下来将进入咱们的重点以及难点,咱们要实现菜单前面的小图标且完成菜单可隐藏控制。

还记得咱们一开始建立菜单的时候,惟一没进行填写的选项"数据"吗?为了后续操做方便,咱们这里一并把图标和隐藏的选项都填写上。咱们以开始截图中的"后台用户管理"这个二级菜单为例进行修改。截图你们先看看咱们的菜单目前的状态,

请在其更新页面的“数据”项中务必填写下面的代码,若是你有新的想法,还请先按照个人思路后面再作修改,由于后面咱们要进行操做。

{"icon": "fa fa-user", "visible": false}

 

是的,这个"数据"项咱们填写的是一段json代码,接下来咱们对展现菜单的代码也作稍微的整改,为了方便你们看代码,这里的$callback直接写在页面上了,回头你们能够继续封装优化。

use mdm\admin\components\MenuHelper; 
<?php 
$callback = function($menu){ 
    $data = json_decode($menu['data'], true); 
    $items = $menu['children']; 
    $return = [ 
        'label' => $menu['name'], 
        'url' => [$menu['route']], 
    ]; 
    //处理咱们的配置 
    if ($data) { 
        //visible 
        isset($data['visible']) && $return['visible'] = $data['visible']; 
        //icon 
        isset($data['icon']) && $data['icon'] && $return['icon'] = $data['icon']; 
        //other attribute e.g. class... 
        $return['options'] = $data; 
    } 
    //没配置图标的显示默认图标 
    (!isset($return['icon']) || !$return['icon']) && $return['icon'] = 'fa fa-circle-o'; 
    $items && $return['items'] = $items; 
    return $return; 
}; 
//这里咱们对一开始写的菜单menu进行了优化
echo dmstr\widgets\Menu::widget( [ 
    'options' => ['class' => 'sidebar-menu'], 
    'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id, null, $callback), 
] ); ?>

 继续阅读

相关文章
相关标签/搜索