DLBuildMenu: параметры и шаблоны
- Время чтения: 16 мин
- Андрей [Aharitо́] Харитонов
- Раздел: MODx Evolution
Сниппет вывода меню DLBuildMenu, основанный на DocLister, предоставляет мощные инструменты создания меню сайта на MODx Evo. Но многие, даже опытные, MODx-юзеры не применяют DLBuildMenu — не в последнюю очередь из-за отсутствия документации. Восполняю этот пробел.
Краткое описание
DLBuildMenu — сниппет для вывода меню сайта на MODx Evolution. Построен на основе ДокЛистера, по сути это сниппет-обертка с вызовом DocLister внутри — поэтому в нём можно использовать практически все параметры и фишки самого DocLister.
Применяя prepare, мы получаем неограниченные возможности подготовки данных. А развитая система шаблонизации ДокЛистер, дополненная в DLBuildMenu новыми параметрами, даёт в руки, на мой взгляд, даже чрезмерно богатый инструментарий.
Разработчик: Agel_Nash
Зависимости и требования
- Для работы DLBuildMenu у вас должен быть установлен DocLister (есть в последних релизах MODx Evo по умолчанию).
- Требуется PHP не ниже версии 5.3.
Установка
- DLBuildMenu входит по умолчанию в новую кастомную сборку MODx Evo 1.2.1-d9.1.2 от 21.03.2017.
- На более старых кастомных сборках и на официальной сборке для его установки нужно установить или переустановить ДокЛистер из Extras, при этом нужно, чтобы DLBuildMenu был отмечен галочкой в списке при установке.
Файлы
- assets/snippets/DocLister/snippet.DLBuildMenu.php
- assets/snippets/DocLister/lib/DLFixedPrepare.class.php (метод buildMenu)
Преимущества DLBuildMenu
- есть возможность применения prepare для обработки данных перед выводом.
- богатый выбор способов задания шаблонов, в том числе инлайн-шаблоны.
- сортировка по TV-параметрам с приведением к нужному типу.
- может делать фильтрацию по TV-параметрам.
- можно придумывать и задавать собственные параметры и обрабатывать их в prepare.
Кроме того, в DLBuildMenu работают и другие фишки из арсенала ДокЛистер, описывать которые здесь не стану, для этого нужно изучать сам DL.
Параметры
Базовые параметры
&idType (hardcoded)
Тип выборки аналогично DocLister.
Возможные значения: parents
Примечание: значение параметра &idType жестко записано в коде как parents.
&parents
Родительская (начальная) папка.
Возможные значения: ID родителя, либо список ID родителей через запятую.
Значение по умолчанию: 0
Примечание: Обратите внимание, что в DLBuildMenu значение &parents по умолчанию равно 0, что означает «выводить начиная с корня сайта». Это отличается от дефолтного значения &parents параметра в ДокЛистере.
¤tDepth
Исходный уровень вложенности (глубина).
Возможные значения: целое число от 1 и больше.
Значение по умолчанию: 1
&maxDepth
Макс. глубина
Возможные значения: целое число от 1 и больше.
Значение по умолчанию: 5
&BeforePrepare и &AfterPrepare
Обработка данных через prepare аналогично DocLister.
Возможные значения: задаются по правилам ДокЛистера. Могут быть списком имен сниппетов и вызовов методов ренее загруженных классов, либо анонимной функцией.
Примечание: для prepare в DLBuildMenu уже имеется встроенный обязательный вызов DLFixedPrepare::buildMenu. Обработчики из &BeforePrepare вызываются перед встроенным, из &AfterPrepare - после встроенного вызова.
&activeClass
CSS-класс активного (текущего) пункта меню и его родительских элементов всех уровней.
Возможные значиения: Имя CSS-класса, или несколько имён CSS-классов, заданные как в HTML-теге (через пробел).
Значение по умолчанию: active
Примечание: этот CSS-класс и этот параметр существуют в дополнение к уже имеющимся в ДокЛистере классам first, last, odd, even и current и соответствующим параметрам для них (см. документацию по DocLIster).
Параметры условий выборки
&addWhereList
Условия выборки документов для всех уровней.
Возможные значения: задаются как в DocLister (по правилам MySQL для условия WHERE).
Значение по умолчанию: c.hidemenu = 0
&addWhereListN
Условия выборки документов N-го уровня, для соответствующих уровней &addWhereListN имеет приоритет над &addWhereList.
Возможные значения: задаются по правилам MySQL для условия WHERE.
Значение по умолчанию: нет
Примечание: Если &addWhereListN не задан, для всех уровней используется &addWhereList.
Параметры сортировки
&orderBy
Условия сортировки документов всех уровней
Возможные значения: задаются как в DocLister (по правилам MySQL для ORDER BY).
Значение по умолчанию: menuindex ASC, id ASC
&orderByN
Условия сортировки документов N-го уровня вложенности, для соответствующих уровней &orderBy имеет приоритет над &orderBy.
Возможные значения: задаются по правилам MySQL для ORDER BY.
Значение по умолчанию: нет
Примечание: Если &orderByN не задан, для всех уровней используется &orderBy.
Параметр «список TV»
&tvList
Список TV-параметров, которые участвуют в выборке (как в DocLister).
Возможные значения: список имён TV-параметров через запятую.
Значение по умолчанию: нет
&tvListN
Список TV-параметров в выборке для N-го уровня вложенности, для соответствующих уровней &tvListN имеет приоритет над &tvList.
Возможные значения: список имён TV-параметров через запятую.
По умолчанию: пусто.
Примечание: Если &tvListN не задан, для всех уровней используется &tvList.
Шаблоны
Шаблоны DLBuildMenu задаются по правилам DL, то есть могут быть и инлайн-шаблонами, и именами чанков, или загружаться из файла, из документа MODx, из конфига, из глобального плейсхолдера.
Шаблоны-обёртки
&TplMainOwner
Основной шаблон-обертка (для уровня глубины 1).
@CODE:<ul id="nav" class="menu level-1">[+dl.wrap+]</ul>
Примечание: у вас должен быть задан шаблон &TplMainOwner или &TplOwner1, иначе будет использовано дефолтное значение шаблона &TplMainOwner.
&TplSubOwner
Шаблон-обертка для вложенных уровней (для субменю).
@CODE:<ul class="sub-menu level-[+dl.currentDepth+]">[+dl.wrap+]</ul>
Примечание: для вывода N-уровневого меню у вас в дополнение к основной обёртке должен быть задан по крайней мере &TplSubOwner и/или шаблоны &TplOwnerN. Иначе будет использовано дефолтное значение &TplSubOwner.
&TplOwnerN
Шаблон-обертка для субменю N-го уровня вложенности, для соответствующих уровней &TplOwnerN имеет приоритет над &TplMainOwner и &TplSubOwner (см. Примечание).
Значение по умолчанию: нет
Примечание: Если заданы и &TplOwner1, и &TplMainOwner, то будет использован &TplOwner1. Если заданы и &TplOwner2 и &TplSubOwner, то для уровня 2 будет использован &TplOwner2, а для уровней начиная с 3-го — &TplSubOwner.
Шаблоны пункта меню
&TplOneItem
Основной шаблон для каждого пункта меню всех уровней.
@CODE:<li id="menu-item-[+id+]" class="menu-item [+dl.class+]"> <a href="[+url+]" title="[+e.title+]">[+title+]</a> [+dl.submenu+] </li>
Примечание: у вас должны быть заданы все нужные вам шаблоны пунктов меню, по крайней мере &TplOneItem. Иначе для пунктов, у которых шаблон не определен вами, будет использовано дефолтное значение &TplOneItem.
&TplDepthN
Шаблон пункта меню вложенности N, для соответствующих уровней &TplDepthN имеет приоритет над &TplOneItem.
Значение по умолчанию: нет
Примечание: Например, если задан &TplDepth3, он заменит собой шаблон &TplOneItem на 3-м уровне вложенности.
Шаблоны пункта без дочерних элементов
&noChildrenRowTPL
Основной шаблон пункта меню без дочерних элементов для всех уровней.
Значение по умолчанию: нет
&TplNoChildrenDepthN
Шаблон пункта меню без дочерних элементов вложенности N. Для соответствующих уровней &TplNoChildrenDepthN имеет приоритет над &noChildrenRowTpl.
Значение по умолчанию: нет
Примечание: если для пункта меню не задан ни &noChildrenRowTPL, ни &TplNoChildrenDepthN, то в качестве шаблона для «бездетных» пунктов будет использован шаблон, заданный вами в других параметрах (&TplOneItem или &TplDepthN).
Шаблоны текущего пункта
&TplCurrent
Шаблон текущего пункта меню с дочерними, имеет приоритет перед всеми шаблонами пунктов меню, кроме &TplCurrentN.
Значение по умолчанию: нет
&TplCurrentN
Шаблон текущего пункта меню вложенности N с дочерними , для N-го уровня шаблон &TplCurrentN имеет приоритет перед всеми шаблонами пунктов меню с дочерними, включая &TplCurrent.
Значение по умолчанию: нет.
&TplCurrentNoChildrenN
Шаблон текущего пункта меню без дочерних элементов, где N — номер уровня вложенности. Для уровня N имеет приоритет перед любыми другими шаблонами «бездетных» пунктов меню.
Значение по умолчанию: нет.
Плейсхолдеры
Основные плейсхолдеры
[+dl.wrap+]
С его помощью в шаблон-обёртку подставляется сформированный HTML-код меню/субменю для вывода.
Примечание: используется только для шаблонов-обёрток &TplMainOwner, &TplSubOwner и &TplOwnerN.
[+dl.submenu+]
Сюда подставляется сформированный HTML-код субменю вместе с шаблоном-обёрткой.
Примечание: используется для шаблонов пункта меню, как не текущих, так и текущих.
[+dl.currentDepth+]
Текущий уровень вложенности (текущая глубина).
Примечание: обратите внимание, что отсчёт текущего уровня вложенности начинается с 1.
[+dl.class+]
Работает так же, как и в DocLister, автоматически добавляя классы last, first, current, even, odd соответственно для последнего, первого, текущего, четного и нечетного пункта. Кроме того, добавляет класс из параметра &activeClass для текущего элемента и его родительских элементов всех уровней.
Примечание: классы last, first, current, even, odd и active могут быть переопределены в параметрах &lastClass, ¤tClass, &firstClass, &evenClass, &oddClass и &activeClass.
[+url+]
УРЛ ресурса аналогично ДокЛистеру.
[+e.title+]
Экранированное значение menutitle или pagetitle (если menutitle пуст) аналогично Доклистеру.
[+id+]
ID ресурса аналогично ДокЛистеру.
Другие плейсхолдеры из DocLister
Вы можете использовать и другие плейсхолдеры ДокЛистера, устанавливаемые контроллером site_content и различными экстендерами.
Например, плейсхолдеры вида [+tvPrefix.tvName+], плейсхолдеры экранированных значений вида [+e.fieldName+] (где fieldName - это имя поля таблицы site_content), [+date+] и другие (см. документацию к DocLister).
Шпаргалка по приоритетам шаблонов
Система шаблонов DLBuildMenu действительно очень гибкая, но к ней нужно привыкнуть. Для упрощения задачи ниже привожу cheatsheet (шпаргалку) по приоритетам шаблонов.
В левой колонке перечислены типы элементов меню, а справа от каждого элемента идут применяемые для него шаблоны в порядке убывания приоритета.
Тип элемента меню | Высший приоритет | Приоритет 1 | Приоритет 2 | Приоритет 3 | Приоритет 4 | Приоритет 5 |
---|---|---|---|---|---|---|
Обёртка для всего меню (уровень 1) | &TplOwner1 | &TplMainOwner | дефолтное значение &TplMainOwner | |||
Обёртка для суб-меню (уровень N равен 2 и более) | &TplOwnerN | &TplSubOwner | дефолтное значение &TplSubOwner | |||
Не текущий пункт меню с дочерними (любой уровень N) | &TplDepthN | &TplOneItem | дефолтное значение &TplOneItem | |||
Не текущий пункт меню без дочерних (любой уровень N) | &TplNoChildrenDepthN | &noChildrenRowTPL | &TplDepthN | &TplOneItem | дефолтное значение &TplOneItem | |
Текущий пункт меню с дочерними (любой уровень N) | &TplCurrentN | &TplCurrent | &TplDepthN | &TplOneItem | дефолтное значение &TplOneItem | |
Текущий пункт меню без дочерних (любой уровень N) | &TplCurrentNoChildrenN | &TplNoChildrenDepthN | &noChildrenRowTPL | &TplDepthN | &TplOneItem | дефолтное значение &TplOneItem |
Свои вопросы и предложения оставляйте в комментариях к статье, я постараюсь ответить на все комменты.