Drupal → Как программно установить активный пункт меню

14.07.2010

Код, который при просмотре ноды с идентификатором 10, устанавливает активный пункт меню с адресом taxonomy/term/1:

/**
 * Implements hook_init()
 */
function mymodule_init() {
  $item = menu_get_item();
  if ($item['path'] == 'node/%' && $item['page_arguments'][0]->nid == 10) {
    $item['href'] = 'taxonomy/term/1';
    menu_set_item(NULL, $item);
  }
}

Важно: в $item['href'] нужно передавать внутренний путь друпала, а не синоним.

Добавлено 20/02/2012: в Drupal 7.12 этот метод работать перестал. Временное решение:

/**
 * Implements hook_init()
 */
function mymodule_init() {
  $item = menu_get_item();
  if ($item['path'] == 'node/%' && $item['page_arguments'][0]->nid == 10) {
    menu_tree_set_path('main-menu', 'taxonomy/term/1');
  }
}

или

/**
 * Preprocess function for page.tpl.php
 */
function mymodule_preprocess_page(&$variables) {
  if ($variables['page'] && $variables['node']->nid == 10)   
    menu_set_active_item('taxonomy/term/1');
  }
}

насчёт последнего способа не уверен, так как он изменяет служебную переменную $_GET['q'], что может привести к непредсказуемым последствиям.

Написанное актуально для
Drupal 6, Drupal 7
Похожие записи

Комментарии

Гость
12.06.2011, 12:09

Благодарю! очень помогло потому что было на поверхности, а я городил огород через написание своего вывода меню. оно конечно работало, но лучшее решение - простое :)

Алексей
13.10.2012, 12:40

Не подскажите как сделать, чтобы пункт который ведет на адрес "news" был активным при адресах:
news
news/politic - синоним термина таксономии
news/politic/nazvanie_novosti
?

Роман
08.01.2013, 23:08

Добрый вечер !

А не подскажете, как создать пункт меню в определенной ветке при добавлении новой ноды определенного типа, если пользователь вдруг забудет в диалоге добавления ноды выбрать автоматическое добавление ссылки в меню ?

Или можно ли сделать так, чтобы при создании нод определенного типа пункт "Создать ссылку в меню" включатся и в нём бы автоматически выставлялись определенные параметры, например, родительское меню ?

в настройках типа материала можно включить

Роман
09.01.2013, 10:43

Понятно.

А как решить вопрос установки родительского меню в зависимости не только от типа материала, но и от типа материала и языка ?

То есть, чтобы русскоязычная страница типа "Услуга" имела родительским пункт "Услуги", а англоязычная - пункт "Services" ?

Даже после установки i18n я не нашел, чтобы родительские меню можно было устанавливать в зависимости от языка.

А для Drupal 8 как это сделать программно?
Модуль menu_position это делает, но иногда нужно задать более сложные условия программно.
Спасибо.

Добавить комментарий