drupal7指定menu高亮问题

起因:
项目要求在一个内容内页中高亮某个menu,而这个menu与内容不相关。drupal的menu高亮,其实是给menu中的li添加active class并会显示出这个menu下的sub-menu。但默认只有两种情况:
1. 当前地址与menu指向的地址一致; 
2. 当前地址与menu的某个sub-menu指向的地址一致
而目前这个内容页并没有关联某个menu。
分析:
到官方search了一下,发现有menu_set_active_item这个API可以设置当前menu,还有两个回复解决方法,就用这个方法试试。
解决过程:
我把以下代码写在template.php里面
theme_preprocess_page(&$variables) {
   if(isset ($variables['node']->type) && $variables['node']->type == 'article')   
     menu_set_active_item('mypath');
   }
}

menu的确高亮了!但整个页面显示了mypath的内容,没有到article内页。

menu_set_active_item的源代码很简单:
function menu_set_active_item($path) {
  $_GET['q'] = $path;
}

原来这个函数只是设置path,而因为module都依赖path来确认当前路径,所以这个函数会导致页面显示不正常。按照这个线索,就可以很容易地实现我想要的效果。

因为我的menu是用menu_block来输出,所以就在menu_block_block_view的添加代码
if(arg(0) == 'node' && is_numeric(arg(1))) {
  $node = node_load(arg(1));
  if(isset ($node->type) && $node->type == 'news') {
      $old_q = $_GET['q'];
      $_GET['q'] = 'news-list';
  }
}

结果成功了!

ps: 其实原理就是在menu输出之前把path修改,让menu误以为当前页是你指定的path,到menu输出之后需要把path恢复,否则将会影响其他module。

原文地址:https://www.cnblogs.com/catcat811/p/2151850.html