Как реализовать подсветку активного пункта меню?

Главные вкладки

Аватар пользователя Erly Erly 3 апреля 2011 в 16:56

Всем доброго воскресенья!

Возникла, задача и, как бы, решение к ней. Может есть решение лучше?

Задача:
У друпала, подсвечивается активный пункт меню (в теги li и а ставится класс active).
Я делаю следующее: создаю тип ноды "super_type_node", создаю вьюху-страницу, которой вывожу перечень нод типа "super_type_node". Для этой вьюхи-страницы делаю пункт в главное меню. Когда мы находимся на странице-вьюхи, всё хорошо, пункт меню подсвечивается как активный. НО! Когда мы с этой вьюхи переходим на ноду, то пункт меню уже не подсвечивается как активный.
Например, тут: http://www.drupal.ru/blog, подсвечивается пункт меню "Блог", а если перейти на к.-либо ноду, то пункт меню уже не подсвечивается :(.

Я придумал задачу решать так: в файл template.php своей темы пишу

<?php

function МОЯ_ТЕМА_preprocess_page(&$variables) {
  if (isset(
$variables['node']) ) {
    if ( 
тут проверяем мой тип ноды или нет ) {
        
$variables['main_menu']['menu-НОМЕР_МОЕГО_ПУНКТА active-trail active'] =  $variables['main_menu']['menu-НОМЕР_МОЕГО_ПУНКТА'] ;
        
$variables['main_menu']['menu-НОМЕР_МОЕГО_ПУНКТА active-trail active']['attributes']['class'][0] = 'active-trail' ;
        unset (
$variables['main_menu']['menu-НОМЕР_МОЕГО_ПУНКТА']) ;
        }
          
      }

}

?>

соответсвенно можно проверять не только нужный тип ноды, но и термин таксономии, урл и т.д.
Недостаток данного метода в том, что "новый" пункт меню, будет выводиться не в нужно порядке, а самым последним. Т.о. чтобы был нужный порядок надо делать сортировку и т.д. и т.п.

СОБСТВЕННО ВОПРОС:
кто как решает такие задачи? Может и не надо велик изобрётывать, а есть для этого какой хитрый модуль?

Комментарии

Аватар пользователя alexxrin alexxrin 3 апреля 2011 в 17:54

Задачу, подобную вашей, также весьма эффективно решает модуль [module=node_breadcrumb]. Для каждого типа нодов или таксономии можно создать правила влияющие на внутренние "хлебные крошки", то есть задать им "псевдо" родительский пункт меню, так же путем включения галочки "Подсвечивать активный пункст меню" можно подсвечивать оный в зависимости от созданных вами правил.

Аватар пользователя Erly Erly 3 апреля 2011 в 20:44

"alexxrin" wrote:
node_breadcrumb.

Решение интересное, но к Drupal 7 нет версии модуля.

Хм... вроде для решения этой задачи можно использовать context... Сейчас погуглим на эту тему

Аватар пользователя Erly Erly 4 апреля 2011 в 0:03

Context вроде как круче и функциональнее, но у меня он не заработал. Ставлю условие, ставлю рекацию. На ничего нет. Кроме того субъективно сайт стал медленнее грузиться.

В общем пока останавливаюсь на menu_position.
xxandeadxx, спасибо Smile

Аватар пользователя Shi3A Shi3A 13 октября 2011 в 13:47

Самому понадобилось, поэтому переписал твой код, теперь выводится в правильном порядке:

function ТЕМА_preprocess_page(&$variables) {
  if (isset($variables['node']) ) {
    if ( $variables['node']->type == 'тип ноды' ) {
        $out = array();
        foreach ($variables['main_menu'] as $key => $value) {
        if($key == 'menu-Номер_Пункта') $out['menu-Номер_Пункта active-trail active'] = $value;
        else $out[$key] = $value;
        }
        unset ($variables['main_menu']);
        $variables['main_menu'] = $out;
        }
    if ( $variables['node']->type == 'тип ноды 2' ) {
        $out = array();
        foreach ($variables['main_menu'] as $key => $value) {
        if($key == 'menu-Номер_Пункта2') $out['menu-Номер_Пункта2 active-trail active'] = $value;
        else $out[$key] = $value;
        }
        unset ($variables['main_menu']);
        $variables['main_menu'] = $out;
        }
      }
}