yii2 左侧菜单子级无法高亮的问题,yii2菜单子
作者:白狼 出处:http://www.manks.top/question/20160508000001.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
前面我们写的文章yii2 rbac权限控制之菜单menu详细教程,很完美,也很实用,鉴于不少小伙伴咨询的问题,这里做一个统一的说明。我们先来看看具体问题。
添加角色是属于角色这个菜单的,如何在执行添加角色这个操作时让角色这个菜单处于选中状态呢?
adminlte左侧导航的Create,View等action不能定位到index的模块(左侧二级导航不能展开定位)
如果你是按照我们上文的教程来的,那接下来所要说明的问题应该不是问题,先来看看我们当时是怎么处理左侧菜单menu的
<span>use</span><span> mdm\admin\components\MenuHelper; </span><?<span>php </span><span>$callback</span> = <span>function</span>(<span>$menu</span><span>){ </span><span>//</span><span>鉴于篇幅有限,这里的代码省略,源码见于原文</span> <span>}; </span><span>//</span><span>这里我们对一开始写的菜单menu进行了优化</span> <span>echo</span> dmstr\widgets\Menu::<span>widget( [ </span>'options' => ['class' => 'sidebar-menu'], 'items' => MenuHelper::getAssignedMenu(Yii::<span>$app</span>->user->id, <span>null</span>, <span>$callback</span>),<span> ] ); </span>?>
看到这里,我们不妨打开文件dmstr\widgets\Menu看看这里是怎么实现左侧菜单选中这一困扰众多同学的问题。
<span>protected</span> <span>function</span> isItemActive(<span>$item</span><span>) { </span><span>if</span> (<span>isset</span>(<span>$item</span>['url']) && <span>is_array</span>(<span>$item</span>['url']) && <span>isset</span>(<span>$item</span>['url'][0<span>])) { </span><span>//</span><span>......</span> <span>if</span> (<span>$arrayRoute</span>[0] !== <span>$arrayThisRoute</span>[0<span>]) { </span><span>return</span> <span>false</span><span>; } </span><span>if</span> (<span>isset</span>(<span>$arrayRoute</span>[1]) && <span>$arrayRoute</span>[1] !== <span>$arrayThisRoute</span>[1<span>]) { </span><span>return</span> <span>false</span><span>; } </span><span>if</span> (<span>isset</span>(<span>$arrayRoute</span>[2]) && <span>$arrayRoute</span>[2] !== <span>$arrayThisRoute</span>[2<span>]) { </span><span>return</span> <span>false</span><span>; } </span><span>//</span><span>......</span> <span>return</span> <span>true</span><span>; } </span><span>return</span> <span>false</span><span>; }</span>
看吧,看上面的代码,也就是说左侧菜单激活的情况是当前路由完全等于菜单路由时菜单才进行激活。
鉴于我们一开始谈到的不少小伙伴疑惑的两个问题,我们这里只需要稍稍调整下代码,判断控制到controller而非action即可,但是源码文件我们又不能修改,怎么办好呢?天热,凉拌。
这里我们拷贝dmstr\widgets\Menu.php文件到backend\components\Menu.php,然后按照下面的方法修改isItemActive方法即可
<span>protected</span> <span>function</span> isItemActive(<span>$item</span><span>) { </span><span>if</span> (<span>isset</span>(<span>$item</span>['url']) && <span>is_array</span>(<span>$item</span>['url']) && <span>isset</span>(<span>$item</span>['url'][0<span>])) { </span><span>//</span><span>...... //改写了路由的规则,是否高亮判断到controller而非action</span> <span>$routeCount</span> = <span>count</span>(<span>$arrayRoute</span><span>); </span><span>if</span> (<span>$routeCount</span> == 2<span>) { </span><span>if</span> (<span>$arrayRoute</span>[0] !== <span>$arrayThisRoute</span>[0<span>]) { </span><span>return</span> <span>false</span><span>; } } </span><span>elseif</span> (<span>$routeCount</span> == 3<span>) { </span><span>if</span> (<span>$arrayRoute</span>[0] !== <span>$arrayThisRoute</span>[0<span>]) { </span><span>return</span> <span>false</span><span>; } </span><span>if</span> (<span>isset</span>(<span>$arrayRoute</span>[1]) && <span>$arrayRoute</span>[1] !== <span>$arrayThisRoute</span>[1<span>]) { </span><span>return</span> <span>false</span><span>; } } </span><span>else</span><span> { </span><span>return</span> <span>false</span><span>; } </span><span>//</span><span> if ($arrayRoute[0] !== $arrayThisRoute[0]) { // return false; // } // if (isset($arrayRoute[1]) && $arrayRoute[1] !== $arrayThisRoute[1]) { // return false; // } // if (isset($arrayRoute[2]) && $arrayRoute[2] !== $arrayThisRoute[2]) { // return false; // } //......</span> <span>return</span> <span>true</span><span>; } </span><span>return</span> <span>false</span><span>; }</span>
大功告成,现在我们左侧的菜单引用的Menu文件修改其指向到backend\components\Menu
<span>use</span><span> backend\components\Menu; </span><span>echo</span> Menu::<span>widget([ </span>'options' => ['class' => 'sidebar-menu'], 'items' => MenuHelper::getAssignedMenu(Yii::<span>$app</span>->user->id, <span>null</span>, <span>$callback</span>),<span> ]); </span>
快去试试看我们的问题解决没有吧。
menuyii2

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中