xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Код, который при просмотре ноды с идентификатором 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
Похожие записи

Комментарии RSS

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

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

Спасибо!

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

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

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

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

Понятно.

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

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

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании