Замена getResources на pdoResources в MODX Revolution
Категория: Разработка сайтов
Вчера решил попробовать заменить на сайте вывода ресурсов с «getResources» на «pdoResources». Результат превзошел все ожидания. Время загрузки кешируемой главной страницы уменьшилось с 1.1 сек до 0.76 сек.
Переход занимает менее 10 минут. Достаточно установить из репозитория пакет pdoTools (про пакет «pdoTools» и остальные его сниппеты я написал отдельную статью — pdoTools в MODX Revoluton — замена стандартных сниппетов) и сделать несколько правок.
Меняем название getResources на pdoResources
Само собой разумеющийся пункт и здесь хотелось бы лишь отметить, что если для вывода ресурсов у вас используется постраничная навигация («getPages»), то это никак не помешает переходу. Точно так же применяйте вместо элемента вывода getResources — pdoResources. Различие в параметрах будет лишь одно. О нем ниже.
Включение 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», а в значениях — чанки, которые будут использованы для вывода, если сравнение будет успешным.
pdoResources как замена getResources / Сниппеты / Modx Revolution / Технический блог веб-разработчика
Ближайший аналог этих сниппетов в Evo — это Ditto. Используются для вывода дочерних ресурсов текущего документа, но можно указать и определённого родителя. Как пример, такое можно встретить в блоге — когда выводятся все записи определённой категории. pdoResources гораздо функциональнее и шустрее getResources, поэтому я его больше рекомендую к использованию. Различия в использовании параметров данных снипетов минимальны, поэтому переход на pdoResources будет безболезненным. Там же, где всё-таки есть небольшие нюансы, об этом будет написано отдельно.
Основные параметры
getResources (значение по умолчанию) | pdoResources (значение по умолчанию) | Применение |
---|---|---|
&parents=`[[*id]]` |
&parents=`[[*id]]` |
Список родителей, из которых будут выводиться дочерние ресурсы (указываются через запятую). Если перед именем ресурса поставить дефис, то такой ресурс будет исключаться из выборки. |
&resources |
&resources | Список ресурсов для вывода. При указании дефиса, ресурс исключается из выборки. |
&depth=`10` |
&depth=`10` | Глубина выборки от родителя. |
&tvFilters |
&tvFilters |
Фильтрация ресурсов по значениям TV. В качестве разделителя AND используется «,» В качестве разделителя OR используется «||» Примеры вызова: Фильтрация для поиска использует оператор 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` ]]
pdoResources/Snippets/pdoTools/docs.
modx.proФрагмент для отображения списка ресурсов. Это расширенная замена getResources: имеет все функции, но без недостатков.
Умеет правильно отсортировать настройки телевизора, прикрепить таблицу с образцом, включить или исключить категории из разных контекстов и многое другое.
Свойства
Свойства выбора ресурсов
Эти свойства определяют, какие ресурсы будут отображаться в сгенерированном списке.
Имя | По умолчанию | Описание |
---|---|---|
&родители | Текущий ресурс | Список родителей, разделенных запятыми, для поиска результатов. Установите на 0 для неограниченного, на +0 для верхнего уровня. Если родительский идентификатор начинается с тире, он и его дочерние элементы исключаются из запроса. |
&глубина | 10 | Глубина поиска дочерних ресурсов от родительского в дереве ресурсов. |
&ресурсы | Разделенный запятыми список ресурсов для добавления к результатам. Если идентификатор ресурса начинается с дефиса, этот ресурс исключается из запроса. | |
&контекст | Ограничить ресурсы из данного контекста. | |
&где | Массив дополнительных параметров выбора в формате JSON. | |
Показать Скрытый | 1 | Показать ресурсы, скрытые в меню. |
&showUnpublished | 0 | Показать неопубликованные ресурсы. |
&showDeleted | 0 | Показать ресурсы, помеченные как удаленные. |
&hideContainers | 0 | Исключить ресурсы контейнера, то есть ресурсы с «isfolder = 1». |
&выбрать | 0 | Список полей, разделенных запятыми, которые необходимо получить. Вы можете указать массив строк JSON, например, {«modResource»:»id,pagetitle,content»} . |
&сортировать по | заголовок страницы | Любое поле ресурса для сортировки, включая TV, если также установлено свойство &includeTVs . Вы можете указать строку JSON с массивом из нескольких полей, например {«tvname»:»ASC», «pagetitle»:»DESC»} . Для случайной сортировки используйте «RAND()». |
&сортировка | DESC | Направление сортировки: по возрастанию или по убыванию. |
&предел | 10 | Ограничить количество результатов. Вы можете использовать «0» без ограничений. |
&смещение | 0 | Количество элементов для пропуска с самого начала. |
&первый | 1 | Номер первого элемента результатов вывода. |
и последний | Автоматический, по формуле (всего + первый — 1) | Номер последнего элемента результатов. |
&LoadModels | Разделенный запятыми список компонентов, модель которых необходимо загрузить для построения запроса. Пример: &loadModels=`ms2gallery,msearch3` . | |
&TVФильтры | Список фильтров на ТВ, разделенных И и ИЛИ. Указанный разделителем параметр &tvFiltersOrDelimiter представляет логическое условие ИЛИ на нем и условия, сгруппированные в первую очередь. Внутри каждой группы можно указать список значений, разделенных &tvFiltersAndDelimiter . Поиск значений может производиться в любом конкретном ТВ, если указано «myTV == значение», или в любом «значении». Пример вызова: &tvFilters=`filter2==one,filter1==bar%||filter1==foo` . Обратите внимание: в фильтре используется оператор LIKE, а символ «%» является метасимволом. Это будет искать значения для ресурсов, которые находятся в таблице site_tmplvar_contentvalues, а не из настроек телевизора по умолчанию. | |
&tvФильтры и разделитель | «,» | Разделитель условного И свойства &tvFilters . |
&tvFiltersOrDelimiter | «||» | Разделитель для свойства условного ИЛИ &tvFilters . |
Свойства шаблона
Эти свойства определяют фрагменты, содержащие шаблоны для форматирования генерируемого вывода.
Имя | Описание |
---|---|
&returnIds | Установите значение «1», чтобы вместо полных результатов возвращалась строка со списком идентификаторов ресурсов. Все шаблоны игнорируются. |
&tpl | Чанк имени для форматирования отдельных элементов. Если не указано, содержимое полей ресурса будет напечатано на экране. |
&tplFirst | Имя чанка для форматирования первого элемента в результатах. |
&tplLast | Имя чанка для форматирования последнего элемента в результатах. |
&tplOdd | Имя чанка для форматирования каждого нечетного элемента в результатах. |
&tplWrapper | Чанк — обертка, чтобы обернуть все результаты. Принимает один заполнитель: [[+output]] . Он не работает в сочетании с &toSeparatePlaceholders . |
&wrapIfEmpty | Включает внешнюю оболочку чанка *&tplWrapper**, даже если нет результатов. |
&tplCondition | Определяет поле ресурса для оценки по ключам, определенным в свойстве &conditionalTpls . |
&tplОператор | Необязательный оператор для сравнения поля ресурса &tplCondition с массивом значений и в чанках &conditionalTpls . |
&условныйTpls | Объект JSON, определяющий карту значений полей и связанных фрагментов tpl для использования, когда поле, определенное &tplCondition соответствует значению. Оператор сравнения указан в &tplOperator . Для операторов типа isempty нельзя использовать массив ключей. |
&выходной разделитель | Необязательная строка для разделения результатов. |
Свойства результата
Эти свойства дополнительно определяют, какие данные извлекать и как их отображать.
Имя | По умолчанию | Описание |
---|---|---|
&fastMode | 0 | Быстрый режим обработки чанков. Все необработанные теги (модификаторы вывода, фрагменты и т. д.) удаляются. |
&idx | Начальное количество итераций вывода. | |
&setTotal | 0 | Указывает, следует ли заполнять общий заполнитель числом результатов. |
&общая переменная | всего | Имя заполнителя для хранения общего количества результатов. |
&includeContent | 0 | Указывает, должно ли возвращаться в результатах поле «content» каждого ресурса. |
&включая телевизоры | Разделенный запятыми список значений переменных шаблона, которые должны быть включены в заполнители, доступные для каждого шаблона ресурса. Пример: «действие, время» даст заполнители [[+tv.action]] и [[+tv.time]] . | |
&Подготовка телевизоров | «1», подготавливает все телевизоры, указанные в &includeTVs | Разделенный запятыми список значений TV, зависящих от медиа-источника, которые должны быть подготовлены перед выводом. |
&processTV | Разделенный запятыми список TV, которые должны быть обработаны в соответствии с их параметрами вывода. Если установлено значение «1», все телевизоры, перечисленные в списке &includeTVs будет обработан. | |
&tvPrefix | тв. | Префикс ТВ свойство. |
&схема | -1 | Тип схемы URL, передаваемой в modX::makeUrl(). См. здесь список допустимых опций. |
&useWeblinkUrl | 0 | Создать ссылку на ресурс веб-ссылки, а не на целевой URL. ПРИМЕЧАНИЕ: Чтобы это работало должным образом, обязательно используйте [[+ссылка]] вместо [[~[[+id]]]] например. [[+pagetitle]] . |
&toPlaceholder | Сохранение вывода в заполнителе с этим именем вместо вывода вывода на экран. | |
&toSeparate Placeholders | Каждый элемент будет отображаться в заполнителе с именем, начинающимся с этого значения и заканчивающимся порядковым номером, начиная с нуля. Например, указав значение свойства «myPl», вы получите 9 заполнителей.0299 [[+myPl0]] , [[+myPl1]] и т. д. | |
&showLog | 0 | Показывать дополнительную отладочную информацию об обработке фрагмента только вошедшим в систему пользователям Manager. |
Примеры
Простой список дочерних элементов ресурса №1:
[[pdoResources? &родители=`1` &глубина=`0` &tpl=`ListRowTpl` ]]
Чтобы добавить телевизор с именем «изображение», тогда вызов будет следующим:
[[pdoResources? &родители=`1` &глубина=`0` &tpl=`ListRowTpl` &includeTVs=`изображение` ]]
Чанк ListRowTpl теперь позволяет использовать заполнитель [[+tv. image]]
.
pdoResources и проверка общей стоимости — Extras
Код должен показывать другой арт от художника. Это в шаблоне Art.
У меня есть:
[[!pdoResources? &родители=`6` &showLog=`0` &глубина=`1` &sortby=`{"artid":"ASC"}` &includeTVs=`ArtistsID,ArtTitle,artid` &where=`{ "ArtistsID:=" : "[[*ArtistsID]]", "AND:artid:!=" : "[[*artid]]" }` &returnIds=`0` &toPlaceholder=`Больше списков` &setTotal=`1` &tpl=`Артлистинг` ]]Всего: [[+всего]]
[[+total:greaterthan=`0`:then=`ПОКАЖИТЕ МЕНЯ`:else=`СКРЫТЬ МЕНЯ`]]
[[+MoreListings]]
Где связывает художников и искусство вместе, а вторая часть исключает текущую страницу, на которой мы находимся, из списка. Это отображается в MoreListings и отлично работает.
Итого, я получаю 1 и HIDE ME
Журналы:
0.0000751: загружен pdoTools 0.0000210: создан объект запроса xPDO 0.0006931: Включенный список телевизоров: **artid, ArtistsID, ArtTitle** 0. 0001431: левое соединение * modTemplateVarResource* as **TVartid** 0.0000870: leftJoined *modTemplateVarResource* as **TVartistsid** 0.0000830: leftJoined *modTemplateVarResource* as **TVarttitle** 0.0001402: Добавлен выбор **modResource** : SQL_CALC_FOUND_ROWS
id ,
type ,
contentType ,
pagetitle ,
longtitle ,
description ,
alias ,
alias_visible ,
link_attributes ,
опубликовано ,
pub_date ,
unpub_date ,
родитель ,
isfolder ,
интротекст ,
форматированный текст ,
шаблон ,
индекс меню ,
с возможностью поиска ,
с возможностью кэширования ,
создано ,
создано на ,
отредактировано ,
отредактировано на ,
удалено ,
удалено на ,
удалено на ,
опубликовано на , 9 0300 опубликовано
,
menutitle ,
donthit ,
privateweb ,
privatemgr ,
content_dispo ,
hidemenu ,
class_key ,
context_key ,
content_type ,
uri ,
uri_override ,
hide_children_in_tree ,
show_in_tree ,
properties 0. 0000069: Добавлен выбор **modTemplateVarResource**: IFNULL(
value , '') AS
tv.artid 0.0000050: Добавлен выбор of **modTemplateVarResource**: IFNULL(
value , '') AS
tv.ArtistsID 0.0000041: Добавлен выбор **modTemplateVarResource**: IFNULL(
value , ' ') AS
tv.ArtTitle 0,0000260: Заменены условия ТВ 0,0004599: Обработаны дополнительные условия 0.0006661: Добавлено где условие: **
TVartistsid .
значение :== 4, И:
TVartid .
значение :!==A23, modResource.parent:IN(6,7,8,9), modResource.published=1, modResource.deleted=0** 0,0000100: Заменены условия ТВ 0,0000720: Отсортировано по **
TVartid .
значение **, **ASC** 0,0000019: ограничено **10**, смещение **0** 0,0003080: SQL подготовлен "SELECT SQL_CALC_FOUND_ROWS
modResource .
идентификатор ,
modResource .
введите ,
modResource .
contentType ,
modResource .
pagetitle ,
modResource .
длинное название ,
modResource .
описание ,
modResource .
псевдоним ,
modResource .
alias_visible ,
modResource .
link_attributes ,
modResource .
опубликовано ,
modResource .
pub_date ,
modResource .
unpub_date ,
modResource .
родитель ,
modResource .
isfolder ,
modResource .
интротекст ,
modResource .
форматированный текст ,
modResource .
шаблон ,
modResource .
menuindex ,
modResource .
с возможностью поиска ,
modResource .
кэшируемый ,
modResource .
создано ,
modResource .
создано на ,
modResource .
под редакцией ,
modResource .
отредактировано на ,
modResource .
удалено ,
modResource .
удалено на ,
modResource .
удалено ,
modResource .
опубликовано на ,
modResource .
опубликовано ,
modResource .
menutitle ,
modResource .
не ,
modResource .
privateweb ,
modResource .
privatemgr ,
modResource .
content_dispo ,
modResource .
скрытое меню ,
modResource .
class_key ,
modResource .
context_key ,
modResource .
content_type ,
modResource .
uri ,
modResource .
uri_override ,
modResource .
hide_children_in_tree ,
modResource .
show_in_tree ,
modResource .
свойства , IFNULL(
TVartid .
значение , '') AS
tv.artid , IFNULL(
TVartistsid .
значение , '') AS 90 300 tv.ArtistsID
, IFNULL(
TVarttitle .
value , '') AS
tv.ArtTitle FROM
modx_site_content AS
modResource LEFT JOIN
modx_site_tmplvar_contentvalues
TVartid ON
TVartid .
contentid =
modResource .
id И
TVartid .
tmplvarid = 11 ЛЕВОЕ СОЕДИНЕНИЕ
modx_site_tmplvar_contentvalues
TVartistsid ON
TVartistsid .