Еще некоторые возможности темизации меню в Drupal 7

В одной из статей я уже писал, как сделать раскрывающееся меню с уникальными классами, но встречаются и другие моменты, которые если не знать, то сходу и не догадаешься. В этом примере я добавлю в обертку нужного мне меню классы и темизирую ссылки внутри.

А теперь подробнее.

Мне нужно сделать вывод главного меню в таком виде:

  1. <ul class="topNav">
  2. <li class="first expanded"><span><a href="/about" title="">О компании</a></span>
  3. <ul class="topNav">
  4. <li class="first"><a href="/" title="" class="active">Новости</a></li>
  5. <li><a href="/" title="" class="active">Вакансии</a></li>
  6. <li class="last"><a href="/" title="" class="active">Сотрудничество</a></li>
  7. </ul>
  8. </li>
  9. <li><span><a href="/" title="" class="active">Объекты</a></span></li>
  10. <li class="last"><span><a href="/" title="" class="active">Контакты</a></span></li>
  11. </ul>

Друпал же нам предлагает свой вариант примерно такой:

  1. <ul id="main-menu-links" class="menu">
  2. <li class="first expanded"><a href="/about" title="">О компании</a>
  3. <ul class="topNav">
  4. <li class="first"><a href="/">Новости</a></li>
  5. <li><a href="#">Вакансии</a></li>
  6. <li class="last"><a href="/">Сотрудничество</a></li>
  7. </ul>
  8. </li>
  9. <li><a href="#">Объекты</a></li>
  10. <li class="last"><a href="#">Контакты</a></li>
  11. </ul>

Т.е. нам тегу ul нужно присвоить класс topNav, ссылки первого уровня обернуть в тег span, ссылки второго уровня не должны быть ни во что обернуты.
Открываем в нашей теме файл template.php, знаем что наше меню имеет название main_menu. Для начала присвоим нужный нам класс тегу ul:

  1. function MYTHEME_menu_tree__main_menu($variables) {
  2. return '<ul class="topNav">' . $variables['tree'] . '</ul>';
  3. }

Далее используем функцию, которая рендерит пункты меню и оборачиваем ссылки в тег span.

  1. function MYTHEME_menu_link__main_menu(array $variables) {
  2. $element = $variables['element'];
  3. $sub_menu = '';
  4.  
  5. // т.к. нам нужно обернуть только ссылки первого уровня, переопределяем функцию, которая будет рендерить остальные
  6. if ($element['#below']) {
  7. foreach ($element['#below'] as $key => $val) {
  8. if (is_numeric($key)) {
  9. $element['#below'][$key]['#theme'] = 'menu_link__main_menu_inner';
  10. }
  11. }
  12. $sub_menu = drupal_render($element['#below']);
  13. }
  14. $output = '<span>'.l($element['#title'], $element['#href'], $element['#localized_options']).'</span>';
  15. return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
  16. }

Теперь пишем функцию, которая рендерит внутренние ссылки:

  1. function MYTHEME_menu_link__main_menu_inner($variables) {
  2. $element = $variables['element'];
  3. $sub_menu = '';
  4.  
  5. if ($element['#below']) {
  6. $sub_menu = drupal_render($element['#below']);
  7. }
  8. $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  9. return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
  10. }