北哥這篇文講解yii2權限擴展(yii2-admin) - 下部

繼續上一篇,咱們接着說yii2-admin中的menu。php

傳送門bootstrap

Menu

接下來講一下菜單,我想這也是你們都很在乎的一塊。咱們指望獲得一種結果,當一個角色登錄後,ta只會看到和本身相關的菜單。數組

看看yii2-admin如何去實現~瀏覽器

爲了更清晰的使用和理解,咱們先構造一個權限系統做爲例子,如圖。yii2

權限結構

話說菜單也是須要配置的,打開yii2-admin的Menu,而後創建能被yii2-admin控制的菜單。app

新建菜單表單

一個一個說吧yii

  • ① 菜單的名字,這個不用多說了
  • ② 父級,若是沒有不用填寫,有則寫父級菜單名字
  • ③ Route,這個是重要的,這些就是咱們歸入了yii2-admin體系的路由列表,好比我本次的goods下的action
  • ④ 排序,同級菜單的排序,按照所填數字從小向大升序來。
  • ⑤ 數據,這裏留坑,即將填。

咱們新建了以下單的菜單函數

菜單結構

如今咱們已經有了帶角色功能的菜單,如今開始在視圖中使用它。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;

看看結果吧

data還能夠作更多

又學會了一點點,繼續往下,到如今咱們獲得了一個數組,下面來作一個實際效果,將這個數組弄到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]);

alt

好,就是我想要的。到此刻咱們構造出了一個二維的菜單,固然多維也是同樣的邏輯,這裏還要說一個地方。

getAssignedMenu

要說的是這個函數的第二個參數,默認爲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匹配,而後你還要有權限的纔會顯示,很嚴格。

關於Helper::checkRoute

從上面的例子咱們知道在視圖裏主要靠 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官方的文檔 + 一點小例子就算說完了,算是一個入門級的中文文檔,接下來咱們會對這個擴展那些細節配置及實際使用中的情景進行解說,明天繼續聊。


簽名檔

相關文章
相關標籤/搜索