Объектная модель MODx Revo API. Статья для понимания.

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria)

Примечание: распространенной ошибкой при получении ресурса является использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют полей 'name' или 'title', хотя надпись на панели pagetitle создание/редактирование ресурсов гласит 'title'.

Вы также можете найти ресурс, указав свой id, alias, menu title, и/или любой из областей, перечисленных в таблице ниже. Если вы хотите массив документов, отвечающих вашим критериям, вы можете использовать getCollection() вместо getObject():

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

Помните, что getCollection() не возвращает массив PHP. Она возвращает массив объектов. Если вы хотите объекты полей получить в виде массива PHP, вы можете использовать метод объекта toArray():

1
$phpArray = $object->toArray();

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

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

Как мы видели с getObject(), вы также можете использовать запрос качестве критерия или getCollection() или getMany():

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

Обратите внимание, что вы должны использовать поля, показанные в таблице с getObject(). Например, вы могли бы использовать 'pagetitle', чтобы найти документ, а 'name', чтобы найти сниппет или чанк.

Если вы хотите получить несколько соответствующих объектов, связанных с одним объектом, вы можете использовать метод объекта getMany(). Предполагая, что вы использовали getObject(), чтобы получить ссылку на ресурс или шаблона, вы можете получить связанные с ними TV как показано здесь:

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

Кроме этого, вы можете получить дочерние ресурсы, вот так:

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

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

Все отдельные ресурсы (документ, гиперссылки, символические ссылки и статические ресурсы) могут быть получены с помощью:

1
$modx->getObject('modResource',$criteria);

но вы также можете искать их по отдельности:

1
2
3
4
$modx->getObject('modDocument',$criteria);
$modx->getObject('modWeblink',$criteria);
$modx->getObject('modSymlink',$criteria);
$modx->getObject('modStaticResource',$criteria);

Отдельные элементы (чанки, сниппеты, плагины, шаблоны, TV переменные и категории) должна быть получена с использованием ключа объекта желаемого класса:

1
2
3
4
5
6
$modx->getObject('modChunk',$criteria);
$modx->getObject('modSnippet',$criteria);
$modx->getObject('modPlugin',$criteria);
$modx->getObject('modTemplate',$criteria);
$modx->getObject('modTemplateVar',$criteria);
$modx->getObject('modCategory',$criteria);

Получение параметров системы

Конткретная системная настройка, может быть получена ??в сниппете методом getOption():

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

Получение поля объекта с помощью $object->get()

После того как вы получили объект с помощью getObject(), getCollection(), или getMany(), вы можете использовать с $object->get() для получения любого поля объекта по названию:

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

В текущий документ всегда доступен так:

1
$modx->resource;

Вы можете получить любое из его полей, используя его метод get():

1
2
$id = $modx->resource->get('id');
$name = $modx->resource->get('pagetitle');

Как и в MODx Evolution любой тег сниппета заменяется значением возвращаемым кодом сниппета. Итак, если вы хотите, чтобы отобразить поля от объекта который вы получили. Просто поместите что-то вроде этого в конце вашего сниппета:

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

При использовании get('content') на ресурсе, вы получите сырое значения поля content ресурса. Тэги в содержимом не будут обработаны.

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

Если у объекта есть объекты, которые связаны с ним в схеме MODx, они могут быть получены с помощью методов объекта getOne() или getMany(). Ресурсы, например, имеют связи - Parent, Children, Template, CreatedBy, EditedBy и т.д. (приведены в таблице ниже). В то время как get() будет извлекать содержимое той или иной области ресурсов объекта, getOne() будет извлекать весь объект. getMany() - это метод получения массива объектов. Ключ к пониманию, какой именно из этих методов Вам нужен, это - может ли быть более одного объекта в результатах поиска. Если это так, вам надо импользовать getMany(). У Ресурса, например, есть только один родитель и вы получите его с помощью getOne ('Parent'). И тот же самый Ресурс может иметь несколько TV-переменных шаблона, ассоциированных к нему, поэтому для их извлечения нужно использовать getMany('TemplateVars').

Обратите внимание, что имена полей, используемые в вызове get() записываются в нижнем регистре, имена объектов, используемых в вызове getOne() и getMany() записаны в ВерблюжьемСтиле (CamelCase). Методы getOne() и getMany() часто принимают один аргумент (имя соответствующего объекта (ов), который(ые) вы хотите получить), но они также могут принимать необязательный второй аргумент, указывающий критерии поиска. Второй аргумент также полезен, если вы хотите отсортировать результаты getMany().

Для получения Идентификатор ID родительского ресурса:

1
$id = $resource->get('parent');

Чтобы получить родительский ресурс как объект MODx:

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

Кроме того, для получения пользователем объекта пользователя, который создал ресурс:

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

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

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

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

1
$user->getOne('Profile');

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

1
$profile->get('fullname');

Чтобы получить детей документ, отсортированный по названию:

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

Переменные шаблона (Template Variables, они же TV-параметры)

Получение обработанного значение TV из текущего документа (или любой документ, на который у вас есть ссылка) легко с помощью этого метода (отметим, что обе буквы "V" имени метода getTVValue() должны быть большими (прописными)):

1
2
$val = $modx->resource->getTVValue('name_of_tv');
$val = $modx->resource->getTVValue($id); // ID of the TV (not the document)

или

1
2
3
$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID of the TV (not the document)

Получение значения TV из другого документа немного сложнее, так как обрабатываемое значение TV может быть различным для каждого документа, в который она встроена, как результат, вы должны либо получить объект ресурса, описанным выше способом, или использовать специфические методы TV и вызвать по ID документа. Предположим, что $id является идентификатором ID документа (а не TV):

1
2
3
4
5
6
7
8
/* Get the TV */
$tv = $modx->getObject('modTemplateVar', array('name'=>'MyTV'));
 
/* get the raw content of the TV */
$rawValue = $tv->getValue($id);
 
/* get the processed content of the TV */
$processedValue = $tv->renderOutput($id);

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

MODx позволяет легко разделить вывод и данные. Один очень удобный способ это сделать, это поместить плейсхолдеры в чанк, а затем оптравить все поля объекта в одном вызове getChunk(). Скажем, например, что вы хотите показать некоторые из полей ресурса с помощью пользовательского сниппета. Если вы создаете TPL чанк с плейсхолдерами для полей, которые вы хотите показать, вы можете отобразить его в MODx Revolution используя очень мало строк кода.

toArray() работает с любым объектом MODx, но чаще всего используется с ресурсами и пользователями. Это создает PHP ассоциативный массив с полями объекта. Этот массив может быть использован в качестве второго аргумента $modx->getChunk() , чтобы заменить плейсхолдеры в блоке с соответствующими значениями. Этот пример показывает, как отображать поля ресурсов очень эффективно. Представьте, что вы хотите показать поля ресурса, который называется MyDocument и что это ваш TPL чанк - ShowResource:

1
2
3
4
5
6
<div class="ShowResource">
    <p>Page Title: </p>
    <p>Long Title: </p>
    <p>Alias: </p>
    <p>Summary: </p>
</div>>

Если вы поместите следующий тег сниппета на странице, он будет отображать поля ресурсов с помощью приведённого кода сниппета ниже.

1

Вот код сниппета:

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

Modx заменит все плейсхолдеры в шаблоне чанка значениями массива $fields, который содержит все поля ресурсов. Немного быстрее, но менее читабельная версия сниппета имеет только две строки:

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

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

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

Наборы параметров (Property Sets)

Набор параметров (Property Set) является объектом MODx, который содержит ассоциативный массив ключей и значений (так же, как System Settings). Набор параметров может быть прикреплен к элементам или на вкладке Свойства элемента (доступно при редактировании элемента в админке Manager), или Tools | Наборы параметров (Property Sets) в главном меню админки Manager. Элемент может иметь более одного прикреплённого набора параметров (Property Set) и набор параметров Property Set может быть присоединен к более чем одному элементу. Присоединение набора параметров делает его доступным для этого элемента, но на самом деле для использования набора параметров со сниппетом или чанком, он должен быть указан в теге элемента следующим образом:

1
2

При подключении к сниппету, Property Set играет роль набора параметров сниппета (Property Set, - ранее Parameters Set в английской версии MODx). Для чанк или других элементов, значения в Property Set заменят теги плейсхолдеров в блоке, которые используют ключи от Property Set. Например, назовём набор параметров "MyProperties", который прикреплён к чанку под названием "MyChunk", вам придется это писать тег чанка так:

1

Если это параметр называется "make" со значением "Ford", плейсхолдер [ [+make]] будет заменен на "Ford" в отображаемом блоке.

Когда вы вызываете сниппет со свойством прикреплённом в теге:

1

Значения перечисленные в Наборе параметров переопределят значения параметров сниппета по умолчанию (определённые в админке) И передаваемые в теге сниппета (&property1 и &property2) заменят значения в Набора парамтеров прикреплённом в теге снипетта. Разумеется, это верно только для свойств с совпадающими именами.

То же самое касается других элементов с прикрепленными наборами параметров. Значения в Property Set заменят любые Свойства по умолчанию с совпадающими именами.

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

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

1
2
$modx->runsnippet($snippetName, $props);
$modx->getChunk($chunkName);

При выполнении сниппета содержащего runSnippet('SnippetName') в коде, будут использоваться Свойства сниппета по умолчанию. Если вы хотите передать сниппет с использованием Набора параметров, то это делается с помощью: runSnippet('SnippetName', $properties). И свойства по умолчанию, и те параметры, которые передаются в теге сниппета будут доступны в сниппете. Те параметры которые были переданы в теге сниппета заменят Свойства по умолчанию, если их имена совпадут.

Теги плейсхолдеров в чанке будет заменены значениями прилагающимися в Наборе параметров, но как эти метки будут обработаны при использовании getChunk() в сниппете? Ответ второй аргумент getChunk(), содержащий свойства массива. Потому что несколько наборов свойств может иметь такое же имя, вы должны искать правильно по названию:

1
2
3
4
5
6
7
8
9
10
$setName = 'desiredPropertySetName';
$chunkName = 'desiredChunkName';
 
$object = $modx->getObject('modChunk',array(
        'name' =>$chunkName));
 
$propSet = $modx->getObject('modPropertySet',array(
        'name' =>$setName));
 
return($modx->getChunk($chunkName, $propSet->getProperties() ));

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

1
2
3
4
5
6
7
/* get the Default Properties of a snippet (or other element) */
$snippet = $modx->getObject('modSnippet',array('name'=>'SnippetName'));
$properties = $snippet->getProperties();
 
/* Get the properties of a particular Property Set */
$propSet = $modx->getObject('modPropertySet',array('name'=>'PropertySetName'));
$properties = $propSet->getProperties();

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

Аналогичный процесс необходим, если вы хотите отправить Набор параметров вдоль при вызове runSnippet(). Свойства в массиве набора параметров будут доступны в сниппете, как если бы они были введены в качестве свойства во теге сниппета.

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

Вам не нужно отправлять Свойства по умолчанию при вызове getChunk(), runSnippet(), или вызове process(). Они используются автоматически.

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

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

Информация на этой странице, полезна только для разработчиков MODx при написании PHP кода в сниппетах или плагинах, которым необходимо знать, как взаимодействовать с ресурсами (документами, гиперссылками, символическими ссылками и статическими ресурсами) и элементами (чанками, сниппетами, плагинами, шаблонами, переменными шаблонов (TV) и категорий) в MODx Revolution.

Эта статья также краткое введение в xPDO. Она знакомит с основными методами xPDO, с которыми предстоит иметь дело в MODx Revolution. Многие методы, перечисленные здесь, являются методами xPDO, но объект $modx является потомком объекта $xpdo и все они доступны через $modx -> MethodName().

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

Текущий ресурс и пользователь доступны непосредственно в следующих переменных - членах класса MODx :

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

Если пользователь не залогинен, имя пользователя будет '(anonymous)'.

Поля объектов доступны через метод get() для каждого объекта (или getContent() для содержания (контента) ресурса):

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

Поиск других объектов

Получить ссылку на объект любого другого ресурса (с поиском по ID, наиболее быстрый способ):

1
$resource = $modx->getObject('modResource', $id);

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

Вы можете "достать" ("get") объект MODx следующим образом:

1
$object = $modx->getObject('object-class-name', array('name' => 'object-name' ));

Или, чтобы получить объект по ID номеру:

1
$object = $modx->getObject('object-class-name', $object-id);

Чтобы получить ссылку, например на чанк, можно использовать:

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

Также для получения чанка будет работать, и несколько быстрее, если вы знаете идентификатор этого чанка. Это также более надежной, так как имя чанк может измениться, но ID никогда не будет меняться:

1
$chunk = $modx->getObject('modChunk',$chunkId);

Использование ID будет работать с любым типом объекта.

Чтобы получить ресурс (прежнее название "документ"), который опубликован и носит название "Recipes" (- англ. Рецепты), вам нужно сделать следующее:

1
2
3
4
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Recipes'
));

Вот еще один способ сделать то же самое:

1
2
3
4
5
6
$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'