Параметры шаблонов pdoMenu
Если вы читаете данную статью, значит, во-первых, вы знаете, что такое pdoMenu и pdoTools, а во-вторых, у вас возникли трудности с пониманием какой параметр шаблона для чего нужен.
Шаблонов у pdoMenu больше 10. Вот их полный список. Давайте теперь последовательно их разберём.
Параметр tplOuter
Это самый первый параметр в описании. Он содержит или название чанка или код инлайн-чанка, который будет контейнером для пунктов меню. По-умолчанию, в нём указано @INLINE <ul[[+classes]]>[[+wrapper]]</ul>
. Плейсхолдер [[+wrapper]]
будет заменён на пункты меню. А в плейсхолдер [[+classes]]
подставится значение параметра outerClass
, в котором указывается класс контейнера меню. В принципе, можно сразу указать нужный класс в шаблоне. В этом случае параметр outerClass
можно не использовать.
[[pdoMenu? &tplOuter = `@INLINE <ul class="myMenuWrapperClass">[[+wrapper]]</ul>` ... ]]
Параметр tpl
Он отвечает за формирование пунктов меню. В нём также указывается чанк (обычный или инлайн). По-умолчанию, он содержит шаблон элемента списка для контейнера, указанного в предыдущем параметре —
@INLINE <li[[+classes]]><a href="[[+link]]" [[+attributes]]>[[+menutitle]]</a>[[+wrapper]]</li>
Мы тут видим элемент li, который содержит ссылку на страницу. За ссылку отвечает плейсхолдер [[+link]]
, который формируется согласно параметру scheme
. Если вы используете относительные ссылки, то [[+link]]
можно безболезненно заменить на [[+uri]]
.
Плейсхолдеры [[+attributes]]
и [[+menutitle]]
содержат значение полей ресурса link_attribute
и menutitle
соответственно. Тут надо отметить, что если поле menutitle
пустое, то в плейсхолдер [[+menutitle]]
будет записано значение поля pagetitle
.
В плейсхолдере [[+classes]]
хранятся классы, указанные в параметрах классов, за исключением параметров outerClass
и innerClass
. Эти параметры используются в шаблонах-контейнерах, указанных в tplOuter
и tplInner
соответственно. В документации про классы описано достаточно понятно.
Запомните!
Есть одна ломающая логическую парадигму тонкость — параметр шаблона для активных элементов меню имеет суффикс «Active», параметры текущих элементов — суффикс «Here» (tplHere, tplParentHere). А у классов — для активного пункта предназначен параметр hereClass
со значением по-умолчанию «active», а для текущего пункта — параметр selfClass
.
Было бы логичнее назвать их по аналогии с шаблонами activeClass
и hereClass
соответственно.
На всякий случай поясню, что текущий пункт — это текущая открытая страница, а активные пункты — это текущая страница и её родители.
Плейсхолдер [[+wrapper]]
необходим для вывода следующего уровня меню. Если его убрать, то дочерние ресурсы показываться не будут, т.е. будет отображён только первый уровень меню.
В принципе этих двух параметров хватит для вывода меню. Достаточно указать родителя и уровень вложенности:
[[pdoMenu? &parents=`0` &level=`2` ]]
Параметр tplHere
Если вы хотите, чтобы текущий пункт меню отличался от остальных не только классом, но и разметкой (например, вместо ссылки должен быть текст), то в этом случае на помощь придёт параметр tplHere
.
[[pdoMenu? &parents=`0` &level=`2` &tplHere=`@INLINE <li [[+classes]]><span>[[+menutitle]]</span>[[+wrapper]]</li>` ]]
Параметр tplParentRow
Этот параметр используется в тех случаях, когда нужно выделить пункт меню, у которого есть подменю, и одним классом не обойтись. Например, добавить дополнительные элементы в разметку — треугольники, картинки и т.п.
У меня в разделе Документация этот параметр выглядит так
&tplParentRow = `@INLINE <li [[+classes]]><i class="fa fa-caret-right trigger"></i> <a href="[[+link]]">[[+menutitle]]</a><div class="collapsible">[[+wrapper]]</div></li>`
Параметр tplParentRowHere
В этом параметре указывается шаблон для открытой страницы-контейнера. Если вы указали шаблон в tplParentRow
, то придётся определять шаблон и для этого параметра. В противном случае для текущего пункта меню будет использоваваться шаблон, указанный в параметре tplHere
, который используется для обычных пунктов, т.е. не контейнеров.
Параметр tplParentRowActive
Шаблон, указанный в данном параметре, используется для отображения всех родителей текущей страницы. Т.е. если вы выбрали ресурс, находящийся на 3-ем уровне, то родительские пункты меню первого и второго уровня отрисуются согласно шаблону, указанному в этом параметре. Если его не указывать, то будет использован шаблон из tplParentRow
(или tpl
, если не указан tplParentRow
).
Теперь давайте рассмотрим параметры для вложенного меню — tplInner
, tplInnerRow
и tplInnerHere
.
Параметр tplInner
Шаблон из этого параметра является обёрткой для вложенных пунктов меню. Обычно это ul элемент. Т.е. он аналогичен шаблону tplOuter
. И если его не указать, то tplOuter
и будет использоваться.
Параметр tplInnerRow
Является аналогом tpl
, но используется только для вложенных пунктов. Если не указан, то вместо него будет применён шаблон tpl
.
Параметр tplInnerHere
Заменяет шаблон из tplHere для вложенных пунктов.
Вот как это выглядит.
<ul> // tplOuter <li>Первый пункт. Содержит подменю. Активный // tplParentRowActive <ul> // tplInner <li>Первый подпункт, текущий</li> // tplInnerHere <li>Второй подпункт</li> // tplInnerRow </ul> </li> <li>Второй пункт. Содержит подменю // tplParentRow <ul> // tplInner <li>Первый подпункт</li> // tplInnerRow <li>Второй подпункт</li> // tplInnerRow </ul> </li> <li>Третий пункт</li> // tpl </ul>
Параметр tplCategoryFolder
Этот параметр позволяет задать шаблон для отдельных пунктов меню. Вот что указано в документации —
Специальный чанк оформления категории. Категория — это документ с «isfolder = 1» и или нулевым шаблоном, или с атрибутом «rel=category»
Этот шаблон предназначен для каких-то специфических случаев.
Параметр levelClass
Это важный параметр. Он позволяет указать уровень пунктов меню через название класса. Т.е. если задать значение «level», то у элементов первого уровня будет класс «level1», у второго — «level2» и т.д. Это упрощает задачу оформления меню.
Надеюсь, стало более менее понятно.
Комментарии ()
Вы должны авторизоваться, чтобы оставлять комментарии.
Пытаюсь раскрутить на pdoMenu следующим образом:
Есть предложения почему не получается?
:)
Совершенно не понятно, что не получается. Меню совсем не выводится или нет отдельных пунктов?
По поводу шаблонов…
— В tplOuter нужно указать тег ul.
— В tplInner не нужно указывать menutitle. От tplOuter у вас он отличается только классом.
— Вы везде указываете тег с классами, а сами классы не определяете.
Как надо:
Я не знаю как подгрузить классы ко второму и третьему пунктам меню. Сергей, спасибо, что помогаете:E
Для третьего пункта соответственно, «bg-3» и т.д. Соответственно параметры классов у сниппета можно удалить. А в шаблонах &tpl и &tplParentRow вместо [[+classes]] указать [[+attributes]]. Это общая практика.
В вашем случае классы содержат нумерацию. Поэтому можно использовать плейсхолдер [[+idx]] для указания номера пункта. Для этого нужно изменить шаблоны
Однако все равно не помогает(
html код
И как видно пункты 3 и 3.1 имеют разные классы и у вложенных в них ссылок различные атрибуты, но как я понял они оба задаются параметром tplParentRow, но т.к. у них разные классы то стили работают некорректно, как бы это исправить?
Используя следующий код pdoMenu не работает пункты 3.1…
Насколько я понял, Вы используете css фреймворк. Поэтому для начала попробуйте разобраться с работой дропдауна. В сети много примеров построения многоуровневого меню для любых фреймворков.
В вашей верстке для пункта 3 указаны атрибуты, я для пункта 3.1 нет.
И то что я смог написать:
То есть до второго уровня я дошёл без проблем, но как вывести третий уровень, ума не приложу…
Прошу помогите или напишите пример реализации такой вложенности меню!!! За ранее спасибо!!!
1. Вы 2 раза оборачиваете меню в тег div class=«sidebar-content». Или уберите из разметки или из шаблона tplOuter. Я бы посоветовал второй вариант.
2. Если Вы не хотите, чтобы на каждом уровне выводился заголовок h4, то перенесите его из шаблона tplInner в шаблон tpl.
3. Касательно третьего и остальных уровней меню. Проблема в невнимательности. Давайте обратимся к описанию параметра tpl:
В шаблоне tpl он у Вас есть, а в шаблоне tplInnerRow нет. Поэтому следующий уровень и не отображается.
Это то, что бросается в глаза с первого взгляда.
С уважением! Роман.
Подскажите, есть ли в Modx другой способ реализации такого меню, что бы у каждого уровня вложенности можно было задавать свои стили(классы) как обёрткам(ul), так и пунктам меню? За ранее спасибо за ответ!
Может вы сможете мне объяснить с PDOMenu
у меня есть код верстки:
и вызов в PDOMenu
вот ссылка где это оформлено: 7pobed.tmweb. ru
Смысл в том что не могу вывести треий уровень меню… тончее могу но унего наследуеться класс родителя и он становиться как верхний уровень выпадающим а мне необходимо чтобы третий уровень меню был расположен под вторым уровенм меню просто списком.
Единственное, что я могу посоветовать — используйте феном. С его помощью данная задача решается очень легко.
Подсказка: в tplInner и tplInnerRow проверяйте переменную $level. Инлайн чанк придётся заменить на обычный или файловый, иначе будет сложновато читаться.
я решил с помощью fenom по вашему совету, и у меня решение чуток отличаеться от того что в ссылке)
Но в целом работает теперь все как надо.
Достаточно было написать всего лишь два условия на Fenom и все оказалось довольно просто
и 2 чанка
tplInnerMenu
и чанк
tplInnerRowMenu
Скажите, а чанки «tplInnerRowMenu» и «tplInnerRowMenu» это Modx чанки или можно файловые сделать и обратится к ним через команду
?
И еще мне непонятно, как создаётся и переменная "$level"? Или она автоматически генерируется команлой
?
За ранее спасибо за ответ!
С уважением!
Роман.
можно сделать и файловыми — это как вам удобнее.
про переменную где то вычитал, поэтому как она формируеться не могу сказать к сожалению
Нужна помошь.
Прописываю все в pdomenu
Что я не правильно делаю
не получаеться выпадающий список
Подскажите пожалуйста как реализовать данное меню при помощи pdomenu:
Я понимаю что меню совсем простое но у меня затруднение с выводом первой и последней строки.
Прошу помощи у знатоков так как только начал работать с Modx
Единственный вопрос как добиться пометки активного пункта
Огромное вам спасибо за помощь!!!
Это в html шаблоне