Yii2 左侧菜单子级无法高亮的问题

前边安装采用了adminLte后台模板和menu配置之后出现了一个问题,就是点击相关controller的create、update、view这些action的时候不能定位到index的模块,左侧的二级菜单导航不能正常的展开定位高亮,下面说一下原因及解决办法。

首先来找一下处理左侧菜单的代码

目录:{project}/backend/views/layouts/left.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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;
};
?>
<?= dmstr\widgets\Menu::widget([
'options' => ['class' => 'sidebar-menu'],
'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id,null,$callback),
]); ?>

看到这里,我们不妨打开文件dmstr\widgets\Menu看看这里是怎么实现左侧菜单选中这一困扰众多同学的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
protected function isItemActive($item)
{
if (isset($item['url']) && is_array($item['url']) && isset($item['url'][0])) {
$route = $item['url'][0];
if ($route[0] !== '/' && Yii::$app->controller) {
$route = Yii::$app->controller->module->getUniqueId() . '/' . $route;
}
$arrayRoute = explode('/', ltrim($route, '/'));
$arrayThisRoute = explode('/', $this->route);
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;
}
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;
}

修改代码解决菜单不高亮的问题

目录:看上面的代码,也就是说左侧菜单高亮的情况是当前路由完全等于菜单路由时菜单才进行激活。我们这里只需要稍稍调整下代码,判断控制到controller而非action即可,但是源码文件我们又不能修改,这里我们拷贝{project}/vendor/dmstr/yii2-adminlte-asset/widgets/Menu.php文件到{project}/backend/components/Menu.php,然后按照下面的方法修改isItemActive方法即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
protected function isItemActive($item)
{
if (isset($item["url"]) && is_array($item["url"]) && isset($item["url"][0])) {
//......
//改写了路由的规则,是否高亮判断到controller而非action
$routeCount = count($arrayRoute);
if ($routeCount == 2) {
if ($arrayRoute[0] !== $arrayThisRoute[0]) {
return false;
}
} elseif ($routeCount == 3) {
if ($arrayRoute[0] !== $arrayThisRoute[0]) {
return false;
}
if (isset($arrayRoute[1]) && $arrayRoute[1] !== $arrayThisRoute[1]) {
return false;
}
} else {
return false;
}
// 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;
// }
//......
return true;
}
return false;
}

如此一来,菜单高亮的问题解决了。

坚持原创技术分享,您的支持将鼓励我继续创作!