Меню 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); } ?>

borodiny.ru

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

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

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

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

  1. <ul>

  2. <li><span><a href="/about" title="">О компании</a></span>

  3. <ul>

  4. <li><a href="/" title="">Новости</a></li>

  5. <li><a href="/" title="">Вакансии</a></li>

  6. <li><a href="/" title="">Сотрудничество</a></li>

  7. </ul>

  8. </li>

  9. <li><span><a href="/" title="">Объекты</a></span></li>

  10. <li><span><a href="/" title="">Контакты</a></span></li>

  11. </ul>

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

  1. <ul>

  2. <li><a href="/about" title="">О компании</a>

  3. <ul>

  4. <li><a href="/">Новости</a></li>

  5. <li><a href="#">Вакансии</a></li>

  6. <li><a href="/">Сотрудничество</a></li>

  7. </ul>

  8. </li>

  9. <li><a href="#">Объекты</a></li>

  10. <li><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>' . $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. $element['#below'][$key]['#theme'] = 'menu_link__main_menu_inner';

  9. }

  10. }

  11. $sub_menu = drupal_render($element['#below']);

  12. }

  13. $output = '<span>'.l($element['#title'], $element['#href'], $element['#localized_options']).'</span>';

  14. return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";

  15. }

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

  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. }

drunkcat.ru

создание и вывод на сайт

Всем привет! Сегодня поговорим о меню Drupal — научимся создавать новое меню, добавлять в него пункты и связывать с терминами таксономии, что позволит добавлять ссылки не только на отдельные материалы, но и на целые категории.

Меню Drupal

Стандартные меню Drupal

Переходим в раздел «Структура» — «Меню». Нашему взору предстает четыре стандартных меню Drupal:

Создание меню

Давайте создадим новое меню и добавим в него ссылки на отдельные материалы Drupal. Нам нужен пункт «Структура» — «Меню» — «Добавить меню». Здесь задаем заголовок и машинное имя (используйте только латинские буквы нижнего регистра, цифры и дефис). Описание является необязательным полем и заполняется по желанию.

Создание меню

На следующей странице нам предлагается добавить в него ссылки. Для каждой добавляемой ссылки заполняем следующие поля:

Чтобы добавить новые пункты в существующее меню, открываем раздел «Структура» — «Меню» — «Название меню» и задействуем ссылку «Добавить ссылку».

Добавить ссылку

Связь меня с терминами таксономии — модуль Taxonomy Menu

Страница модуля Taxonomy Menu на drupal.org. Установите его в систему и активируйте. Настроек модуль не имеет, просто добавляет дополнительный ряд параметров в настройки словаря таксономии, позволяющий привязать его к определенному меню Drupal.

Переходим к редактированию ранее созданного словаря таксономии «Категории». Теперь доступен раздел «Меню таксономии». В первой опции «Расположение меню» выбираем наше новое меню «Разделы сайта».

Таксономия и меню

Ниже идут параметры. Здесь я изменил только одну опцию — поставил галочку напротив «Скрывать пустые термины». Все остальные параметры оставил без изменений. Не забудьте сохраниться перед выходом.

О том, как выводить меню на сайт, я расскажу в статье, посвященной блокам Drupal. Так что потерпите немного — всему свое время.

Как видите, нет ничего сложного. Немного практики, чтобы запомнить где какая опция располагается и все. На этом же на сегодня все, спасибо за внимание! Берегите себя!

Лучший способ выразить благодарность автору - поделиться с друзьями!

Узнавайте о появлении нового материала первым! Подпишитесь на обновления по email:

Следите за обновлениями в Twitter и RSS.

fairheart.ru


Prostoy-Site | Все права защищены © 2018 | Карта сайта