pdoResources

Сниппет pdoResources – самый гибкий, мощный и универсальный инструмент из набора pdoTools.

Создан, как замена getResources, но имеет важные отличия - работает быстрее, лишен его недостатков и оснащен таким набором дополнительных параметров, который практически не ограничивает возможности выборки ресурсов разных классов из базы данных по любым полям и TV.

Официальное описание находится здесь. В рамках данной заметки мы рассмотрим несколько примеров его использования.

Отладочная информация

Для начала - упомянем параметр showLog, который может оказаться весьма полезным при отладке вызова сниппета, когда что-то выводится не так, как задумывалось. Вызов сниппета стандартный для MODX Revo:

[[!pdoResources?  
   &showLog = `1`]]

Результат выводится в виде вот такого окошка (пример относится к ресурсу с дополнительными полями TV):

pdoResources

Поскольку базовые функции работы с базой данных используются в любом случае, хоть в PDO, хоть в xPDO, сниппет преобразует наши заданные параметры, в конечном счете, к строке запроса SQL.

Здесь мы видим, в общих чертах:
  • Присоединение таблицы TV (leftJoin)
  • Описание SELECT (перечень полей для выборки из основной таблицы ресурса (документа) и таблицы переменных)
  • Описание WHERE (самое интересное - условия для выборки)
  • Результат выборки - количество найденных записей Total rows
  • Название чанка для обработки вывода информации.

Слева указана хронология выполнения запроса.

Если необходимо выбрать большое количество данных, со сложными условиями отбора, в период отладки нужно просматривать отладочную информацию, чтобы убедиться, что заданные вами условия правильно разбираются парсером.

Также, в таких случаях, лучше отбирать минимально необходимое число полей, используя параметр 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, но тут уже дело личное, разбираться с параметрами этих сниппетов, или делать запрос одним универсальным инструментом.

поля таблицы компонента Gallery

Классы и поля объектов можно узнать из файла с расширением mysql.schema.xml, расположенного в папке core/components/...название компонента.../model/schema/, а уточнить, что там содержится, через PhpMyAdmin.

Привилегия.ру

Метки: modx revolution