Урок xPDO. Сниппет вывода родственного ресурса

Есть что-то, может не совсем магическое, но однозначно продуктивное в использовании запросов xPDO внутри MODX вместо использования обычных SQL запросов. Я создал простой сниппет, который извлекает родственного в смысле контента (содержания) ресурса (если таковой существует) и выводит его в виде неупорядоченого списка. Всё создание заняло не более нескольких минут. Данный сниппет может пригодится, когда необходимо вывести схожие товары или новости в вашем сайте.

Перед тем как начать

Вы можете спросить: «Что такое это xPDO?». Если вы еще не писали пользовательский код в MODX Revolution самостоятельно, то я могу себе представить, что данное понятие вам не знакомо. xPDO расшифровуется как "open eXtensions to PDO" – открытые расширения к PDO, и оно было разработано командой разработки ядра MODX для обеспечения ООП подхода к релятивиским базам данных под PDO – главным функциональным блоком PHP > 5.1. В то же время, оно также обеспечивает (но слегка ограниченную) поддержку для версий PHP ниже 5.1. 

В любом случае, не это я хотел объяснить в данной статье. Здесь пойдёт речь о том, как вы можете использовать xPDO внутри MODX для лёгкого создания пользовательского кода, который потом будет легко читаться, который будет быстро выполнятся и может быть легко изменён без траты кучи времени для изучения специального языка программирования – всё сделано на PHP.

getChildren

Я разработал этот сниппет, потому что мне нужен был простой способ вывода неупорядоченого списка наследников текущего ресурса, где использование существующего адонна (такого как getResources или Wayfinder) было бы избыточным. Конечно же, они обое имеют свои преимущества перед описываемым мною методом, но наделённый возможностями в использовании MODX, думаю, что скорее всего данный метод намного быстрее (я не тестировал его – но взгляните на куски кода, которые использует getResources и кусок кода, который использует мой сниппет) и в любом случае я не собираюсь трогать этот сниппет в ближайшем будущем после окончания разработки.

Вот реально используемый мною сниппет:

  // Соберите все наследники текущего ресурса
  $children = $modx->resource->getMany('Children');
  // Проверьте или есть наследники. Если нет - возвращает false
  if (!$children) { return false; }
  // Проверяет установлен ли параметр с чанком шаблона, если нет - возвращает ошибку
  $tpl = $modx->getOption('tpl',$scriptProperties,'');
  if (!$tpl) { return 'No template given.'; }
  
  // Начало вывода
  $o = '<h2>Урок xPDO. Сниппет вывода родственного ресурса</h2><ul>'; 
  // Просмотр результатов...
  foreach ($children as $child) {
    // ... сбор необходимой информации...
    $out = array(
      'id' => $child->get('id'),
      'pagetitle' => $child->get('pagetitle'),
      'menutitle' => $child->get('menutitle'),
      'longtitle' => $child->get('longtitle'));
    // ... и добавление её к выводу в виде плейсхолдеров в чанке
    $o .= $modx->getChunk($tpl,$out);
  }
  // Не забудьте закрыть список
  $o .= '</ul>';

  // Вывод результата
  return $o;

В каждой строчке есть комментарий и тому, что знаком с PHP увидит, что он непосредственно делает. Есть несколько вещей, на которые я хотел бы заострить ваше внимание:

Скрипт начинается с вызова метода $modx->resource->getMany('Children'). Этот метод говорит MODX использовать взять текущий ресурс и базируясь на этом ресурсе, найти его дочерние ресурсы.

На строке 6 показан метод $modx->getOption(..), что считается наилучим способом узнать настройки и свойства в MODX Revolution. Он принимает три параметра:

  • (строка) имя опции (настройка, свойство)  который вы хотите получить. В этом случае я ищу параметр tpl.
  • (массив опций) имя переменной, которую вы хотите от нее получить. В коде сниппетов вы будете использовать $scriptProperties.
  • (строка) значение по умолчанию, если не найденно значение для имени опции. В этом случае я возвращаю пустую строку.

Когда сниппет начинает проходить через каждый найденный дочерний ресурс, он вначале устанавливает масив с разными полями ресурсов, которые я хотел бы иметь доступными в моём чанке шаблонов и взять значение используя метод ->get('fieldname' . Когда все данные будут в массиве $out, сниппет возмёт эти поля и использует $modx->getChunk($chunkname,$placeholders) для заполнения шаблона плейсхолдерами и взамен добавляет этот вывод к переменной $o.

На последнем этапе, он заканчивает внешнюю разметку и возвращает результат вывода в вызов сниппета.

Давайте теперь взглянем на шаблон.

<li><a href="" title=""></a></li>

Чанк очень простой. Он создаёт список элементов, добавляет в якорь (ссылку) тег и использует установленные заполнители. Он также использует синтаксис тегов ссылок для создания ссылки и фильтра вывода по-умолчанию, который устанавливает значение заполнителя (плейсхолдера) в то, что включено в кавычки `` если значение заполнителя пустое. В таком случае, он действует как бекап в случае, если я не заполнил значение «меню» или «длинное название» (longtitle) (подразумевая, что всегда будет «название страницы» - pagetitle).

Всё, что остаётся показать вам этот вызов (допустим вы назвали ваш сниппет getChildren, а ва чанк getChildrenTpl):


Заключение

Не бойтесь создавать собственные сниппеты - xPDO и MODX api делает большинство задач неимоверно лёгкими. Этот сниппет был создан всего за несколько минут, потравив ещё немного времени вы можете легко его улучшить и даже использовать внешний шаблон вместо смешивания PHP и HTML...

Что вы думаете по  поводу пользовательского кодирования при вашей разработке?

Марк Хамстра 18 февраля 2011. Оригинал статьи http://www.markhamstra.nl/modx/general/tips-tricks-tutorials/get-children-snippet-and-learn-xpdo.html