Yii2 使用左侧菜单不高亮问题简单解决办法 [ 2.0 版本 ]
在网上找了半天没有找到解决办法,网上说更新了2.6版本后能解决,我试了下貌似解决了一半,用gii建出来的模型,一般包含index,create,update,view等方法,更新了之后index是正常高亮了,但是create等其他方法尝试了之后还是不行,不知道是我模型有问题还是什么原因,找了下大神们写的还有抄来抄去的,始终未能解决我想要实现的在同一个controller下,不管是哪个action左侧菜单都应该高亮的办法。
如果大家把每个动作都做在左侧菜单的话,请直接跳过这个方法,当我没说。
1、将 dmstr\widgets\Menu.php
文件复制到 backend\components\Menu.php
下
2、修改 isItemActive
方法,在“---- 添加的代码 ----
”夹住的代码,即为添加的代码
这是很傻的一个方法,但是有效,希望能给有用的人一点帮助或启发
protected function isItemActive($item)
{
if (isset($item['url']) && is_array($item['url']) && isset($item['url'][0])) {
$route = $item['url'][0];
if (isset($route[0]) && $route[0] !== '/' && Yii::$app->controller) {
$route = ltrim(Yii::$app->controller->module->getUniqueId() . '/' . $route, '/');
}
$route = ltrim($route, '/');
//---- 添加的代码 ----
$route = substr($route,0,strrpos($route,"/"));
if($route == Yii::$app->controller->id){
return true;
}
//---- 添加的代码 ----
if ($route != $this->route && $route !== $this->noDefaultRoute && $route !== $this->noDefaultAction) {
return false;
}
unset($item['url']['#']);
if (count($item['url']) > 1) {
foreach (array_splice($item['url'], 1) as $name => $value) {
if ($value !== null && (!isset($this->params[$name]) || $this->params[$name] != $value)) {
return false;
}
}
}
return true;
}
return false;
}
n34n
注册时间:2015-04-17
最后登录:2020-07-28
在线时长:4小时52分
最后登录:2020-07-28
在线时长:4小时52分
- 粉丝0
- 金钱30
- 威望10
- 积分170
共 2 条评论
优化了一下方法,控制起来更灵活些,当然操作成本也多些,给碰到同样困扰的人
#1 backend\components\Menu.php
protected function isItemActive($item) { if (isset($item['url']) && is_array($item['url']) && isset($item['url'][0])) { $route = $item['url'][0]; if (isset($route[0]) && $route[0] !== '/' && Yii::$app->controller) { $route = ltrim(Yii::$app->controller->module->getUniqueId() . '/' . $route, '/'); } $route = ltrim($route, '/'); /* 高亮菜单 * 包含该控制器下的所有Actions * */ //---- 添加的代码 ---- $_route = substr($route,0,strrpos($route,"/")); if(isset($item['options']['child'])){ $children = $item['options']['child']; $controllerId = Yii::$app->controller->id; $actionId = Yii::$app->controller->action->id; if($_route == $controllerId && in_array($actionId,$children)){ return true; } } //---- 添加的代码 ---- if ($route != $this->route && $route !== $this->noDefaultRoute && $route !== $this->noDefaultAction) { return false; } unset($item['url']['#']); if (count($item['url']) > 1) { foreach (array_splice($item['url'], 1) as $name => $value) { if ($value !== null && (!isset($this->params[$name]) || $this->params[$name] != $value)) { return false; } } } return true; } return false; }
#2 父级菜单的Data数据,增加child元素,这个可以自己定义的,比如/users/index路由,做到菜单里面,user控制器有增、改、查3个方法,就在/users/index的菜单Data里设置如下child数组,设置好后上方的Menu新增代码部分,就通过判断当前action在不在当前controller的child里面,从而实现是否高亮
{"icon": "flag-checkered", "visible": true,"child":["create","update","view"]}
这种方式试过了,没用,我yii的版本是2.0.26,请问这是什么原因
还是看看白狼栈大佬的文章吧 轻松解决