MODX. Создание меню при помощи pdoMenu

Для создания меню в MODX написано множество компонентов, но pdoMenu удобен тем, что поставляется в комплекте pdoTools, и обладает хорошей гибкостью для настройки. 

Для создания меню необходимо:

  1. Иметь пару опубликованных, отображаемых в меню ресурсов, и установленный компонент pdoTools;
  2. В шаблоне, в месте где должно отображаться меню вставить следующий код: 
[[pdoMenu?
    &parents=`0`
    &level=`1`
]]

Выше приведен стандартный вызов меню, который подойдет для простейших сайтов. 

  • &parents — id самого верхнего ресурса с которого надо начинать строить меню. Если меню не должно иметь ограничений, стоит проставить 0;

  • &level — количество уровней вложенности которые должны отображаться в меню.

По умолчанию меню выведется заключенное в теги «ul,li», но шаблон можно изменить. Для этого достаточно использовать параметры относящиеся к группе «Параметры шаблонов» из документации, приведенной ниже. 

К примеру, для того чтобы теги «li» оборачивались в «menu» стоит добавить параметр &tplOuter = `tpl.menuOuter` и создать одноименный чанк, с кодом

<menu[[+classes]]>[[+wrapper]]</menu>

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

&tplOuter = `@INLINE <menu[[+classes]]>[[+wrapper]]</menu>`

Вариант использования pdoMenu с Fenom и одним шаблоном, от Сергея Шлокова:

Документация сниппета pdoMenu

pdoMenu ​

pdoMenu

Сниппет генерации меню. Может заменять Wayfinder, и позволяет более гибко указывать параметры.

Например, умеет строить меню сразу из нескольких родителей, отображая их как вместе, так и отдельными ветками.

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

Параметры

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

Название По умолчанию Описание
&parents Текущий ресурс Список родителей для поиска результатов, через запятую. Если поставить &parents=0 - выборка не ограничивается. Если id родителя начинается с дефиса, он и его потомки исключаются из выборки.
&level 0 (не ограниченно) Уровень генерируемого меню.
&resources Список ресурсов для вывода в результатах, через запятую. Если id ресурса начинается с дефиса, этот ресурс исключается из выборки.
&templates Список шаблонов для фильтрации результатов, через запятую. Если id шаблона начинается с дефиса, ресурсы с ним исключается из выборки.
&where Массив дополнительных параметров выборки, закодированный в JSON.
&displayStart 0 Включить показ начальных узлов меню. Полезно при указании более одного «parents».
&context Ограничение выборки по контексту ресурсов.
&showHidden 0 Показывать ресурсы, скрытые в меню.
&showUnpublished 0 Показывать неопубликованные ресурсы.
&previewUnpublished 0 Включить показ неопубликованных ресурсов, если у пользователя есть на это разрешение.
&hideSubMenus 0 Спрятать неактивные ветки меню.
&select Список полей для выборки, через запятую. Можно указывать JSON-строку с массивом, например &select={"modResource":"id,pagetitle,content"}
&sortby menuindex Любое поле ресурса для сортировки, включая ТВ-параметр, если он указан в параметре &includeTVs, например &sortby={"tvname":"ASC","pagetitle":"DESC"}. Можно указывать JSON-строку с массивом нескольких полей. Для случайной сортировки укажите &sortby=RAND()
&sortdir ASC Направление сортировки: по убыванию или по возрастанию. Если оставить параметры &sortby и &sortdir пустыми, то сортировка будет идти по порядку ресурсов в &resources.
&limit 0 Ограничение количества результатов выборки.
&offset 0 Пропуск результатов от начала. Необходимо использовать вместе с явно указанным &limit
&checkPermissions Укажите, какие разрешения нужно проверять у пользователя при выводе ресурсов, например &checkPermissions=list.
&countChildren 0 Точный подсчет количества дочерних ресурсов каждой категории и вывод их в плейсхолдер [[+children]]. Делает дополнительные запросы в БД, поэтому по умолчанию отключен.
&toPlaceholder Если не пусто, сниппет сохранит все данные в плейсхолдер с этим именем вместо вывода на экран.
&plPrefix wf. Префикс для выставляемых плейсхолдеров.
&showLog 0 Показывать дополнительную информацию о работе сниппета. Только для авторизованных в контексте «mgr».
&fastMode 0 Быстрый режим обработки чанков. Все необработанные теги (условия, сниппеты и т.п.) будут вырезаны.
&cache 0 Кэширование результатов работы сниппета.
&cacheTime 3600 Время актуальности кэша, в секундах.
&scheme -1 Схема формирования url, передаётся в modX::makeUrl(), поэтому возможные варианты нужно смотреть здесь. Особый тип uri подставляет значение uri ресурса, без запуска функции.
&useWeblinkUrl 1 Генерировать ссылку с учетом класса ресурса.
&rowIdPrefix Префикс id="" для выставления идентификатора в чанк.
&hereId id текущего ресурса для генерируемого меню. Нужно указывать только если скрипт сам его неверно определяет, например при выводе меню из чанка другого сниппета.
&includeTVs Список ТВ-параметров для выборки, через запятую. Например &includeTVs=action,time дадут плейсхолдеры [[+action]] и [[+time]].
&prepareTVs Список ТВ-параметров, с файлами из источников медиа, для которых нужно сгенерировать полные пути. Если установить &prepareTVs=1, будут подготовлены все ТВ, указанные в &includeTVs.
&processTVs Список ТВ-параметров, которые нужно обработать и вывести согласно их настроек в менеджере системы. Если установить &processTVs=1, будут обработаны все ТВ, указанные в &includeTVs. Замедляет работу.
&tvPrefix Префикс для ТВ-параметров.

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

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

Название Описание
&tplOuter Чанк оформления всего блока меню. По умолчанию: @INLINE <ul [[+classes]]>[[+wrapper]]</ul>
&tpl Чанк оформления пункта меню. Если не указан, то содержимое полей ресурса будет распечатано на экран. По умолчанию: @INLINE <li [[+classes]]><a href="[[+link]]" [[+attributes]]>[[+menutitle]]</a>[[+wrapper]]</li>
&tplHere Чанк оформления текущего пункта меню.
&tplStart Чанк оформления корневого пункта, при условии, что включен &displayStart. По умолчанию: @INLINE <h2 [[+classes]]>[[+menutitle]]</h2>[[+wrapper]]
&tplParentRow Чанк оформления родителя с потомками, не подпадающего под условия &tplCategoryFolder. Например: @INLINE <li class="submenu_wrap [[+classnames]]"><a href="[[+link]]" [[+attributes]]>[[+menutitle]]</a>[[+wrapper]]</li>
&tplParentRowHere Чанк оформления текущего документа, если он содержит потомков.
&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 Класс ресурса-ссылки.

Примеры

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

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

Вывод с исключением определенных родителей и проверкой разрешений пользователя:

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

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

modx
[[pdoMenu?
  &parents=`10,15`
  &displayStart=`1`
]]

Вывод двух уровней ресурсов с подсчетом количества вложенных:

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

Меню с дополнительным пунктом в чанке, без ссылки на страницу:

// Вызов меню 

[[!pdoMenu?
                &parents=`0`
                &level=`1`
                &tplLast=`call.feedback`
]]

// Код чанка

<li[[+classes]]><a href="[[+link]]" [[+link_attributes]]>
[[+menutitle]]
</a>[[+wrapper]]</li>

[[*id:ne=`1`:then=`<li><div class="trigger-superposition">Обратная связь</div></li>`]]