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 поля, не документа

Получение значения поля с помощью getObject:

/* Получаем 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 самостоятельно. Также при изменении или создании объектов, стоит убедиться, что используемые переменные правильного типа (того же типа, что и поле устанавливаемое поле). 

Работа с родительскими и дочерними элементами

Для получения всех потомков каталога можно использовать метод getChildIds:

// Синтаксис
$childs = $modx->getChildIds(id родителя, глубина, указание контекста); 

// Сокращенный пример
$childs = $modx->getChildIds(4);

// Полный пример 
$childs = $modx->getChildIds(4,1,array('context' => 'web'));

При использовании метода getChildIds в панели менеджера необходимо обязательно определить контекст с помощью третьего параметра, так как по умолчанию он будет соответствовать текущему контексту, соответственно контексту mgr.

Глубина по умолчанию = 10.

Простейший сниппет getChildren для получения id потомков:

$parent = $modx->getOption('parent',$scriptProperties);
$where = array(
    'published' => 1
);
$ids = $modx->getChildIds($parent,1, $where);
$ids = implode(',', $ids);
return $ids;

Вывод:

{'getChildren' | snippet : ['parent' => 4]}

Для получения родителей ресурса можно использовать метод getParentIds:

// Синтаксис
$parents = $modx->getParentIds(id документа, уровень вложенности, указание контекста);

// Сокращенный пример
$parents = $modx->getParentIds(23);

// Полный пример 
$childs = $modx->getChildIds(23,10,array('context' => 'web'));

При использовании метода getParentIds в панели менеджера необходимо обязательно определить контекст с помощью третьего параметра, так как по умолчанию он будет соответствовать текущему контексту, соответственно контексту mgr.

Уровень вложенности по умолчанию = 10.

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

Получение 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);
?

Благодарю за ответ!

Была ли эта информация полезной?

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

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

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