Skip to content

pbMenu ​

Дерево ресурсов для навигации.

[[!pbMenu? &parent=`0` &level=`3` &tpl=`menuItem`]]

Параметры ​

ПараметрПо умолчаниюОписание
parent0Корень дерева. 0 — корень сайта.
level3На сколько уровней вглубь идти.

Плюс общие параметры вывода из Введения.

Каждая строка несёт своих детей ​

В отличие от плоского списка, у каждого пункта есть коллекция children, поэтому один чанк выводит всё дерево, вызывая сам себя:

php
<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 ​

php
{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.

© PageBlocks 2019-present