Drupal → Уникальные классы пунктов меню

05.07.2013

У системных меню, выведенных в page.tpl.php с помощью theme_links() есть приятная особенность — все пункты обладают уникальным css классом на основе их идентификатора. В меню же, выводимых модулем Block, таких классов увы нет. Решаем проблему:

// template.php

/**
 * Implements hook_preprocess_menu_link().
 */
function THEMENAME_preprocess_menu_link(&$vars) {
  $vars['element']['#attributes']['class'][] = 'menu-item-' . $vars['element']['#original_link']['mlid'];
}

Результат:

DOM

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

Комментарии

Евгений
09.07.2013, 17:20

Спасибо! Как раз то что нужно. А как можно добавить класс для активного пункта меню?

сравнивайте текущий адрес с $vars['element']['#href']

Гость
23.04.2014, 22:21

Спасибо тебе большое, ты меня очень выручил. Респект. Долгих тебе лет жизни....

Гость
13.12.2014, 15:12

Перерыл весь интернет. Решение, похоже, есть только на jQuery. Каким образом можно задавать различные классы уровням меню - ul?

/**
 * Implements hook_theme_registry_alter().
 */
function MODULENAME_theme_registry_alter(&$theme_registry) {
  array_unshift($theme_registry['menu_tree']['preprocess functions'], 'MODULENAME_prepreprocess_menu_tree');
}

/**
 * Preprocess fucntion for theme_menu_tree().
 */
function MODULENAME_prepreprocess_menu_tree(&$vars) {
  $first_element_key = current(element_children($vars['tree']));
  $vars['menu_depth'] = $vars['tree'][$first_element_key]['#original_link']['depth'];
}

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

Гость
09.03.2017, 17:43

На мобильной версии почему-то класс пропадает?(пункты меню под катом).

Гость
13.03.2017, 12:55

Очень нужен ответ на предыдущий коммент. Спасибо

а как добавить класс для элемента ul в меню?

всё, сам нашел

function theme_menu_tree($variables) {
return '

    ' . $variables['tree'] . '

';
}

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