Замена 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 |
Ограничение выборки по тем или иным параметрам. |
|
&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. |
|
&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. id
0001431: левое соединение * modTemplateVarResource* as **TVartid** 0.0000870: leftJoined *modTemplateVarResource* as **TVartistsid** 0.0000830: leftJoined *modTemplateVarResource* as **TVarttitle** 0.0001402: Добавлен выбор **modResource** : SQL_CALC_FOUND_ROWS , 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. value
0000069: Добавлен выбор **modTemplateVarResource**: IFNULL( , '') 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 .

Например: pagetitle или alias.
Представляет собой строку, закодированную в JSON.
`
Оператор сравнения можно дополнительно указать в параметре tplOperator.

Вы можете указать массив строк JSON, например, {«modResource»:»id,pagetitle,content»} .
Это будет искать значения для ресурсов, которые находятся в таблице site_tmplvar_contentvalues, а не из настроек телевизора по умолчанию.
Если не указано, содержимое полей ресурса будет напечатано на экране.
Все необработанные теги (модификаторы вывода, фрагменты и т. д.) удаляются.
