pdoMenu — создание меню сайта в MODX

PdoMenu Дополнения

Сниппет pdoMenu предназначен для генерации навигационного меню любой сложности из дерева ресурсов MODX. Он является современной заменой устаревшего Wayfinder и позволяет более гибко указывать параметры построения меню. Основное преимущество pdoMenu заключается в высокой скорости работы благодаря использованию библиотеки pdoTools и возможности строить меню сразу из нескольких разделов сайта.

Сниппет автоматически определяет активные пункты меню, поддерживает неограниченную вложенность уровней и предоставляет гибкую систему CSS-классов для стилизации. В отличие от Wayfinder, pdoMenu работает существенно быстрее и имеет более понятную систему шаблонов оформления.

Параметры pdoMenu

По умолчанию pdoMenu принимает общие параметры pdoTools и некоторые свои:

 Основные параметры

Параметр Значение по умолчанию Описание
&parents ID текущей страницы Список родительских контейнеров для построения меню через запятую
&level 0 Уровень вложенности меню (0 = все уровни)
&resources Конкретные ID ресурсов для включения в меню
&templates Фильтр по ID шаблонов — показывать только ресурсы с указанными шаблонами
&where Дополнительные SQL условия в JSON формате
&context текущий Контексты для выборки ресурсов меню
&showHidden 0 Отображать ресурсы скрытые от меню
&showUnpublished 0 Включать неопубликованные страницы
&showDeleted 0 Показывать удаленные ресурсы
&hideSubMenus 0 Скрывать подменю неактивных разделов
&useWeblinkUrl 1 Использовать целевой URL для weblink ресурсов
&sortby menuindex Поле для сортировки пунктов меню
&sortdir ASC Направление сортировки (ASC/DESC)
&limit 0 Ограничение количества пунктов меню (0 = без ограничений)
&offset 0 Пропустить указанное количество ресурсов
&rowIdPrefix Префикс для атрибута id строк меню
&hereId ID текущей страницы ID активного пункта меню
&hereTpl Чанк для активного пункта меню
&firstClass first CSS класс для первого пункта уровня
&lastClass last CSS класс для последнего пункта уровня
&rowClass CSS класс для каждого пункта меню
&webLinkClass CSS класс для weblink пунктов
&innerClass CSS класс для пунктов с подменю
&parentClass CSS класс для родительского контейнера
&hereClass active CSS класс для активного пункта
&activeParentClass CSS класс для родителей активного пункта

Параметры шаблонов

Эти параметры устанавливают чанки, которые содержат шаблоны для генерации меню.

Параметр Значение по умолчанию Описание
&tplOuter @INLINE <ul [[+classes]]>[[+wrapper]]</ul> Обертка для всего меню с плейсхолдером [[+wrapper]].
&tpl @INLINE <li [[+classes]]><a href="[[+link]]" [[+attributes]]>[[+menutitle]]</a>[[+wrapper]]</li> Чанк для оформления обычного пункта меню.
&tplInner Обертка для подменю. Если пуст — будет использовать &tplOuter.
&tplParentRow Чанк для родительского пункта с подменю, не подпадающего под условия &tplCategoryFolder. Например: @INLINE
<li class="submenu [[+classnames]]"><a href="[[+link]]"
[[+attributes]]>[[+menutitle]]</a>[[+wrapper]]</li>
&tplParentRowHere Чанк для активного родительского пункта
&tplHere Чанк для текущей активной страницы
&tplStart @INLINE <h2 [[+classes]]>[[+menutitle]]</h2>[[+wrapper]] Чанк для корневого элемента меню, при условии, что включен &displayStart.
&tplParentRowActive Чанк оформления родителей с потомками в активной ветке меню.
&tplCategoryFolder Специальный чанк оформления категории. Категорией считается родитель с потомками, у которого указан пустой шаблон или rel="category" в поле link_attributes.
&tplInner Чанк оформления всего блока подпунктов меню. Если пуст — будет использовать &tplOuter. Например: @INLINE <ul class="submenu [[+classnames]]">[[+wrapper]]</ul>
&tplInnerRow Чанк оформления подпункта меню. Например: @INLINE
<li class="submenu_item [[+classnames]]"><a href="[[+link]]"
[[+attributes]]>[[+menutitle]]</a>[[+wrapper]]</li>
&tplInnerHere Чанк оформления активного подпункта меню.

Параметры CSS классов

Эти параметры задают значение плейсхолдеров [[+classnames]] и [[+classes]] для различных элементов меню. Плейсхолдер [[+classnames]] выводит только название класса без атрибута class=»», в отличие от плейсхолдера [[+classes]].

Название Значение по умолчанию Описание
&firstClass first Класс для первого пункта меню.
&lastClass last Класс последнего пункта меню.
&hereClass active Класс для активного пункта меню.
&parentClass - Класс категории меню.
&rowClass - Класс пункта меню.
>&outerClass> - Класс обертки блока меню.
&innerClass - Класс обертки блока подпунктов меню.
&levelClass - Класс уровня меню. Например если укажите «level», то будет «level1», «level2» и т.д.
&selfClass - Класс текущего ресурса в меню.
&webLinkClass - Класс ресурса-ссылки.

Примеры

Простейший вызов меню из корня сайта в один уровень:

[[pdoMenu? &parents=`0` &level=`1`]]

Вывод двухуровневого меню с исключением определенных разделов:

[[pdoMenu? &parents=`-10,-15` &level=`2` &checkPermissions=`load,list,view`]]

Меню только из конкретных ресурсов:

[[pdoMenu? &level=`1` &resources=`2,3,4,5` &parents=`0`]]

Вывод меню с подсчетом количества дочерних элементов:

[[pdoMenu?
&parents=`0`
&level=`2`
&tplInner=`@INLINE [[+wrapper]]`
&tplParentRow=`@INLINE <li[[+classes]]><a href="[[+link]]" [[+attributes]]>[[+menutitle]]</a> ([[+children]])</li>[[+wrapper]]`
&countChildren=`1`
]]

Навигационное меню Bootstrap 4/5 с выпадающими подменю:

[[!pdoMenu?
&level=`2`
&parents=`0`
&firstClass=`0`
&lastClass=`0`
&rowClass=`nav-item`
&parentClass=`dropdown`
&outerClass=`navbar-nav ms-auto mb-2 mb-lg-0`
&tplOuter=`@INLINE <ul[[+classes]] itemprop="about" itemscope itemtype="http://schema.org/ItemList">[[+wrapper]]</ul>`
&tpl=`@INLINE <li itemprop="name"[[+classes]]><a class="nav-link" href="[[+link]]"[[+attributes]]>[[+menutitle]]</a>[[+wrapper]]</li>`
&tplInner=`@INLINE <ul class="dropdown-menu" aria-labelledby="navbarDropdown" itemprop="itemListElement" itemscope itemtype="http://schema.org/ItemList">[[+wrapper]]</ul>`
&tplInnerRow=`@INLINE <li><a itemprop="url" class="dropdown-item" href="[[+link]]"[[+attributes]]>[[+menutitle]]</a></li>[[+wrapper]]`
&tplParentRow=`@INLINE <li[[+classes]]><a itemprop="url" class="nav-link dropdown-toggle" href="[[+link]]" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"[[+attributes]]>[[+menutitle]]</a>[[+wrapper]]</li>`
]]

Обратите внимание на использование Schema.org разметки для семантической разметки меню.

Хотя для хлебных крошек лучше использовать pdoCrumbs, pdoMenu тоже может строить навигационную цепочку:

[[pdoMenu?
&parents=`[[*parent]]`
&level=`1`
&displayStart=`1`
&tpl=`breadcrumbItem`
&tplOuter=`@INLINE <ol class="breadcrumb">[[+wrapper]]</ol>`
]]

Вывод меню с иконками из TV-параметра:

[[pdoMenu?
&parents=`0`
&level=`1`
&includeTVs=`menu_icon`
&tvPrefix=``
&tpl=`@INLINE <li[[+classes]]><a href="[[+link]]"><i class="[[+menu_icon]]"></i> [[+menutitle]]</a>[[+wrapper]]</li>`
]]

Не забудьте включить нужные TV через &includeTVs для использования их значений в шаблонах.

Замена Wayfinder на pdoMenu

Типичный вызов Wayfinder:

[[Wayfinder? &startId=`0` &level=`2` &rowTpl=`menuRow`]]

Эквивалентный вызов pdoMenu:

[[pdoMenu? &parents=`0` &level=`2` &tpl=`menuRow`]]

Основные отличия в параметрах:

  • &startId в Wayfinder → &parents в pdoMenu
  • &rowTpl в Wayfinder → &tpl в pdoMenu
  • &outerTpl в Wayfinder → &tplOuter в pdoMenu
  • &innerTpl в Wayfinder → &tplInner в pdoMenu

Оптимизация производительности

Для ускорения работы pdoMenu используйте следующие приемы:

Ограничьте количество уровней вложенности:

[[pdoMenu? &parents=`0` &level=`2`]]

Отключите ненужные классы:

[[pdoMenu? &parents=`0` &firstClass=`0` &lastClass=`0`]]

Используйте файловые чанки вместо базы данных:

[[pdoMenu? &parents=`0` &tpl=`@FILE chunks/menu/item.tpl`]]

Кешируйте вызов если меню статическое:

[[pdoMenu? &parents=`0` &level=`2`]]

Оцените статью
MODX 3
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.