pdoResources

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

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

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

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

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

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

pdoResources

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

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

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

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

Еще одна функция, которая может оказаться полезной – выборка полей из любой таблицы базы данных 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