Modx evo dlbuildmenu


полное описание параметров и шаблонов

Сниппет вывода меню DLBuildMenu, основанный на DocLister, предоставляет мощные инструменты создания меню сайта на Evolution CMS (ex-MODx Evo). Но многие, даже опытные, разработчики не применяют DLBuildMenu — не в последнюю очередь из-за отсутствия документации. Восполняю этот пробел.

Краткое описание

DLBuildMenu — сниппет для вывода меню сайта на Evolution CMS и MODx Evo. Построен на основе ДокЛистера, по сути это сниппет-обертка с вызовом DocLister внутри — поэтому в нём можно использовать практически все параметры и фишки самого DocLister.

Применяя prepare, мы получаем неограниченные возможности подготовки данных. А развитая система шаблонизации ДокЛистер, дополненная в DLBuildMenu новыми параметрами, даёт в руки, на мой взгляд, даже чрезмерно богатый инструментарий.

Разработчик:  Agel_Nash

Зависимости и требования

Установка

Файлы

Преимущества DLBuildMenu

Кроме того, в DLBuildMenu работают и другие фишки из арсенала ДокЛистер, описывать которые здесь не стану, для этого нужно изучать сам DL.

Параметры

Базовые параметры

&idType (hardcoded)

Тип выборки аналогично DocLister.

Возможные значения: parents

Примечание: значение параметра &idType жестко записано в коде как parents.

&parents

Родительская (начальная) папка.

Возможные значения: ID родителя, либо список ID родителей через запятую.

Значение по умолчанию: 0

Примечание: Обратите внимание, что в DLBuildMenu значение &parents по умолчанию равно 0, что означает «выводить начиная с корня сайта». Это отличается от дефолтного значения &parents параметра в ДокЛистере.

&currentDepth

Исходный уровень вложенности (глубина).

Возможные значения: целое число от 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, &currentClass, &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

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

aharito.ru

параметры и шаблоны (документация) / Документация и уроки / MODX.im

Сниппет вывода меню DLBuildMenu, основанный на DocLister, предоставляет мощные инструменты создания меню сайта на MODx Evo. Но многие, даже опытные, MODx-юзеры его не применяют из-за отсутствия документации. Восполняю этот пробел.

Уровень статьи: для начинающих

Краткое описание
DLBuildMenu — сниппет для вывода меню сайта на MODx Evolution. Построен на основе ДокЛистера, по сути этосниппет-обертка с вызовом DocLister внутри — поэтому в нём можно использовать практически все параметры и фишки самого DocLister.

Применяя prepare, мы получаем неограниченные возможности подготовки данных. А развитая система шаблонизации ДокЛистер, дополненная в DLBuildMenu новыми параметрами, даёт в руки, на мой взгляд, даже чрезмерно богатый инструментарий.

Разработчик: Agel_Nash

Зависимости и требования
Установка
Файлы
Преимущества
Кроме того, в DLBuildMenu работают и другие фишки из арсенала ДокЛистер, описывать которые здесь не стану, для этого нужно изучать сам DL.
Параметры
Базовые параметры
&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 и различными экстендерами.

Например:

Для получения более подробной информации по плейсхолдерам ДокЛистера, по экстендеру e (экранирование) и другим возможностям см. документацию к DocLister. Более полная статья по DLBuildMenu — на моем сайте, там в конце материала есть еще «Таблица приоритетов шаблонов» (здешний редактор не создает таблиц).

Вопросы можете задавать и здесь и там.

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 database

modx.im


Prostoy-Site | Все права защищены © 2018 | Карта сайта