Сниппет pdoResources – самый гибкий, мощный и универсальный инструмент из набора pdoTools.
Создан, как замена getResources, но имеет важные отличия - работает быстрее, лишен его недостатков и оснащен таким набором дополнительных параметров, который практически не ограничивает возможности выборки ресурсов разных классов из базы данных по любым полям и TV.
Официальное описание находится здесь. В рамках данной заметки мы рассмотрим несколько примеров его использования.
Отладочная информация
Для начала - упомянем параметр showLog, который может оказаться весьма полезным при отладке вызова сниппета, когда что-то выводится не так, как задумывалось. Вызов сниппета стандартный для MODX Revo:
[[!pdoResources?
&showLog = `1`]]
Результат выводится в виде вот такого окошка (пример относится к ресурсу с дополнительными полями TV):
Поскольку базовые функции работы с базой данных используются в любом случае, хоть в PDO, хоть в xPDO, сниппет преобразует наши заданные параметры, в конечном счете, к строке запроса SQL.
Здесь мы видим, в общих чертах:- Присоединение таблицы TV (leftJoin)
- Описание SELECT (перечень полей для выборки из основной таблицы ресурса (документа) и таблицы переменных)
- Описание WHERE (самое интересное - условия для выборки)
- Результат выборки - количество найденных записей Total rows
- Название чанка для обработки вывода информации.
Слева указана хронология выполнения запроса.
Также, если какие-то данные выводятся не так, как нужно, либо вообще не выводятся, можно просмотреть отобранные данные в виде массива, задав пустым параметр tpl – &tpl = ``
.
Если необходимо выбрать большое количество данных, со сложными условиями отбора, в период отладки нужно просматривать отладочную информацию, чтобы убедиться, что заданные вами условия правильно разбираются парсером.
Также, в таких случаях, лучше отбирать минимально необходимое число полей, используя параметр select, что позволяет увеличить скорость работы сайта.
Пример использования
Довольно часто возникает задача выборки ресурсов в сниппете без вывода на экран, например, с сохранением списка ID документов в переменную. MODX предоставляет несколько способов решения такой задачи. Обычный способ - через метод getCollection. Ссылки мы приводить не будем, поиск по данному слову выдаст все необходимое.
Все усложняется, когда нужен отбор по дополнительным полям (TV), особенно по нескольким.
В этом случае также можно использовать возможности pdoResources.
Задействуем параметры returnIds и toPlaceholder. Первый задает выдачу строковой переменной со списком ID документов, разделенных запятыми, второй, помещает эту строку в плейсхолдер с заданным названием. Пример вызова:
<\?php
//задаем условия выборки по TV параметрам
$str=array(
'age' => 2,
'month' => 1,
'vidZ' => 3
);
$where = $modx->toJSON($str);
$modx->runSnippet('pdoResources', array(
'select' => 'id',
'returnIds' => 1,
'includeTVs' => 'vidZ,age,month',
'where' => $where,
'toPlaceholder' => 'idis',
));
$output = $modx->getPlaceholder('idis');
return $output;
Этот сниппет - простейший пример использования выборки по трем TV параметрам, когда мы ищем документы, у которых И параметр age = 2 И month = 1 И vidZ = 3.
Задаем WHERE посложнее:
$str=array(
'age:IN' => array (2,3,5), //совпадение с одним из нескольких значений
'AND:month:>' => 1,
'AND:vidZ:=' => 3 //использование логических операторов и операторов сравнения
);
Что нам дает такая конструкция? Прямо прописываем только условие WHERE.
Присоединение таблицы переменных и выборку нужных полей берет на себя pdoResources.
Вызов в Fenom
В шаблонизаторе Fenom для выборки документов и тикетов можно, как использовать вызов pdoResources:
{'pdoResources' | snippet : [
'select' => 'id',
'returnIds' => 1,
'parents' => 2,
'limit' => 10
]}
либо через специальный вызов (выведем те же id документов в строку через запятые:
{var $resources = $_modx->getResources(
['parent' => 2, 'published' => 1],
['select' => 'id', 'limit' => 10, 'showHidden' => 1])}
{foreach $resources as $resource}
{$resource['id']},
{/foreach}
Несколько пояснений:
- getResources не имеет отношения к одноимённому сниппету, это один из методов класса microMODX
- первый передаваемый аргумент
['parent' => 2, 'published' => 1]
– это прямое указание where. Буквально эта запись указывает: выбор записей где И значение поля parent равно 2, И значение поля published равно 1 (опубликованный ресурс с id родителя 2) - второй аргумент – массив из обычных параметров сниппета pdoResources.
Ещё по теме: Полный перечень тегов Fenom
Пример выборки из таблицы Gallery
Еще одна функция, которая может оказаться полезной – выборка полей из любой таблицы базы данных MODX. У всех сниппетов pdoTools есть общий набор параметров.
Один из них – параметр &class
. Пример выборки всех активных файлов из галереи Gallery:
[[pdoResources?
&class=`galItem`
&sortby=`id`
&showLog=`0`
&tpl=`tpl.Img`
&select=`name,filename,description`
&where=`{"active:=":"1"}`]]
Чанк tpl.Img
:
<div class="gallery-item">
<a title="[[+name]][[+description:isnotempty=`: [[+description]]`]]" href="[[++gallery.files_url]][[+filename]]">
<img alt="[[+name]]" src="[[pthumb? &input=`[[++gallery.files_url]][[+filename]]` &options=`&w=290&h=217&zc=1`]]">
</a>
</div>
Конечно, компонент Gallery снабжён своими сниппетами: Gallery, GalleryAlbums и GalleryItem, но тут уже дело личное, разбираться с параметрами этих сниппетов, или делать запрос одним универсальным инструментом.
Классы и поля объектов можно узнать из файла с расширением mysql.schema.xml
, расположенного в папке core/components/...название компонента.../model/schema/
, а уточнить, что там содержится, через PhpMyAdmin.