Modx evo dlbuildmenu
полное описание параметров и шаблонов
Сниппет вывода меню DLBuildMenu, основанный на DocLister, предоставляет мощные инструменты создания меню сайта на Evolution CMS (ex-MODx Evo). Но многие, даже опытные, разработчики не применяют DLBuildMenu — не в последнюю очередь из-за отсутствия документации. Восполняю этот пробел.
Краткое описание
DLBuildMenu — сниппет для вывода меню сайта на Evolution CMS и MODx Evo. Построен на основе ДокЛистера, по сути это сниппет-обертка с вызовом DocLister внутри — поэтому в нём можно использовать практически все параметры и фишки самого DocLister.
Применяя prepare, мы получаем неограниченные возможности подготовки данных. А развитая система шаблонизации ДокЛистер, дополненная в DLBuildMenu новыми параметрами, даёт в руки, на мой взгляд, даже чрезмерно богатый инструментарий.
Разработчик: Agel_Nash
Зависимости и требования
- Для работы DLBuildMenu у вас должен быть установлен DocLister (есть в последних релизах MODx Evo и Evo CMS по умолчанию).
- Требуется PHP не ниже версии 5.3.
Установка
- DLBuildMenu входит по умолчанию во все новые версии Evo CMS, начиная со сборки 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, то есть могут быть и инлайн-шаблонами, и именами чанков, или загружаться из файла, из документа, из конфига, из глобального плейсхолдера.
Шаблоны-обёртки
&TplMainOwner
Основной шаблон-обертка (для уровня глубины 1).
Значение по умолчанию:
@CODE:<ul>[+dl.wrap+]</ul>Примечание: у вас должен быть задан шаблон &TplMainOwner или &TplOwner1, иначе будет использовано дефолтное значение шаблона &TplMainOwner.
&TplSubOwner
Шаблон-обертка для вложенных уровней (для субменю).
Значение по умолчанию:
@CODE:<ul>[+dl.wrap+]</ul>Примечание: для вывода N-уровневого меню у вас в дополнение к основной обёртке должен быть задан по крайней мере &TplSubOwner и/или шаблоны &TplOwnerN. Иначе будет использовано дефолтное значение &TplSubOwner.
&TplOwnerN
Шаблон-обертка для субменю N-го уровня вложенности, для соответствующих уровней &TplOwnerN имеет приоритет над &TplMainOwner и &TplSubOwner (см. Примечание).
Значение по умолчанию: нет
Примечание: Если заданы и &TplOwner1, и &TplMainOwner, то будет использован &TplOwner1. Если заданы и &TplOwner2 и &TplSubOwner, то для уровня 2 будет использован &TplOwner2, а для уровней начиная с 3-го — &TplSubOwner.
Шаблоны пункта меню
&TplOneItem
Основной шаблон для каждого пункта меню всех уровней.
Значение по умолчанию:
@CODE:<li> <a href="[+url+]" title="[+e.title+]">[+title+]</a> [+dl.submenu+] </li>Примечание: у вас должны быть заданы все нужные вам шаблоны пунктов меню, по крайней мере &TplOneItem. Иначе для пунктов, у которых шаблон не определен вами, будет использовано дефолтное значение &TplOneItem.
&TplDepthN
Шаблон пункта меню вложенности N, для соответствующих уровней &TplDepthN имеет приоритет над &TplOneItem.
Значение по умолчанию: нет
Примечание: Например, если задан &TplDepth4, он заменит собой шаблон &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) | &TplOwner1 | &TplMainOwner | дефолтное значение &TplMainOwner | |||
Обёртка для суб-меню (уровень N равен 2 и более) | &TplOwnerN | &TplSubOwner | дефолтное значение &TplSubOwner | |||
Не текущий пункт меню с дочерними (любой уровень N) | &TplDepthN | &TplOneItem | дефолтное значение &TplOneItem | |||
Не текущий пункт меню без дочерних (любой уровень N) | &TplNoChildrenDepthN | &noChildrenRowTPL | &TplDepthN | &TplOneItem | дефолтное значение &TplOneItem | |
Текущий пункт меню с дочерними (любой уровень N) | &TplCurrentN | &TplCurrent | &TplDepthN | &TplOneItem | дефолтное значение &TplOneItem | |
&TplCurrentNoChildrenN | &TplNoChildrenDepthN | &noChildrenRowTPL | &TplDepthN | &TplOneItem | дефолтное значение &TplOneItem |
Свои вопросы и предложения оставляйте в комментариях к статье, я постараюсь ответить на все комменты.
aharito.ru
параметры и шаблоны (документация) / Документация и уроки / MODX.im
Сниппет вывода меню DLBuildMenu, основанный на DocLister, предоставляет мощные инструменты создания меню сайта на MODx Evo. Но многие, даже опытные, MODx-юзеры его не применяют из-за отсутствия документации. Восполняю этот пробел.
Уровень статьи: для начинающих
Краткое описание
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)
Преимущества
- есть возможность применения prepare для обработки данных перед выводом.
- богатый выбор способов задания шаблонов, в том числе инлайн-шаблоны.
- сортировка по TV-параметрам с приведением к нужному типу.
- может делать фильтрацию по TV-параметрам.
- можно придумывать и задавать собственные параметры и обрабатывать их в prepare.
Параметры
Базовые параметры
&idType (hardcoded)Тип выборки аналогично DocLister.Возможные значения: parentsПримечание: значение параметра &idType жестко записано в коде как parents.
&parentsРодительская (начальная) папка.Возможные значения: список ID родителей через запятую.Значение по умолчанию: 0Примечание: Обратите внимание, что значение &parents по умолчанию равно 0, что означает «выводить начиная с корня сайта». Это отличается от дефолтного значения &parents параметра в ДокЛистере.
& currentDepthИсходный уровень вложенности (глубина).Возможные значения: целое число от 1 и больше.Значение по умолчанию: 1!!! В название параметра пришлось вставить пробел после "&" — иначе здешний парсер вырезает.
&maxDepthМакс. глубинаВозможные значения: целое число от 1 и больше.Значение по умолчанию: 5
&BeforePrepare и &AfterPrepareОбработка данных через prepare аналогично DocLister.Возможные значения: задаются по правилам ДокЛистера. Могут быть списком имен сниппетов и вызовов методов ранее загруженных классов, либо анонимной функцией.Примечание: для prepare в DLBuildMenu уже имеется встроенный обязательный вызов DLFixedPrepare::buildMenu. Обработчики из &BeforePrepare вызываются перед встроенным, из &AfterPrepare — после встроенного вызова.
&activeClassCSS-класс активного (текущего) пункта меню и его родительских элементов всех уровней.Возможные значиения: Имя CSS-класса, или несколько имён CSS-классов, заданные как в HTML-теге (через пробел).Значение по умолчанию: activeПримечание: этот класс и этот параметр существуют в дополнение к уже имеющимся в ДокЛистере классам 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-го уровня вложенности, для соответствующих уровней &orderByN имеет приоритет над &orderBy.Возможные значения: задаются по правилам MySQL для ORDER BY.Значение по умолчанию: нетПримечание: Если &orderByN не задан, для всех уровней используется &orderBy.
Параметры «Список TV»
&tvListСписок TV-параметров, которые участвуют в выборке (как в DocLister).Возможные значения: список имён TV-параметров через запятую.Значение по умолчанию: нет
&tvListNСписок TV-параметров в выборке для N-го уровня вложенности, для соответствующих уровней &tvListN имеет приоритет над &tvList.Возможные значения: список имён TV-параметров через запятую.По умолчанию: пусто.Примечание: Если &tvListN не задан, для всех уровней используется &tvList.
Шаблоны
Шаблоны DLBuildMenu задаются по правилам DL, то есть могут быть и инлайн-шаблонами, и именами чанков, или загружаться из файла, из документа MODx, из конфига, из глобального плейсхолдера.Шаблоны-обёртки
&TplMainOwnerОсновной шаблон-обертка.Значение по умолчанию:
@CODE:<ul>[+dl.wrap+]</ul>Примечание: у вас должен быть задан шаблон &TplMainOwner или &TplOwner1, иначе будет использовано дефолтное значение шаблона &TplMainOwner.&TplSubOwnerШаблон-обертка для вложенных уровней (для субменю).Значение по умолчанию:
@CODE:<ul>[+dl.wrap+]</ul>Примечание: для вывода N-уровневого меню у вас в дополнение к основной обёртке должен быть задан по крайней мере &TplSubOwner и/или шаблоны &TplOwnerN. Иначе будет использовано дефолтное значение &TplSubOwner.&TplOwnerNШаблон-обертка для субменю N-го уровня вложенности, для соответствующих уровней &TplOwnerN имеет приоритет над &TplMainOwner и &TplSubOwner (см. Примечание).Значение по умолчанию: нетПримечание: Если заданы и &TplOwner1, и &TplMainOwner, то будет использован &TplOwner1. Если заданы и &TplOwner2 и &TplSubOwner, то для уровня 2 будет использован &TplOwner2, а для уровней начиная с 3-го — &TplSubOwner.
Шаблоны пункта меню
&TplOneItemОсновной шаблон для каждого пункта меню всех уровней.Значение по умолчанию:
@CODE:<li> <a href="[+url+]" title="[+e.title+]">[+title+]</a> [+dl.submenu+] </li>Примечание: у вас должны быть заданы все нужные вам шаблоны пунктов меню, по крайней мере &TplOneItem. Иначе для пунктов, у которых шаблон не определен вами, будет использовано дефолтное значение &TplOneItem.&TplDepthNШаблон пункта меню вложенности N, для соответствующих уровней &TplDepthN имеет приоритет над &TplOneItem.Значение по умолчанию: нетПримечание: Например, если задан &TplDepth4, он заменит собой шаблон &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 соответственно для последнего, первого, текущего, четного и нечетного пункта. Кроме того, добавляет класс active для текущего элемента и родительских элементов всех уровней текущего элемента.Примечание: классы last, first, current, even, odd и active могут быть переопределены в параметрах &lastClass, & currentClass, &firstClass, &evenClass, &oddClass и &activeClass.!!! В название параметра & currentClass пришлось вставить пробел после "&" — иначе здешний парсер вырезает.
[+url+]УРЛ ресурса аналогично ДокЛистеру.[+e.title+]Экранированное значение menutitle или pagetitle (если menutitle пуст) аналогично Доклистеру.[+id+]ID ресурса аналогично ДокЛистеру.Другие плейсхолдеры из DocLister
Вы можете использовать и другие плейсхолдеры ДокЛистера, устанавливаемые контроллером site_content и различными экстендерами.Например:
- плейсхолдеры TV-параметров вида [+tv_prefix.tv_name+],
- плейсхолдеры экранированных значений вида [+e.field_name+],
- плейсхолдер [+date+] и другие.
Вопросы можете задавать и здесь и там.
modx.im
Помогите оптимизировать меню. Решено / Вопросы / MODX.im
Добрый день. Всех с наступающими праздниками. Есть многоуровневое выпадающее меню. Построено при помощи Wayfinder и DocLister. Вот такой вывод Wayfinder [[Wayfinder? &startId=`2` &level=`2` &rowTpl=`menu-row` &outerClass=`mainmenu` ]] чанк &rowTpl=`menu-row`<li [+wf.classes+]><a [+wf.id+] href="[+wf.link+]" ><span>[+wf.linktext+]</span></a> [[if? &is=`[+wf.wrapper+]:!empty` &then=`<div> [[DocLister? &parents=`[+id+]` &tpl=`menu_out` &orderBy=`menuindex ASC` &showInMenuOnly=`1`]] </div> ` ]] </li>Ну и собственно чанк &tpl=`menu_out`
<div> <a href="[+url+]">[+pagetitle+]</a> <ul>[[DocLister? &parents=`[+id+]` &tpl=`menu_tpl` &orderBy=`menuindex ASC`]]</ul> </div>Собственно конструкция прекрасно работает и отлично и правильно строит меню. Достаточно шустро, но 160 запросов к базе. Что можно исправить чтобы уменьшить количество запросов.
Решено: Спасибо всем кто отписался. Решил вопрос при помощи DLBuildMenu В итоге имеем вот такой код
[[DLBuildMenu? &parents=`2` &maxDepth=`3` &TplMainOwner=`@CODE:<ul>[+dl.wrap+]</ul>` &TplDepth2=`@CODE: <li><a href="[+url+]" ><span>[+pagetitle+]</span></a> <div> [+dl.submenu+] </div> </li>` &TplDepth3=`@CODE:<li><a href="[+url+]" title="[+e.title+]">[+title+]</a>[+dl.submenu+]</li>` &TplOwner3=`@CODE:<ul>[+dl.wrap+]</ul>` ]]В итоге получили такие данные
Mem : 6,25 mb, MySQL: 0,0312 s, 55 request(s), PHP: 0,1459 s, total: 0,1771 s, document from databaseБыло
Mem : 8,25 mb, MySQL: 0,1130 s, 185 request(s), PHP: 0,2917 s, total: 0,4047 s, document from databasemodx.im