Меню Drupal: создание, вывод на сайт и связь с таксономией. Drupal 7 вывести меню программно
Drupal 7: Программно вывести меню со всеми классами и уровнями
На одном из проектов возникла необходимость вывести меню в шапке сайта со всеми вложенными пунктами. Изначально меню было выведено с помощью кода в page.tpl:
<?php print theme( 'links__system_main_menu', array( 'links' => $main_menu, 'attributes' => array( 'id' => 'main-menu-links', 'class' => array('links', 'clearfix'), ), ) ); ?>Но с этим кодом одна проблема - меню выводится только первого уровня. В целом такую задачу можно было бы решить просто выводом меню блоком в новый регион. Но не хотелось менять классы, поэтому нашёл другое решение. Оно выводит меню сайта со всеми уровнями вложенности, классами(active-trail, active), в заданное место сайта.
<?php function _menu_tree_full_data($menu_name) { $tree = &drupal_static(__FUNCTION__, array()); // Check if the active trail has been overridden for this menu tree. $active_path = menu_tree_get_path($menu_name); // Generate a cache ID(cid) specific for this page $item = menu_get_item($active_path); $cid = "links:$menu_name:full:{$item['href']}:{$GLOBALS['language']->language}"; // Did we already build this menu during this request? if(isset($tree[$cid])) return $tree[$cid]; // If the static variable doesn't have the data, check {cache_menu}. $cache = cache_get($cid, 'cache_menu'); if($cache && isset($cache->data)) { $tree_params = $cache->data; if(isset($tree_params)) return $tree[$cid] = menu_build_tree($menu_name, $tree_params); } $tree_params = array( 'min_depth' => 1, 'max_depth' => null, ); // Parent mlids; used both as key and value to ensure uniqueness. // We always want all the top-level links with plid == 0. $active_trail = array(0 => 0); // Find a menu link corresponding to the current path. If $active_path // is NULL, let menu_link_get_preferred() determine the path. $active_link = menu_link_get_preferred($active_path, $menu_name); // The active link may only be taken into account to build the // active trail, if it resides in the requested menu. Otherwise, // we'd needlessly re-run _menu_build_tree() queries for every menu // on every page. if(@$active_link['menu_name'] == $menu_name) { // Use all the coordinates, except the last one because there // can be no child beyond the last column. for($i = 1; $i < MENU_MAX_DEPTH; $i++) { if($active_link['p' . $i]) $active_trail[$active_link['p' . $i]] = $active_link['p' . $i]; } } $parents = $active_trail; do { $result = db_select('menu_links', NULL, array('fetch' => PDO::FETCH_ASSOC)) ->fields('menu_links', array('mlid')) ->condition('menu_name', $menu_name) //->condition('expanded', 1) ->condition('has_children', 1) ->condition('plid', $parents, 'IN') ->condition('mlid', $parents, 'NOT IN') ->execute(); $num_rows = FALSE; foreach($result as $item) { $parents[$item['mlid']] = $item['mlid']; $num_rows = TRUE; } } while($num_rows); $tree_params['expanded'] = $parents; $tree_params['active_trail'] = $active_trail; // Cache the tree building parameters using the page-specific cid. cache_set($cid, $tree_params, 'cache_menu'); // Build the tree using the parameters; the resulting tree will be cached by _menu_build_tree(). return $tree[$cid] = menu_build_tree($menu_name, $tree_params); } ?>Еще некоторые возможности темизации меню в Drupal 7
В одной из статей я уже писал, как сделать раскрывающееся меню с уникальными классами, но встречаются и другие моменты, которые если не знать, то сходу и не догадаешься. В этом примере я добавлю в обертку нужного мне меню классы и темизирую ссылки внутри.
А теперь подробнее.
Мне нужно сделать вывод главного меню в таком виде:
<ul>
<li><span><a href="/about" title="">О компании</a></span>
<ul>
<li><a href="/" title="">Новости</a></li>
<li><a href="/" title="">Вакансии</a></li>
<li><a href="/" title="">Сотрудничество</a></li>
</ul>
</li>
<li><span><a href="/" title="">Объекты</a></span></li>
<li><span><a href="/" title="">Контакты</a></span></li>
</ul>
Друпал же нам предлагает свой вариант примерно такой:
<ul>
<li><a href="/about" title="">О компании</a>
<ul>
<li><a href="/">Новости</a></li>
<li><a href="#">Вакансии</a></li>
<li><a href="/">Сотрудничество</a></li>
</ul>
</li>
<li><a href="#">Объекты</a></li>
<li><a href="#">Контакты</a></li>
</ul>
Т.е. нам тегу ul нужно присвоить класс topNav, ссылки первого уровня обернуть в тег span, ссылки второго уровня не должны быть ни во что обернуты.Открываем в нашей теме файл template.php, знаем что наше меню имеет название main_menu. Для начала присвоим нужный нам класс тегу ul:
function MYTHEME_menu_tree__main_menu($variables) {
return '<ul>' . $variables['tree'] . '</ul>';
}
Далее используем функцию, которая рендерит пункты меню и оборачиваем ссылки в тег span.
- function MYTHEME_menu_link__main_menu(array $variables) {
$element = $variables['element'];
$sub_menu = '';
// т.к. нам нужно обернуть только ссылки первого уровня, переопределяем функцию, которая будет рендерить остальные
if ($element['#below']) {
foreach ($element['#below'] as $key => $val) {
$element['#below'][$key]['#theme'] = 'menu_link__main_menu_inner';
}
}
$sub_menu = drupal_render($element['#below']);
}
$output = '<span>'.l($element['#title'], $element['#href'], $element['#localized_options']).'</span>';
return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}
Теперь пишем функцию, которая рендерит внутренние ссылки:
function MYTHEME_menu_link__main_menu_inner($variables) {
$element = $variables['element'];
$sub_menu = '';
if ($element['#below']) {
$sub_menu = drupal_render($element['#below']);
}
$output = l($element['#title'], $element['#href'], $element['#localized_options']);
return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}
drunkcat.ru
создание и вывод на сайт
Всем привет! Сегодня поговорим о меню Drupal — научимся создавать новое меню, добавлять в него пункты и связывать с терминами таксономии, что позволит добавлять ссылки не только на отдельные материалы, но и на целые категории.
Стандартные меню Drupal
Переходим в раздел «Структура» — «Меню». Нашему взору предстает четыре стандартных меню Drupal:
- Management — это внутреннее меню админки Druapl.
- User menu — в нем представлены ссылки на учетную запись пользователя и выход из нее. Отображается только авторизованным пользователям.
- Главное — чаще всего используется для вывода ссылок на страницы с технической и общей информацией: главная, обратная связь, контакты, о себе и так далее. Под главное в теме Drupal выделяется отдельный блок в верхней части страницы. В нем меню выводится в горизонтальном виде.
- Навигация — меню для пользователей, в котором представлены ссылки на разделы сайта и какие-то отдельные материалы.
Создание меню
Давайте создадим новое меню и добавим в него ссылки на отдельные материалы Drupal. Нам нужен пункт «Структура» — «Меню» — «Добавить меню». Здесь задаем заголовок и машинное имя (используйте только латинские буквы нижнего регистра, цифры и дефис). Описание является необязательным полем и заполняется по желанию.
На следующей странице нам предлагается добавить в него ссылки. Для каждой добавляемой ссылки заполняем следующие поля:
- Название ссылки — под этим именем пункт отобразится в меню.
- Путь — ссылка на добавляемый материал. Можно давать ссылку как на отдельный материал, так и на целые категории. В принципе, можно и так добавлять термины таксономии, но это не совсем удобно. Чуть ниже я расскажу о модуле Taxonomy Menu, который позволяет сделать это гораздо проще.
- Описание — будет появляться при наведении на данный пункт меня курсора мыши.
- Включено — ставим галочку, чтобы пункт появился сразу после сохранения.
- Показывать раскрытым — позволяет отображать не только данный пункт, но и его дочерние элементы.
- Родительская ссылка — оставляем название «Разделы сайта».
- Вес — позволяет упорядочить пункты. Чем меньше вес, тем выше элемент располагается. Элементы с одним весом упорядочиваются по алфавиту.
Чтобы добавить новые пункты в существующее меню, открываем раздел «Структура» — «Меню» — «Название меню» и задействуем ссылку «Добавить ссылку».
Связь меня с терминами таксономии — модуль Taxonomy Menu
Страница модуля Taxonomy Menu на drupal.org. Установите его в систему и активируйте. Настроек модуль не имеет, просто добавляет дополнительный ряд параметров в настройки словаря таксономии, позволяющий привязать его к определенному меню Drupal.
Переходим к редактированию ранее созданного словаря таксономии «Категории». Теперь доступен раздел «Меню таксономии». В первой опции «Расположение меню» выбираем наше новое меню «Разделы сайта».
Ниже идут параметры. Здесь я изменил только одну опцию — поставил галочку напротив «Скрывать пустые термины». Все остальные параметры оставил без изменений. Не забудьте сохраниться перед выходом.
О том, как выводить меню на сайт, я расскажу в статье, посвященной блокам Drupal. Так что потерпите немного — всему свое время.
Как видите, нет ничего сложного. Немного практики, чтобы запомнить где какая опция располагается и все. На этом же на сегодня все, спасибо за внимание! Берегите себя!
Лучший способ выразить благодарность автору - поделиться с друзьями!
Узнавайте о появлении нового материала первым! Подпишитесь на обновления по email:
Следите за обновлениями в Twitter и RSS.
fairheart.ru