pbMenu
Дерево ресурсов для навигации.
[[!pbMenu? &parent=`0` &level=`3` &tpl=`menuItem`]]Параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
parent | 0 | Корень дерева. 0 — корень сайта. |
level | 3 | На сколько уровней вглубь идти. |
Плюс общие параметры вывода из Введения.
Каждая строка несёт своих детей
В отличие от плоского списка, у каждого пункта есть коллекция children, поэтому один чанк выводит всё дерево, вызывая сам себя:
<li>
<a href="{$item.url}">{$item.title}</a>
{if $item.children}
<ul>
{foreach $item.children as $child}
{'menuItem'|chunk: ['item' => $child]}
{/foreach}
</ul>
{/if}
</li>active из сниппета не приходит
У пункта есть ключи active, is_ancestor и has_active_child, но заполняются они только когда Resource::getMenu() зовут с третьим аргументом — id текущей страницы. Ни pbMenu, ни модификатор menu его не передают, так что {if $item.active} в чанке не срабатывает никогда. Текущий пункт пока отмечается сравнением вручную: {if $item.id == $modx->resource->id}.
{insert} и {include} делят область видимости
Переменная цикла видна внутри вставленного чанка — именно это и заставляет рекурсию выше работать. Но это же значит, что переменная из родителя может протечь внутрь и удивить. Называйте переменные цикла осознанно.
Примеры
Верхнее меню, один уровень
[[!pbMenu? &level=`1` &tpl=`menuItem`]]Подменю раздела
[[!pbMenu? &parent=`[[*id]]` &level=`2` &tpl=`menuItem`]]Из Fenom
{foreach menu(0, 2) as $item}
<a href="{$item.url}">{$item.title}</a>
{/foreach}Пункт меню — массив, а не модель: читается точкой, а не ->. Ключи: id, parent, template, class_key, title (menutitle или pagetitle), pagetitle, menutitle, alias, uri, url (готовый href с языковым префиксом), link_attributes, description, introtext, isfolder, menuindex, new_until, level, content, children.