MODX. Объекты xPDO и часто используемые конструкции

xPDO — технология лежащая в основе API MODX. Подробнее о различиях PDO и xPDO можно узнать в статье «xPDO, сравнение с PDO и PHP»

Официальный справочник API MODX

Объекты xPDO и часто используемые конструкции

Текущий ресурс / пользователь

$currentResource = $modx->resource;
$currentUser = $modx->user; 

Если пользователь не авторизован, он будет обозначен как “anonymous”.

Поля ресурсов доступны при помощи методов get() или getContent()

$UserID = $modx->user->get('id');
$intro = $modx->resource->get('introtext');
$content = $modx->resource->getContent();

В тексте полученном с помощью get('content') или getContent() теги или любой другой код обработан не будет. 

Текущий ресурс всегда доступен как $modx->resource, но не стоит это использовать для модификации, т.к. это лишь его копия.

Поиск объектов

В MODX Revo все объекты можно получить с помощью метода $modx->getObject()

/* Получение объекта по имени */
$object = $modx->getObject('objectClassName',array('name' => 'objectName' ));

/* По ID номеру */
$object = $modx->getObject('objectClassName',$objectId);

/* Получение чанка */
$chunk = $modx->getObject('modChunk',array('name' => 'chunkName' ));

/* Получение чанка по ID */
$chunk = $modx->getObject('modChunk',$chunkId);

Первый параметр objectClassName — название класса. Список классов:

  • modResource — обращение к ресурсу (также с его помощью можно получить отдельные ресурсы, такие как: документ, ссылки и статичные ресурсы);
  • modChunk
  • modSnippet
  • modPlugin
  • modTemplate
  • modTemplateVar
  • modCategory
  • modDocument 
  • modWeblink 
  • modSymlink
  • modStaticResource 

Второй параметр — идентификатор объекта, или заданный критерий.

Получить один объект с заданными параметрами можно так 

$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Хитрый заголовок'
));

Обратите внимание, что для получения названия ресурса используется pagetitle, а для получения названия чанка или сниппета — name.

Удобочитаемая запись того же действия

$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Хитрый заголовок'
)
$document = $modx->getObject($name,$criteria)

 

Для получения списка объектов используется метод getCollection() 

$docArray = $modx->getCollection('modResource',array(
    'published' => 1,
    'searchable' => 1
));

getCollection() возвращает не PHP массив, а массив объектов, чтобы получить PHP массив, надо воспользоваться методом toArray() 

$phpArray = $object->toArray();

Также можно использовать метод объекта get(), чтобы получить отдельное поле

$resource->get('pagetitle');

Так же как и с getObject() можно использовать запросы в критериях методов getCollection() и getMany()

$tvCollection = $modx->getCollection('modTemplateVar', 
"`name` IN ('" . implode("','", array('footer', 'header')) . "')");

Для получения родственных объектов связанных с одним конкретным объектом можно использовать метод getMany() 

$tvs = $template->resource->getMany('TemplateVars');

Также, можно получить потомков 

$children = $resource->getMany('Children');

getObject() и getOne() вернут null если запрошенный объект не будет найден, а getMany() и getCollection() вернут пустой массив. 

Получение полей объекта

После получения ресурса можно извлечь одно из его полей, используя имя поля

$resource = $modx->getObject('modResource',12);
$longTitle = $resource->get('longtitle');

Если надо вывести поле, можно воспользоваться следующим фрагментом кода

return $resource->get('pagetitle');

Получение системных настроек

$setting = $modx->getOption('site_start');

Загрузка экземпляра класса

$modx->getService('error', 'error.modError');

Использование $object->getOne() и $object->getMany() 

Объекты связанные со структурой MODX можно вывести используя методы getOne() и getMany(). В то время как функция get() будет извлекать определенное поле объекта, функция getOne() вернет весь объект. getMany(), соответственно, вернет массив объектов.

Получение родительского ресурса как объекта

$parentResource = $resource->getOne('Parent');

Получение полей объекта User, вывод значений профиля пользователя

Для получения объекта «user» используется та же конструкция

$user = $resource->getOne('CreatedBy');

или, для текущего ресурса 

$user = $modx->resource->getOne('CreatedBy');

Объект «user» содержит только поля ID, Имя и хеш пароля. Для получения остальных полей, надо извлечь объект modUserProfile связанный с этим пользователем

$user->getOne('Profile');

После получения профиля, можно использовать его с помощью метода get() для получения любого поля ресурса 

$profile->get('fullname');

Переменные шаблона (Template Variables, TV)

Получить значение TV поля текущего ресурса можно с помощью метода getTVValue() 

$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID TV поля, не документа

или так 

$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID TV поля, не документа

Получить значение TV поля другого ресурса — чуть сложнее, поскольку его обработанное значение может отличаться в каждом ресурсе. В итоге, сначала надо получить объект ресурса, а затем использовать его ID. ID именно ресурса, не TV

/* Получаем TV */
$tv = $modx->getObject('modTemplateVar',array('name'=>'MyTV'));

/* Получаем строку содержимого TV */
$rawValue = $tv->getValue($id);

/* Получаем обработку содержимого TV */
$processedValue = $tv->renderOutput($id);

Использование toArray() с getChunk()

В MODX легко разделять отображаемую информацию. Один из наиболее простых способов — создать плейсхолдер в чанке, а затем отправить его, вызовом getChunk().

Метод toArray() работает с любыми объектами MODX, но чаще всего используется с ресурсами и пользователями. Он создаёт ассоциативный PHP массив из полей объекта. В последствии, этот массив может быть использован как второй аргумент для $modx->getChunk(), для замены любых плейсхолдеров в чанке на соответствующие значения

$resource = $modx->getObject('modResource',array('pagetitle'=>'MyDocument'));
$fields = $resource->toArray();
return $modx->getChunk('ShowResource',$fields);

В последней строчке мы вызываем чанк с шаблоном 

<div class="ShowResource">
    <p>Заголовок страницы: [[+pagetitle]]</p>
    <p>Длинный заголовок: [[+longtitle]]</p>
    <p>Псевдоним: [[+alias]]</p>
    <p>Аннотация: [[+introtext]]</p>
</div>

Вывод снипета [[ShowFields]] отобразит данный чанк на странице, подставив нужные аргументы.

Сокращенная запись снипета [[ShowFields]]

$resource = $modx->getObject('modResource',array('pagetitle'=>'MyDocument'));
return $modx->getChunk('ShowResource',$resource->toArray());

Если нужно вывести поля текущего ресурса, запись может быть еще компактнее

return $modx->getChunk('ShowResource',$modx->resource->toArray());

Наборы параметров

Наборы параметров — это MODX объекты, которые содержат ассоциативный массив ключей и значений (схожих с Системными настройками). Они могут быть прикреплены к любому элементу с одноименной вкладки (чанку, сниппету, шаблону, плагину). Прикрепление параметра делает его доступным для элемента, но для использования параметра надо использовать специальный тег, примерно так

[[SnippetName@PropertySetName]]
[[$ChunkName@PropertySetName]]

Если «набор параметров» прикреплен к сниппету, он будет перезаписывать установленные по умолчанию параметры сниппета. 

Если «набор параметров» прикреплен к чанку или оставшимся элементам, значения из «набора» будет перезаписывать в элементе плейсхолдер соответствующий ключу. 

Получение обработанного значения объекта

В некоторых случаях может понадобиться вывод уже обработанного значения какого-либо элемента. В этом случае могут помочь функции runSnippet() и getChunk(). 

/* $props – массив, который содержит параметры сниппета */
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

Если выполнить сниппет с помощью runSnippet('SnippetName'), то будут использованы параметры по-умолчанию. 

Если выполнить сниппет используя runSnippet('SnippetName',$properties), будут доступны оба набора параметров.

В случае обработки чанка методом getChunk() набор параметров может иметь одинаковые ключи, и нужный параметр надо указывать используя имя

$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';

$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));

$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));

return($modx->GetChunk($chunkName, $propSet->getProperties() ));

Следует понимать разницу между «Наборами параметров» и параметрами по умолчанию. Параметры по умолчанию, технически, не является «Набором параметров». Параметры по умолчанию равнозначны свойствам «Набора параметров». Метод getProperties() получит свойства каждого

/* получаем значение по умолчанию установленные в снипете или другом элементе */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();

/* получаем свойства конкретного набора параметров */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

Когда чанк получают с помощью метода getChunk() параметры по-умолчанию доступны для плейсхолдеров в чанке, для их перезаписи в вызове getChunk('ChunkName', $properties) надо отправить любой параметр с таким же именем.

Схожий процесс необходим, если вы хотите послать набор параметров установленный в вызове для runSnippet(). Свойства в «Наборе параметров» будут доступны в сниппете, если они введены как параметры при вызове сниппета. Для перезаписи параметров по-умолчанию надо снова, послать нужные значения с похожим именем.

Для других элементов, после того, как вы получили элемент с помощью $modx->getObject(), можно получить обработанный вывод используя $element->process(). Это работает и для чанков и сниппетов (на самом деле, оба метода вызывают process(). 

$element->process($properties) также доступен и параметры по-умолчанию перезаписываются заданными при вызове.

Посылать параметры по-умолчанию в вызовах getChunk(), runSnippet() или process() не имеет смысла, т.к. они используются автоматически.

Если нужен именно «Набор параметров», то следует при вызове уточнять какой, поскольку элементы могут иметь множество «Наборов».

Метод process() работает и для ресурсов. После получения объекта ресурса через $modx->getObject(), вывод обработанного контента можно организовать через $resource->process(), но будьте осторожны, не пишите вызов текущего ресурса в сниппете содержащемся в текущем ресурсе, с целью избегания цикла.

Модификация объектов

После получения ссылки на объект с помощью $modx->getObject(), можно менять значение его полей 

$object->set('FieldName', 'Value');
$object->save();

Для изменения или создания основного поля с содержимым ресурса или элемента (например, поле «контента» ресурсов, контент чанков, код сниппетов), лучше использовать setContent() 

$object->setContent('Value');
$object->save();

Следует отметить, что ссылка на текущий загруженный ресурс доступна через $modx->resource, но не стоит это использовать для изменения ресурса, т.к. это лишь копия ресурса. Всегда получайте ссылку через $modx->getObject() перед попыткой изменения объекта.

Создание новых объектов

$object = $modx->newObject('modChunk');
$object->set('name', 'ChunkName');
$object->setContent('Это будет содержимое нового чанка.');
$object->set('description', 'Я создал этот чанк через сниппет);
$object->set('category', 'MyChunks');
$object->save(); 

Каждый описанный здесь объект имеет ID и может быть найден по нему, но никогда не стоит устанавливать set() ID самостоятельно. Также при изменении или создании объектов, стоит убедиться, что используемые переменные правильного типа (того же типа, что и поле устанавливаемое поле). 

Еще немного примеров

Получение pagetitle главной страницы

$res = $modx->getObject('modResource',1);
$output = $res->get('pagetitle');
print $output;

Получение детей документа, отсортированных по полю Title

$criteria = $modx->newQuery('modResource');
$criteria->where(array(
   'parent' => $modx->resource->get('id'),
));
$criteria->sortby('pagetitle','ASC');
$children = $modx->resource->getMany('Children',$criteria);

Константы MODx Revolution

Наиболее используемые константы предусмотренные API MODX.

MODX_BASE_URL относительный путь к корню сайта /
MODX_URL_SCHEME протокол сайта http:// или https://
MODX_HTTP_HOST адрес сайта site.ru
MODX_CORE_PATH абсолютный путь к ядру сайта /home/www/core
MODX_ASSETS_PATH абсолютный путь к ресурсам /home/www/assets/
MODX_PROCESSORS_PATH абсолютный путь к процессорам /home/www/core/model/modx/processors/
MODX_CONNECTORS_PATH абсолютный путь к коннекторам /home/www/connectors/
MODX_MANAGER_PATH абсолютный путь к админ части /home/www/manager
MODX_BASE_PATH абсолютный путь к корню сайта /home/www/
MODX_ASSETS_URL относительный путь к ресурсам /assets/
MODX_MANAGER_URL относительный путь к админ части /manager/
MODX_CONNECTORS_URL относительный путь к коннекторам /connectors/
MODX_API_MODE подключение API MODX  

 

?
Была ли статья полезной?

Здравствуйте!

Позвольте представиться, меня зовут Марина. Более 10 лет я занимаюсь обслуживанием сайтов и развитием интернет проектов. Если вы хотите избавиться от хлопот связанных с созданием и поддержкой сайта, тогда вы попали по адресу. При работе с сайтами я предоставляю качественные услуги, ориентируясь на ваши индивидуальные потребности. Для связи со мной воспользуйтесь формой обратной связи.

Инсталента
Пожалуйста, активируйте JavaScript.
Please enable JavaScript.
return; 1