Сегодня мы с вами продолжим разработку нашего интернет-магазина на MODx Revo и в данном уроке мы реализуем меню нашего сайта. Смотрите, меню у нас выводится в двух местах:
На главной странице сайта. Хочу обратить ваше внимание на выпадающий пункт:
Здесь у нас две колонки и имеется баннер для данной категории товаров. Также меню у нас выводится на внутренних страницах:
В данных блоках я решил вывести меню только каталога, остальные ресурсы, а именно информационные страницы, мы чуть позже выведем в верхнем блоке.
Итак, для начала я создал одну большую категорию, чтобы вживую проверить как все будет работать. Выглядит она у меня так:
Данный блок у нас будет служить демонстрацией нашего выпадающего меню на главной странице. Так же нам нужно создать для категорий два TV-параметра:
- menuactionimage – тип ввода изображение, тип вывода – по-умолчанию
- menuactionhref – тип ввода текст, тип вывода по умолчанию
При выводе баннера нам нужно предусмотреть такой вариант, что ссылка может быть не указана – это обычное явление.
Ну, что ж подготовка наша закончилась. В нашем выводе мы будем использовать два сниппета из набора pdoTools: pdoMenu и pdoResources.
Начнем с главной страницы. Зайдем в шаблон и найдем данный блок – он отделен комментарием “ TOP NAVIGATION ”. Если мы внимательно посмотрим на наш HTML-код, то увидим, что нам необходимо будет создать чанк для пунктов родителей. В данном случае при выводе мы будем использовать pdoMenu, поэтому в документации мы сможем подсмотреть как это сделать правильно. В данном же чанке у нас должны выводиться два столбца пунктов меню и баннер – не забываем про это. Два столбца меню можно вывести с помощью pdoResources (хотел сделать с помощью pdoMenu, но не сработали параметры offset и limit). Для вывода пунктов внутреннего меню я создал чанк liTpl:
<li><a href="[[~[[+id]]]]">[[+menutitle:default=`[[+pagetitle]]`]]</a></li>
А для pdoMenu чанк tplParentRow (megamenuInnerTpl) у меня получился следующий:
<li class="dropdown menu-item">
<a href="[[+link]]" class="dropdown-toggle" data-toggle="dropdown" [[+attributes]]>[[+menutitle]]</a>
<ul class="dropdown-menu mega-menu">
<li class="yamm-content">
<div class="row">
[[pdoResources?
&parents=`[[+id]]`
&depth=`0`
&limit=`10`
&tpl=`liTpl`
&showLog=`0`
&sortby=`{"menuindex":"ASC"}`
&where=`{"class_key":"msCategory"}`
&tplWrapper=`tplWrapper`
]]
[[pdoResources?
&parents=`[[+id]]`
&depth=`0`
&limit=`10`
&offset=`10`
&tpl=`liTpl`
&showLog=`0`
&sortby=`{"menuindex":"ASC"}`
&where=`{"class_key":"msCategory"}`
&tplWrapper=`tplWrapper`
]]
<div class="dropdown-banner-holder">
<a href="[[+menuactionhref]]"><img alt="" src="[[+menuactionimage]]" /></a>
</div>
</div>
</li>
</ul>
</li>
Чанк tplWrapper:
<div class="col-xs-12 col-lg-4"><ul class="list-unstyled">[[+output]]</ul></div>
Я здесь ограничил выборку только категориями miniShop2, сделал cортировку как в админке и предусмотрел наличие баннера и ссылки с него (в данном листинге этого нет, нужно добавить модификатор «ne» — подробно в видео).
И, собственно, сам вызов pdoMenu на шаблоне главной страницы принял следующий вид:
[[pdoMenu?
&parents=`7`
&outerClass=`nav`
&level=`2`
&where=`{"class_key":"msCategory"}`
&tplParentRow=`megamenuInnerTpl`
&includeTVs=`menuactionhref,menuactionimage`
]]
Не забываем про параметр includeTVs. Что ж, меню на главной у нас готово! Поздравляю! Теперь выведем меню на внутренних страницах. Данный блок у нас находится в чанке headerInner и отделен комментариями “ NAVIGATION ”. Данный блок у нас получится достаточно простой и вывод будет иметь вид:
[[pdoMenu?
&parents=`7`
&level=`2`
&sortby=`{"menuindex":"ASC"}`
&where=`{"class_key":"msCategory"}`
&outerClass=`nav navbar-nav`
&tplParentRow=`tplParentRow`
&innerClass=`dropdown-menu`
]]
Чанк tplParentRow:
<li class="dropdown"><a href="[[+link]]" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown" [[+attributes]]>[[+menutitle]]</a>[[+wrapper]]</li>
У нас все получилось! Теперь вы можете выводить меню! Поздравляю!