Работаем с меню в drupal 7

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

Модуль меню — часть drupal. Подсистема меню хорошо интегрирована и продумана. Drupal содержит целую библиотеку функций для работы с деревом меню, целое API. Мы его немного затронем в примерах.

Как устроено меню в Drupal

Мы можем создавать объекты меню в виде дерева ссылок. Максимальная глубина дерева — 9.

Если мы откроем страницу администрирования (/admin/structure/menu), то в списке меню уже будут несколько созданных объектов.

menus

  • Main menu предназначено для отображения элементов меню, ссылок навигации на front-end сайта.
  • Managment — содержит пункты меню для администрирования сайта
  • Navigation — включает в себя все объявляемые в модулях объекты меню (когда используется hook_menu)
  • User menu — содержит ссылки связанные с профилем пользователя, в том числе ссылку Log out.

Хлебные крошки, breadcrumbs в Drupal

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

Он представляет собой последовательность ссылок в текущей иерархии созданных меню. Т.е. если текущая страница сайта объявлена элементом какого то меню — то вы получите набор ссылок от корня дерева до элемента, ссылающегося на данную страницу. Корнем дерева меню является главная страница.

Переменная $breadcrumb в шаблоне — это HTML код, с ним ничего не поделать. Но вы можете использовать hook_menu_breadcrumb_alter, чтобы запрограммировать необходимые корректировки до рендеринга крошек.

Админ меню в Drupal

В 7 версии в ядро добавлен модуль админ меню, для иерархии которого используется дерево меню managment. Его функционал похож на Administration menu, который я использую для проектов на Drupal 6. Этот сторонний модуль мне кажется более удобным и функциональным, но под 7кой я предпочитаю ему встроенный модуль, т.к. не люблю перегружать проекты 3d part модулями.

Пользователь с соответствующими правами получает меню администратора в виде черной горизонтальной полоски в верху экрана.

Полезные 3d part модули, связанные с системой меню

Nice menu

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

Для любителей создавать меню по словарям (таксономии) также есть специальные модули — Taxonomy Menu, Nice Taxonomy Menus.

Pathauto

Модуль ядра path, тесно связан с меню, позволяя задавать синонимы страниц, так чтобы в результате публикацию с адресом node/100 можно было посмотреть по адресу, к примеру,  poleznaya-informachiya-o-kompanii. Модуль path позволяет задать путь вручную, а автоматизировать создание синонима позволит модуль pathauto. Он может работать в связке с модулем транслитерации (Transliteration), тогда вы будете получать ЧПУ ноды на лету (при сохранении публикации), как в примере.

Если вам не нужна адова мощь pathauto (а у него куча настроек и возможностей), то можете почитать как обойтись парой собственных функций для генерации синонима пути ноды в Drupal.

Hook Menu — добавление элементов в навигацию Drupal

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

Обработчик для ajax я не стал включать в листинг, более подробно как обработать ajax в Drupal читайте здесь.

Элементы меню API Drupal

Была идея описать какие то отдельные функции и примеры работы с ними. Но если поглядеть на файл, реализующий Drupal menu API (/includes/menu.inc), который в Drupal 7 содержит почти 4000 строк, то становится ясным, что это задача не для статьи, а для целого мануала. Стоит найти немного времени, чтобы полистать указанный файл API, если вы собираетесь работать с Drupal.

Тем не менее несколько полезных и простых функций заслуживают упоминания.

function menu_tree($menu_name)

Функция вернет вам дерево меню, системное имя которого вы указали, в виде массива для функции рендеринга drupal — drupal_render(). Это удобная функция для написания собственного кода модификации меню в drupal. При этом дерево строится исходя из текущей активной страницы, основываясь на текущем пути (url). Элементы дерева содержат маркеры активной страницы и хлебных крошек.

См также — вывод нужного уровня меню, который я написал на базе кода этой функции. Пример был написан еще для Drupal 6.

function menu_tree_all_data($menu_name, $link = NULL, $max_depth = NULL)

Эта функция позволяет вернуть полное дерево меню. Для рендеринга средствами drupal полученное дерево следует прогнать через menu_tree_output($tree).

Но обычно вместо menu_tree_all_data используют menu_tree_page_data.

function menu_tree_page_data($menu_name, $max_depth = NULL, $only_active_trail = FALSE)

В отличии от menu_tree_all_data эта функция формирует дерево из элементов связанных с текущей страницей. Т.е. мы увидим только те элементы, которые находятся на ветках по пути к нашей странице, а не все дерево целиком.

Написать комментарий

Мало букафф? Читайте есчо !

Делаем меню из картинок в drupal (image menu)

Март 24, 2010 г.

Не все дизайнерские решения укладываются в оформление посредством css. В этот раз, это  - главное меню сайта. Нужно было изобразить отдельные пункты меню отдельными картинками, а активные элементы меню показать другими картинками. Есть действительно оригинальные ...

Читать

Редирект после отправки формы в Drupal 8/9

Январь 22, 2022 г.

Для семерки можете посмотреть другую статью. Обычно правят поведение существующих форм через hook_form_alter, добавляя туда еще один обработчик submit. Специальный метод setRedirectUrl объекта FormStateInterface позволяет настроить адрес перенаправления. ...

Читать

 

Комментарии к «Работаем с меню в drupal 7»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: