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

07.03.2014

По умолчанию, в 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
Похожие записи

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