Использование primary/secondary links для построения разделенного двухуровневого меню

Авторы решений:

Задача:

  • Организовать двухуровневое меню.
  • Вверху строка основных разделов (первого уровня), слева при выборе раздела появляется меню подразделов.
  • Родительский пункт в меню основных разделов остается активным при навигации по подразделам.

Решение:

Нужно сделать одно меню, создавая структуру через выбор родительских пунктов (все пункты меню можно оставить неразвернутыми), а потом в настройках меню выбрать основным (primary) и дополнительным (secondary) одно и то же меню, а в page.tpl.php прописать расположение этих самых меню в виде 'links'.
Все это по шагам можно описать так:


    получение разрешения на применение | кондитерские витрины
  1. Перейти: Админка → Конструкция → Меню
  2. Создать меню (можно создать необходимые пункты прямо в primary links - меню уже создано по умолчанию). Чтобы сделать его многоуровневым, выбирайте у пунктов родителя. Не нужно создавать 2 отдельных меню.
  3. Зайти на вкладку Настройки - выбрать:
    Меню, содержащее основные ссылки: ваше меню (Primary links)
    Меню, содержащее дополнительные ссылки: ваше меню (Primary links)
  4. Написать в нужном месте в page.tpl.php такой код:
    Для primary_links
    <?php if (isset($primary_links)) { ?><?php print theme('links', $primary_links) ?><?php } ?>

    Для secondary_links:
    <?php if (isset($secondary_links)) { ?><?php print theme('links', $secondary_links) ?><?php } ?>

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

Для того чтобы сделать родительскую ссылку с class="active", воспользуемся TemplatePHP сниппетом с этой страницы. Вставляем в template.php данный код (без закрывающего ?>).

<?php
function phptemplate_links($links, $attributes = array()) {

  if (!
count($links)) {
    return
'';
  }
 
$level_tmp = explode('-', key($links));
 
$level = $level_tmp[0];
 
$output = "<ul class=\"links-$level ".$attributes['class']. "\">\n";
  foreach (
$links as $index => $link) {
   
$output .= '<li';
    if (
stristr($index, 'active')) {
     
$output .= ' class="active"';
    }
// frontpage AND current-link in menu is <front>
   
elseif((drupal_is_front_page()) && ($link['href']=='<front>')){
     
$link['attributes']['class'] = 'active';//add class active to <li
     
$output .= ' class="active"';//add class active to <a
   
}
   
$output .= ">". l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment']) ."</li>\n";
  }
 
$output .= '</ul>';

  return
$output;
}
?>

Использованные материалы:

http://www.drupal.ru/node/13380, http://www.drupal.ru/node/3335

Creative Commons: ­Attribution-Share Alike 2.5

Данные материалы выложены под лицензией Creative Commons: ­Attribution-Share Alike 2.5. Это значит, что вы можете распространять, копировать и модифицировать эти произведения при условии упоминания авторства оригинала, и при условии, что они также будут распространяться на условиях этой лицензии (то есть, изменённую работу нельзя защитить копирайтом). Подробнее смотри: http://ru.wikipedia.org/wiki/Creative_Commons