Сниппет MODx Revolution pdoResources
Оглавление
pdoResources — сниппет предназначен для вывода списка ресурсов. Является продвинутой заменой для getResources: обладает всеми его возможностями, но лишен недостатков.
Умеет правильно сортировать ТВ параметры, присоединять таблицы при выборке, включать и исключать категории из разных контекстов и еще много чего.
#Параметры
Параметры сниппета pdoResources.
#Параметры выборки ресурсов
Эти параметры определяют, какие ресурсы появятся в генерируемом списке.
&parents | Текущий ресурс | Список родителей, через запятую, для поиска результатов. Если поставить 0 — выборка не ограничивается. Если id родителя начинается с дефиса, он и его потомки исключаются из выборки. |
10 | Глубина поиска дочерних ресурсов от родителя. | |
&resources | Список ресурсов, через запятую, для вывода в результатах. Если id ресурса начинается с дефиса, этот ресурс исключается из выборки. | |
&context | Ограничение выборки по контексту ресурсов. | |
&where | Массив дополнительных параметров выборки, закодированный в JSON. | |
&showHidden | 1 | Показывать ресурсы, скрытые в меню. |
&showUnpublished | 0 | Показывать неопубликованные ресурсы. |
&showDeleted | 0 | Показывать удалённые ресурсы. |
&hideContainers | 0 | Отключает вывод контейнеров, то есть, ресурсов с «isfolder = 1». |
&select | 0 | Список полей для выборки, через запятую. Можно указывать JSON строку с массивом, например {"modResource":"id,pagetitle,content"} . |
&sortby | pagetitle | Любое поле ресурса для сортировки, включая ТВ параметр, если он указан в параметре &includeTVs. Можно указывать JSON строку с массивом нескольких полей, например {"tvname":"ASC", "pagetitle":"DESC"} . Для случайно сортировки укажите «RAND ()» |
&sortdir | DESC | Направление сортировки: по убыванию или возрастанию. |
&setTotal | 0 | Отключение выборки total по умолчанию (с версии 2.11.0). Сниппет pdoPage включает его всегда. |
&limit | 10 | Ограничение количества результатов выборки. Можно использовать «0». |
0 | Пропуск результатов от начала. Необходимо использовать вместе с явно указанным &limit. | |
&first | 1 | Номер первой итерации вывода результатов. |
&last | Автоматически, по формуле (total + first — 1) | Номер последней итерации вывода результатов. |
&loadModels | Список компонентов, через запятую, чьи модели нужно загрузить для построения запроса. Например: &loadModels=`ms2gallery, msearch3`. | |
&tvFilters | Список фильтров по ТВ, с разделителями AND и OR. Разделитель, указанный в параметре &tvFiltersOrDelimiter представляет логическое условие OR и по нему условия группируются в первую очередь. Внутри каждой группы вы можете задать список значений, разделив их &tvFiltersAndDelimiter . Поиск значений может проводиться в каком-то конкретном ТВ, если он указан «myTV==value», или в любом «value». Пример вызова: &tvFilters=`filter2==one, filter1==bar%||filter1==foo`. Обратите внимание: фильтрация использует оператор LIKE и знак «%» является метасимволом. И еще: Поиск идёт по значениям, которые физически находятся в БД, то есть, сюда не подставляются значения по умолчанию из настроек ТВ. | |
&tvFiltersAndDelimiter | »,» | Разделитель для условий AND в параметре &tvFilters. |
&tvFiltersOrDelimiter | «||» | Разделитель для условий OR в параметре &tvFilters.tplFirst |
Название | По умолчанию | Описание |
Параметры шаблонов
Эти параметры устанавливают чанки, которые содержат шаблоны для генерации вывода, то есть отвечают за внешний вид.
Название | Описание |
&returnIds | Установите значение «1», чтобы вернуть строку со списком id ресурсов, вместо оформленных результатов. Все указанные шаблоны игнорируются. |
&tpl | Имя чанка для оформления ресурса. Если не указан, то содержимое полей ресурса будет распечатано на экран. |
&tplFirst | Имя чанка для первого ресурса в результатах. |
&tplLast | Имя чанка для последнего ресурса в результатах. |
&tplOdd | Имя чанка для каждого второго ресурса. |
&tplWrapper | Чанк-обёртка, для заворачивания всех результатов. Понимает один плейсхолдер: [[+output]] . Не работает вместе с параметром &toSeparatePlaceholders . |
&wrapIfEmpty | Включает вывод чанка-обертки &tplWrapper даже если результатов нет. |
&tplCondition | Поле ресурса, из которого будет получено значение для выбора чанка по условию в &conditionalTpls. |
&tplOperator | Необязательный оператор для проведения сравнения поля ресурса в &tplCondition с массивом значений и чанков в &conditionalTpls. |
&conditionalTpls | JSON строка с массивом, у которого в ключах указано то, с чем будет сравниваться &tplCondition, а в значениях — чанки, которые будут использованы для вывода, если сравнение будет успешно. Оператор сравнения указывается в &tplOperator. Для операторов типа isempty можно использовать массив без ключей. |
&outputSeparator | Необязательная строка для разделения результатов работы. |
Параметры результатов
Эти параметры дополнительно определяют, какие данные и каким способом будут выводиться.
Название | По умолчанию | Описание |
&fastMode | 0 | Быстрый режим обработки чанков. Все необработанные теги (условия, сниппеты и т. п.) будут вырезаны. |
&idx | Вы можете указать стартовый номер итерации вывода результатов. | |
&totalVar | total | Имя плейсхолдера для сохранения общего количества результатов. Параметр &setTotal должен быть включен. |
&includeContent | 0 | Включаем поле «content» в выборку. |
&includeTVs | Список ТВ параметров для выборки, через запятую. Например: «action, time» дадут плейсхолдеры [[+tv.action]] и [[tv.time]] . | |
&prepareTVs | «1», что означает подготовку всех ТВ, указанных в &includeTVs | Список ТВ параметров, которые нужно подготовить перед выводом. |
&processTVs | Список ТВ параметров, которые нужно обработать перед выводом. Если установить в «1», будут обработаны все ТВ, указанные в &includeTVs. | |
&tvPrefix | tv. | Префикс для ТВ параметров. |
&useWeblinkUrl | Генерировать ссылку с учетом класса ресурса, включает плейсхолдер [[+link]] . | |
&toPlaceholder | Если не пусто, сниппет сохранит все данные в плейсхолдер с этим именем, вместо вывода не экран. | |
&toSeparatePlaceholders | Если вы укажете слово в этом параметре, то ВСЕ результаты будут выставлены в разные плейсхолдеры, начинающиеся с этого слова и заканчивающиеся порядковым номером строки, от нуля. Например, указав в параметре «myPl», вы получите плейсхолдеры [[+myPl0]] , [[+myPl1]] и т. д. | |
&showLog | 0 | Показывать дополнительную информацию о работе сниппета. Только для авторизованных в контекте «mgr». |
Примеры
Простейший вывод списка дочерних ресурсов документа с идентификатором 1:
/* modParser */
[[pdoResources?
&parents=`1`
&depth=`0`
&tpl=`ListRowTpl`
]]
/* pdoParser */
{$_modx->runSnippet('!pdoResources', [
'parents' => 1,
'depth' => 0,
'tpl' => 'ListRowTpl',
])}
Если используется дополнительное поле image, то вызов изменится следующим образом:
/* modParser */
[[pdoResources?
&parents=`1`
&depth=`0`
&tpl=`ListRowTpl`
&includeTVs=`image`
]]
/* pdoParser */
{$_modx->runSnippet('!pdoResources', [
'parents' => 1,
'depth' => 0,
'tpl' => 'ListRowTpl',
'includeTVs' => 'image',
])}
В чанке ListRowTpl за это поле будет отвечать плейсхолдер [[+tv.image]]
.
Дополнительная информация
При переносе чанков с getResources, довольно распространённой ошибкой является использование модификатора strtotime, для форматирования даты.
Дело в том, что даты ресурсов и так хранятся в виде timestamp, но конвертируются в нормальные даты из-за использования объектов modResource — так запрограммировано в его свойствах. А потом, для форматирования даты, их нужно перевести обратно в timestamp. Выходит двойная ненужная конвертация.
pdoTools же работает напрямую с базой данных, без создания объектов и конвертации их значений, поэтому в чанк приходит timestamp, который не нужно дополнительно обрабатывать. Вы можете сразу применять модификатор date к значениям:
[[+publishedon:date=`%d.%m.%Y`]]
или
[[+createdon:date=`%Y-%m-%d`]]
Это касается работы с датами ресурсов и в других сниппетах pdoTools.
pdoResources как замена getResources / Сниппеты / Modx Revolution / Технический блог веб-разработчика
pdoResources как замена getResources
Ближайший аналог этих сниппетов в Evo — это Ditto. Используются для вывода дочерних ресурсов текущего документа, но можно указать и определённого родителя. Как пример, такое можно встретить в блоге — когда выводятся все записи определённой категории. pdoResources гораздо функциональнее и шустрее getResources, поэтому я его больше рекомендую к использованию. Различия в использовании параметров данных снипетов минимальны, поэтому переход на pdoResources будет безболезненным. Там же, где всё-таки есть небольшие нюансы, об этом будет написано отдельно.
Основные параметры
getResources (значение по умолчанию) | pdoResources (значение по умолчанию) | Применение |
---|---|---|
&parents=`[[*id]]` |
&parents=`[[*id]]` |
Список родителей, из которых будут выводиться дочерние ресурсы (указываются через запятую). Если перед именем ресурса поставить дефис, то такой ресурс будет исключаться из выборки. |
&resources |
&resources | Список ресурсов для вывода. При указании дефиса, ресурс исключается из выборки. |
&depth=`10` |
&depth=`10` | Глубина выборки от родителя. |
&tvFilters |
&tvFilters |
Фильтрация ресурсов по значениям TV. Примеры вызова: Фильтрация для поиска использует оператор LIKE, поэтому можно писать так: pdoResources. Можно использовать кастомные разделители значений. Задаются в параметрах tvFiltersOrDelimiter=`||`, tvFiltersAndDelimiter=`,`— разделители для «ИЛИ» и «И» соответственно. |
&sortby=`createdon` |
&sortby=`pagetitle` |
Поле ресурса, по которому будет происходить сортировка. pdoResources. Eсли в параметрах свойства includeTVs перечислены значения TV, то возможна сортировка и по ним. getResources. Для сортировки по TV параметрам и задания направления используются параметры sortbyTV и sortdirTV соответственно. |
&sortdir=`DESC` |
&sortdir=`DESC` |
Направление для сортировки. |
&limit=`5` |
&limit=`10` |
Ограничение по количеству результатов. |
&offset=`0` |
&offset=`0` |
Пропуск результатов от начала. |
&where |
&where |
Ограничение выборки по тем или иным параметрам. Представляет собой строку, закодированную в JSON. |
&context |
&context |
Ограничение выборки по контексту. |
Дополнительные параметры
getResources (значение по умолчанию) | pdoResources (значение по умолчанию) | Применение |
---|---|---|
&showUnpublished=`0` |
&showUnpublished=`0` |
Показывать ли неопубликованные ресурсы. |
&showDeleted=`0` |
&showDeleted=`0` | Показывать ли ресурсы, помеченные как удалённые. |
&showHidden=`0` |
&showHidden=`0` | Показывать ли ресурсы, у которых стоит галочка «Не показывать в меню». |
&hideContainers=`0` |
&hideContainers=`0` | Показывать ли ресурсы, которые являются контейнерами. |
&includeContent=`0` |
&includeContent=`0` | Подгружать ли поле content. |
&includeTVs=`0` |
&includeTVs |
В параметрах указываем TV, которые так же будут доступны. В чанке доступ к TV будет доступен через плэйсхолдеры с префиксом tv. Например, [[+tv.price]] |
&prepareTVs=`1` |
&prepareTVs=`1` |
Список TV-параметров, которые нужно подготовить перед выборкой. 1 означает — подготовить все TV. |
&processTVs=`0` |
&processTVs |
Список TV, которые будут обработаны перед выводом. |
&tvPrefix=`tv.` |
&tvPrefix=`tv.` |
Префикс для TV параметров. |
&idx=`1` |
&idx |
Цифра, с которой будет начинаться итерируемый плейсхолдер [[+idx]] |
&totalVar=`total` |
&totalVar=`total` |
Имя плейсхолдера, в котором будет храниться общее количество результатов. |
debug=`false` |
&showLog=`0` |
Будет ли выведена информация, отвечающая за отладку. Какие SQL запросы были выполнены и т. д. |
Параметры шаблонов
getResources (значение по умолчанию) | pdoResources (значение по умолчанию) | Применение |
---|---|---|
&tpl |
&tpl |
Имя чанка ресурса. Если не указано, то будет выведено содержимое всех полей. |
&tplOdd |
&tplOdd | Имя чанка для чётных ресурсов. |
&tplFirst |
&tplFirst | Имя чанка для первого ресурса. |
&tplLast |
&tplLast | Имя чанка для последнего ресурса. |
&tplCondition |
&tplCondition | Поле ресурса, в котором будет содержаться значение для выбора чанка по условию, заданному в параметре conditionalTpls |
&conditionalTpls |
&conditionalTpls |
JSON-строка с массивом, ключом которого будет выступать строка, которая будет сравниваться с полем, указанным в параметре tplCondition. А в качестве значения ключа будет выступать имя чанка, который будет использован, если условие выполнится. pdoResources. Оператор сравнения можно дополнительно указать в параметре tplOperator. |
&tplWrapper |
&tplWrapper |
Чанк-обёртка, в котором будут выводиться все ресурсы. [[+output]] — плэйсхолдер всех результатов. |
&wrapIfEmpty=`false` |
&wrapIfEmpty |
Если в качестве значения указать 1, то принудительно выводит чанк, указанный в параметре tplWrapper, даже если результатов нет. |
&outputSeparator=`\n` |
&outputSeparator |
Строка для разделения результатов вывода. |
&toPlaceholder |
&toPlaceholder |
Если не пусто, то сниппет вместо вывода на экран, сохранит все результаты в плэйсхолдер. |
&toSeparatePlaceholders |
&toSeparatePlaceholders |
Если заполнить значение данного параметра, то вместо плэйсхолдера со всеми результатами, на выходе получится множество плэйсхолдеров, которые начинаются со значения, указанного вами в данном параметре. А после этого параметра будет идти порядковый номер результата плэйсхолдера. |
Примеры работы
Самый простой вызов, с необходимым минимумом параметров:
[[pdoResources?
&parents=`1`
&depth=`0`
&tpl=`catalog_item`
]]
Когда необходимо подключить дополнительный TV при выводе:
[[pdoResources?
&parents=`1`
&depth=`0`
&tpl=`catalog_item`
&includeTVs=`price`
]]
Сортируем элементы по индексу (порядок расположения в дереве элементов):
[[!pdoResources?
&tpl=`item_cat_second`
&depth=`0`
&parents=`9`
&sortby=`menuindex`
&sortdir=`ASC`
]]
Замена getResources на pdoResources в MODX Revolution
Вчера я решил попробовать заменить на сайте snippet вывода ресурсов «getResources» на «pdoResources». Результат превзошел все мои ожидания. Время загрузки кешируемой главной страницы уменьшилось с 1.1 сек до 0.76 сек.
Переход занимает менее 10 минут. Достаточно установить из репозитория пакет pdoTools (про пакет «pdoTools» и остальные его сниппеты я написал отдельную статью — pdoTools в MODX Revoluton — замена стандартных сниппетов) и сделать несколько правок.
Меняем название getResources на pdoResources
Само собой разумеющийся пункт и здесь хотелось бы лишь отметить, что если для вывода ресурсов у вас используется постраничная навигация («getPages»), то это никак не помешает переходу. Точно так же применяйте вместо элемента вывода getResources — pdoResources. Различие в параметрах будет лишь одно. О нем ниже.
includeTVs — включение TV параметров в вывод ресурсов
В «getResources» указывается значение 1 если требуется включать TV параметры в результат вывода и 0, если не требуется:
&includeTVs=`1`
В «pdoResources» необходимо указывать имена TV параметров, которые требуется включить в результат вывода, через запятую:
&includeTVs=`img-news,tags`
Вывод даты публикации ресурса
В getResources:Опубликовано: [[+publishedon:strtotime:date=`%d %b %Yг. в %H:%M`]]
В pdoResources убираем промежуточную функцию strtotime:Опубликовано: [[+publishedon:date=`%d %b %Yг. в %H:%M`]]
Замена «getResourcesTag»
Вместе с «getResources» идет сниппет «getResourcesTag», который выводит ресурсы по тегу. «pdoResources» может заменить и его. Я реализовал замену включением в «pdoResources» следующего параметра:
&where=`{"tags:LIKE":"%[[!getUrlParam? &name=`tag`]]%"}`
Он указывает на то, что требуется вывести только те статьи, у которых в TV-поле «tags» встречается слово, передаваемое в адресной строке в параметре «tag».
Для получения этого параметра я использую snippet «getUrlParam». Устанавливается он из репозитория как обычный пакет. Он предназначен для вывода значения переменной, передаваемой в адресной строке методом GET.
Параметр «conditionalTpls»
На самом деле, этот пункт здесь лишний, так как данный параметр есть как у первого сниппета, так и у второго. Однако, узнал я о его существовании только когда начал разбираться c «pdoResources».
&conditionalTpls — параметр применяется в сниппетах pdoResources/getResources при необходимости осуществить вывод отдельных ресурсов в «свои» чанки:
[[!pdoResources? &parents=`2` &tpl=`chunk1` &tplCondition=`pagetitle` &tplOperator=`==` &conditionalTpls=`{"Статья 2":"chunk2", "Статья 5":"chunk3"}` ]]
&tplCondition — Поле ресурса, из которого будет получено значение для выбора чанка по условию в «conditionalTpls». Например: pagetitle или alias.
&tplOperator — Оператор сравнения, возможный список:
==, !=, , =, empty, !empty, isnull
&conditionalTpls — строка с массивом, в котором указано то, с чем будет сравниваться «tplCondition», а в значениях — чанки, которые будут использованы для вывода, если сравнение будет успешным.
Фильтрация по TV в pdoResources / Русскоязычное сообщество MODX
Здравствуйте!У меня есть TV акция типа переключатели (радио):
Да==1||Нет==0
Значение по умолчанию — 0И два ресурса — один с акцией, другой без.
Не работает вызов pdoResources:
[[!AjaxSnippet?
&snippet=`pdoPage`
&propertySet=`blog`
&element=`pdoResources`
&parents=`[[*id]]`
&tpl=`blogTpl`
&includeTVs=`isAction,actionDate,imageOnMain,textOnMain`
&prepareTVs=`1`
&processTVs=`1`
&where=`{"isAction":"0"}`
&limit=`1`
&page=`[[!geturi]]`
&pageVarKey=`page2`
&as_mode=`onload`
&wrapper=`tpl.ajax`
&showLog=`1`
]]
Ничего не выводит. Притом если указать&where=`{"isAction":"1"}`
то выведет правильный ресурс или оба, если и второму тоже поставить акцию.Лог такой (если не акция):
0.0001621: pdoTools loaded 0.0000410: xPDO query object created 0.0032070: Included list of tvs: <b>actionDate, imageOnMain, isAction, textOnMain</b> 0.0043399: leftJoined <i>modTemplateVarResource</i> as <b>TVactiondate</b> 0.0004411: leftJoined <i>modTemplateVarResource</i> as <b>TVimageonmain</b> 0.0004909: leftJoined <i>modTemplateVarResource</i> as <b>TVisaction</b> 0.0003319: leftJoined <i>modTemplateVarResource</i> as <b>TVtextonmain</b> 0.0005219: Added selection of <b>modResource</b>: <small>SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`</small> 0.0000150: Added selection of <b>modTemplateVarResource</b>: <small>IFNULL(`value`, '') AS `tv.actionDate`</small> 0.0000122: Added selection of <b>modTemplateVarResource</b>: <small>IFNULL(`value`, '') AS `tv.imageOnMain`</small> 0.0000100: Added selection of <b>modTemplateVarResource</b>: <small>IFNULL(`value`, '0') AS `tv.isAction`</small> 0.0000110: Added selection of <b>modTemplateVarResource</b>: <small>IFNULL(`value`, '') AS `tv.textOnMain`</small> 0.0000491: Replaced TV conditions 0.0007021: Processed additional conditions 0.0011911: Added where condition: <b>`TVisaction`.`value`=0, modResource.parent:IN(256,257,258), modResource.published=1, modResource.deleted=0</b> 0.0000350: Replaced TV conditions 0.0001531: Sorted by <b>modResource.publishedon</b>, <b>DESC</b> 0.0000041: Limited to <b>1</b>, offset <b></b> 0.0003650: SQL prepared <small>"SELECT SQL_CALC_FOUND_ROWS `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties`, IFNULL(`TVactiondate`.`value`, '') AS `tv.actionDate`, IFNULL(`TVimageonmain`.`value`, '') AS `tv.imageOnMain`, IFNULL(`TVisaction`.`value`, '0') AS `tv.isAction`, IFNULL(`TVtextonmain`.`value`, '') AS `tv.textOnMain` FROM `modx_site_content` AS `modResource` LEFT JOIN `modx_site_tmplvar_contentvalues` `TVactiondate` ON `TVactiondate`.`contentid` = `modResource`.`id` AND `TVactiondate`.`tmplvarid` = 38 LEFT JOIN `modx_site_tmplvar_contentvalues` `TVimageonmain` ON `TVimageonmain`.`contentid` = `modResource`.`id` AND `TVimageonmain`.`tmplvarid` = 36 LEFT JOIN `modx_site_tmplvar_contentvalues` `TVisaction` ON `TVisaction`.`contentid` = `modResource`.`id` AND `TVisaction`.`tmplvarid` = 40 LEFT JOIN `modx_site_tmplvar_contentvalues` `TVtextonmain` ON `TVtextonmain`.`contentid` = `modResource`.`id` AND `TVtextonmain`.`tmplvarid` = 39 WHERE ( `TVisaction`.`value` = '0' AND `modResource`.`parent` IN (256,257,258) AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 ) ORDER BY modResource.publishedon DESC LIMIT 1 "</small> 0.0005929: SQL executed 0.0000889: Total rows: <b>0</b> 0.0000119: Rows fetched 0.0000219: Prepared and processed TVs 0.0000012: Returning processed chunks 0.0122540: <b>Total time</b> 13 631 488: <b>Memory usage</b>Помогите, пожалуйста, разобраться в чем проблема.
Спасибо!
UPD:как оказалось, не работает значение по умолчанию. Если его не указывать, то
&where=`{"isAction:!=":"1"}`
не отрабатывает (я так понимаю из-за того, что оно вообще не указано в бд…)Кто-то знает, в чем может быть причина?