继续上一篇,咱们接着说yii2-admin中的menu。php
传送门bootstrap
接下来讲一下菜单,我想这也是你们都很在乎的一块。咱们指望获得一种结果,当一个角色登录后,ta只会看到和本身相关的菜单。数组
看看yii2-admin如何去实现~浏览器
为了更清晰的使用和理解,咱们先构造一个权限系统做为例子,如图。yii2
话说菜单也是须要配置的,打开yii2-admin的Menu,而后创建能被yii2-admin控制的菜单。app
一个一个说吧yii
咱们新建了以下单的菜单函数
如今咱们已经有了带角色功能的菜单,如今开始在视图中使用它。post
好在yii2-admin提供了一个方法来得到某个角色的菜单数组url
use mdm\admin\components\MenuHelper; MenuHelper::getAssignedMenu(Yii::$app->user->id)
咱们使用MenuHelper来得到登陆会员的角色菜单,它返回一个多维数组,以下面代码这样。
[ [ 'label' => $menu['name'], 'url' => [$menu['route']], 'items' => [ [ 'label' => $menu['name'], 'url' => [$menu['route']] ], .... ] ], [ 'label' => $menu['name'], 'url' => [$menu['route']], 'items' => [ [ 'label' => $menu['name'], 'url' => [$menu['route']] ] ] ], .... ]
这个你熟悉吧,yii2的nav挂件须要的数组格式。
来实战下,在goods/index视图写以下代码
use mdm\admin\components\MenuHelper; \yii\helpers\VarDumper::dump(MenuHelper::getAssignedMenu(Yii::$app->user->id),10,true);die();
下面咱们分别用 abei(master-role角色)和abei-kefu(kefu-role角色)登陆,看看效果。
很高兴,从结果验证了yii2-admin很聪明的按照角色返回菜单数组了。
ok,如今咱们回过头来讲新建菜单时候的那个Data区域,我如今有个需求,刚才我创建了名字为goods、goods-index、goods-create的菜单,可是我不想这样显示,我但愿在浏览器上的显示为“商品管理”、“商品列表”、“新建商品”。
用Data区域就能够实现此目的。
固然核心是用yii2-admin对MenuHelper::getAssignedMenu返回的菜单数组进行格式化的功能,那开始吧,只需在goods/index的视图里增长一个回调函数,以下
use mdm\admin\components\MenuHelper; $callback = function($menu){ $data = $menu['data']; return [ 'label' => $data ? $data : $menu['name'], 'url' => [$menu['route']], 'items' => $menu['children'] ]; }; $items = MenuHelper::getAssignedMenu(Yii::$app->user->id, null, $callback); \yii\helpers\VarDumper::dump($items,10,true);die();
其中的$menu['data']就是咱们填写的值,固然其实这个区域能够填写更多复杂的东东(好比一句PHP语句)。个人逻辑很简单,对于每个菜单项,若是有设置data值,则用data值替代name成为显示的label,不然仍是用name;
看看结果吧
又学会了一点点,继续往下,到如今咱们获得了一个数组,下面来作一个实际效果,将这个数组弄到yii2的菜单中
// view/goods/index use mdm\admin\components\MenuHelper; use yii\bootstrap\Nav; $callback = function($menu){ $data = $menu['data']; return [ 'label' => $data ? $data : $menu['name'], 'url' => [$menu['route']], 'items' => $menu['children'] ]; }; $items = MenuHelper::getAssignedMenu(Yii::$app->user->id, null, $callback); echo Nav::widget(['items'=>$items]);
好,就是我想要的。到此刻咱们构造出了一个二维的菜单,固然多维也是同样的逻辑,这里还要说一个地方。
要说的是这个函数的第二个参数,默认为null,获取整个菜单结构,当咱们为其传递一个菜单节点的时候,则能够得到该节点的子菜单。
可是要注意的是:参数值是节点菜单的ID,而不是name,这点要切记。
咱们前面是经过登录会员获得对应菜单数组而后渲染,在世界上还有一种情景就是一个完整的菜单就放到那里,会员登录后筛选出本身的部分。
好在yii2-admin也能够帮咱们实现,咱们来code下。
use mdm\admin\components\Helper; // 完整的菜单 $menuItems = [ ['label' => '', 'url' => ['/site/index']], ['label' => 'About', 'url' => ['/site/about']], ['label' => 'Contact', 'url' => ['/site/contact']], ['label' => '商品管理', 'items' => [ ['label' => '商品列表', 'url' => ['/goods/index']], ['label' => '新建商品', 'url' => ['/goods/create']], ]] ]; $menuItems = Helper::filter($menuItems); echo Nav::widget([ 'options' => ['class' => 'navbar-nav navbar-right'], 'items' => $menuItems, ]);
咱们经过Helper::filter函数对其进行了筛选,看看结果
从结果你应该能知道,这是一次很是严格的筛选,首先要根据yii2-admin设置的menu匹配,而后你还要有权限的才会显示,很严格。
从上面的例子咱们知道在视图里主要靠 mdmadmincomponentsHelper 来搞定这些事情,它还提供了一个checkRoute,参数是一个路由,用来判断当前会员是否对某个路由有权限,好比以下代码
use mdm\admin\components\Helper; if(Helper::checkRoute('/goods/delete')){ //... }
到此刻位置,yii2-admin关于menu的使用就完事了,固然细节还有很多,之后慢慢慢说。
当咱们使用GridView的时候,通常最后一列都是一对action按钮,那么不一样的角色对这些按钮可能操做权限是不一样的,yii2-admin也为咱们提供了这个场景的筛选,见代码
use mdm\admin\components\Helper; 'columns' => [ ... [ 'class' => 'yii\grid\ActionColumn', 'template' => Helper::filterActionColumn('{view}{delete}{posting}'), ] ]
对,使用 Helper::filterActionColumn就能够,固然你在GridView的buttons里用Helper::checkRoute来判断我也没意见,喜欢哪一个用哪一个。
到此刻为止,咱们用3篇把yii2-admin官方的文档 + 一点小例子就算说完了,算是一个入门级的中文文档,接下来咱们会对这个扩展那些细节配置及实际使用中的情景进行解说,明天继续聊。