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

Drupal → Как получить имя меню в theme_menu_tree()

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

По умолчанию, в theme_menu_tree() нет никаких переменных кроме tree, которая содержит отрендеренные элементы меню. Так получилось из-за того, что в препроцесс функции template_preprocess_menu_tree() затирается всё, что лежит в $variables['tree'] (говнокод детектед):

function template_preprocess_menu_tree(&$variables) {
  $variables['tree'] = $variables['tree']['#children'];
}

Решение:

/**
 * Implements hook_theme_registry_alter().
 */
function MODULENAME_theme_registry_alter(&$theme_registry) {
  array_unshift($theme_registry['menu_tree']['preprocess functions'], 'MODULENAME_prepreprocess_menu_tree');
}
 
/**
 * Pre-preprocess fucntion for template_preprocess_menu_tree().
 */
function MODULENAME_prepreprocess_menu_tree(&$vars) {
  $first_element_key = current(element_children($vars['tree']));
  $first_element = $vars['tree'][$first_element_key];
  $vars['menu_name'] = $first_element['#original_link']['menu_name'];
}

После этого в theme_menu_tree() станет доступна переменная menu_name:

/**
 * Override theme_menu_tree().
 */
function THEMENAME_menu_tree($vars) {
  $classes_array = array('menu', 'menu-' . $vars['menu_name']);
  return '<ul class="' . implode(' ', $classes_array) . '">' . $vars['tree'] . '</ul>';
}
Написанное актуально для Drupal 7
Похожие записи

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

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

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