Вряд ли найдется MODx-сайт, на котором не использовался бы мощнейший сниппет для формирования меню Wayfinder. Всем хорош, элегантен, невероятно гибок, но и в нем есть вещи, которые хотелось бы улучшить. Мне, например, иногда не хватает в нем возможности отсечь часть вывода по определенному критерию. Разумеется, можно написать свой сниппет, но зачем заниматься лишней работой, когда в нашем распоряжении вся мощь модэкса?
В нынешнем случае потребовалось сделать меню на сайте интернет-магазина, в котором по документам-контейнерам были распределены товары. Такое разделение условно – возможно, мы будем разделять не товары и категории товаров, а файлы и папки в дереве документов. Принцип останется тем же. В каждый контейнер могут входить как документы-товары, так и другие документы-контейнеры. Например, в документ-контейнер «Продукты» мог попасть «арбуз» (документ) и «фрукты» (контейнер). Тип документа определялся шаблоном: «папка» или «документ». Первоначально меню создавалось вот таким вызовом сниппета:
[!Wayfinder? &startId=`51`!]
Здесь «51» – корневой документ, верхний уровень, «склад» товаров и их категорий, ваша точка «/», если применять аналогию с файлами и папками. В нем расположились другие контейнеры и документы. К сожалению, такое меню быстро перестало меня устраивать. Некоторые контейнеры были вложенными на разные уровни глубины, а вываливать вместе с ними длинные списки документов было некрасиво.
Если бы меню выводилось при помощи Ditto, можно было просто поставить фильтр, который включит в список только документы с нужным шаблоном:
[[Ditto? &startID=`0` &depth=`0` &filter=`template,5,1` &tpl=`menuTpl`]]
Здесь «5» - это номер шаблона для «папок»-контейнеров. К сожалению, Ditto не построит нужной мне иерархической структуры, он просто не предназначен для этого. Значит, придется все-таки воспользоваться Wayfinder. Если как следует подумать, фильтр в этом сниппете все-таки имеется, хотя и в завуалированном виде. Я говорю о параметре excludeDocs.
Вы, наверное, возразите, что это никакой не фильтр, а просто список документов, которые надо исключить из вывода сниппета. Все верно, но кто мешает нам сделать этот параметр динамическим?
[!Wayfinder? &startId=`51` &excludeDocs=``!]
Дело за малым – нам нужно предоставить сниппету чанк, в котором будут через запятую перечислены ID документов с описанием товаров. Давайте создадим чанк с таким названием и внесем в него следующую строку:
[[Ditto? &startID=`0` &depth=`0` &filter=`template,6,1`]#93;
Здесь «6» - это номер моего шаблона для документов с описанием товара. Иначе говоря – критерий для исключения документа из публикации в меню. Правда, в таком виде эта конструкция работать не будет, поскольку вместо списка номеров мы получим стандартный вывод Ditto с названиями, датами и аннотациями документов. Нам нужны только ID. Чтобы не загромождать систему лишними чанками, вставим нужные шаблоны прямо в вызов Ditto. Для этого я предлагаю использовать один из моих любимых приемов – @-привязку.
[[Ditto? &startID=`0` &depth=`0` &filter=`template,6,1` &tpl=`@CODE ,` &tplLast=`@CODE `]]
Параметр «tpl» задает шаблон для выдачи ID документа с запятой после него, tplLast нужен для того, чтобы после последнего числа не добавлялась лишняя запятая.
Итак, что мы имеем? Дитто, согласно критерию фильтрации (нужный шаблон) выдает список документов-«не контейнеров», вернее только их ID через запятую (благодаря использованию микро-шаблонов с @-привязкой). Wayfinder берет полный список папок и документов, а затем исключает из него по списку те, который предоставил ему Ditto. Получается аккуратное и не загроможденное меню с нужной нам информацией.
Обожаю MODx.
Александр Поляков
lecosson@mail.ru

Иван Куликов 04.03.2014 09:24 #
Выводим только с шаблоном id=6
Не знаю с какой версии они включили where
Виталий 16.10.2014 08:10 #