n34n 2018-11-08 21:48:48 3754次浏览 2条评论 0 1 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;
}
觉得很赞
  • 评论于 2018-11-22 13:30 举报

    优化了一下方法,控制起来更灵活些,当然操作成本也多些,给碰到同样困扰的人

    #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"]}
    
    1 条回复
    评论于 2019-09-16 17:10 回复

    这种方式试过了,没用,我yii的版本是2.0.26,请问这是什么原因

  • 评论于 2020-04-24 11:46 举报

    还是看看白狼栈大佬的文章吧 轻松解决

您需要登录后才可以评论。登录 | 立即注册