解决yii2左侧菜单子级无法高亮问题的方法


Posted in PHP onMay 08, 2016

我们先来看看具体问题。
添加角色是属于角色这个菜单的,如何在执行添加角色这个操作时让角色这个菜单处于选中状态呢?
adminlte左侧导航的Create,View等action不能定位到index的模块(左侧二级导航不能展开定位)
如果你是按照我们上文的教程来的,那接下来所要说明的问题应该不是问题,先来看看我们当时是怎么处理左侧菜单menu的

use mdm\admin\components\MenuHelper; 
<?php 
$callback = function($menu){ 
 //鉴于篇幅有限,这里的代码省略,源码见于原文
}; 
//这里我们对一开始写的菜单menu进行了优化
echo dmstr\widgets\Menu::widget( [ 
 'options' => ['class' => 'sidebar-menu'], 
 'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id, null, $callback), 
] ); ?>

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

protected function isItemActive($item)
{
 if (isset($item['url']) && is_array($item['url']) && isset($item['url'][0])) {
  //......
  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;
}

看吧,看上面的代码,也就是说左侧菜单激活的情况是当前路由完全等于菜单路由时菜单才进行激活。

鉴于我们一开始谈到的不少小伙伴疑惑的两个问题,我们这里只需要稍稍调整下代码,判断控制到controller而非action即可,但是源码文件我们又不能修改,怎么办好呢?天热,凉拌。

这里我们拷贝dmstr\widgets\Menu.php文件到backend\components\Menu.php,然后按照下面的方法修改isItemActive方法即可

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;
}

大功告成,现在我们左侧的菜单引用的Menu文件修改其指向到backend\components\Menu

use backend\components\Menu;
echo Menu::widget([
 'options' => ['class' => 'sidebar-menu'],
 'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id, null, $callback),
]);

快去试试看我们的问题解决没有吧。

PHP 相关文章推荐
php用数组返回无限分类的列表数据的代码
Aug 08 PHP
PHP的explode和implode的使用说明
Jul 17 PHP
利用中国天气预报接口实现简单天气预报
Jan 20 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 PHP
PHP 常用的header头部定义汇总
Jun 19 PHP
PHP发送短信代码分享
Aug 11 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 PHP
php 实现银联商务H5支付的示例代码
Oct 12 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 PHP
php面向对象编程self和static的区别
May 08 #PHP
Laravel与CI框架中截取字符串函数
May 08 #PHP
PHP框架性能测试报告
May 08 #PHP
Thinkphp单字母函数使用指南
May 08 #PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 #PHP
PHP+Ajax+JS实现多图上传
May 07 #PHP
php实现图片上传、剪切功能
May 07 #PHP
You might like
PHP DataGrid 实现代码
2009/08/12 PHP
php购物车实现代码
2011/10/10 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python实现栈的方法
2015/05/26 Python
python抽象基类用法实例分析
2015/06/04 Python
Python字符串格式化输出方法分析
2016/04/13 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
python下载微信公众号相关文章
2019/02/26 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
公司道歉信范文
2014/01/09 职场文书
会计出纳员的自我评价
2014/01/15 职场文书
二人合伙经营协议书
2014/09/13 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android