В данной статье я расскажу про API MODx Revolution. Решил прописать все у себя на блоге, так как устал искать по крупицам все каждый раз. Постараюсь изложить данную информацию как можно удобнее и читабельнее и надеюсь данная статья будет интересна PHP разработчикам, которые пишут сниппеты или плагины. Итак, первое, что нужно знать, это то, что все методы вызываются следующим образом: $modx->method().

Доступ к текущему ресурсу / пользователю 

Объекты текущего ресурса или пользователя можно получить следующим образом:

$currentResource = $modx->resource;
$currentUser = $modx->user;
/* Если пользователь не залогинен, то $currentUser = '(anonymous)'. */

А имея доступ к объектам, мы можем получить какие либо значения или характеристики объекта, используя методы get() или getContent() для получение поля контента ресурса:

$intro = $modx->resource->get('introtext');
$UserID = $modx->user->get('id');
$content = $modx->resource->getContent();
Помните, что когда вы используете get('content') или getContent(), вы получаете необработанное содержимое. Теги не будут обработаны.

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

В MODx получить тот или иной объект можно используя метод getObject:

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

Или же можно указать вторым параметрам сразу идентификатор объекта:

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

На примере доступа к ресурсу получится следующая конструкция:

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

Выше мы получили ресурс с идентификатором 3, также, как было написано выше, мы можем указать идентификатор напрямую:

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

Также вторым параметром мы можем указать какие-либо характеристики объекта, допустим:

$document = $modx->getObject('modResource',array(
    'published' => 1,
    'pagetitle' => 'Контакты'
));

Либо коду можно придать универсальность:

$name = 'modResource';
$criteria = array(
    'published' => 1,
    'pagetitle' => 'Recipes'
)
$document = $modx->getObject($name,$criteria);
Примечание: Обычная ошибка при получении ресурса это использование 'name' или 'title' вместо 'pagetitle'. Ресурсы не имеют "name" или поле "title".

Если getObject() дает нам один объект, то, чтобы получить массив объектов по заданным параметрам, мы можем использовать метод getCollection():

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

Уточню, что мы получим не ассоциативный массив PHP, а массив объектов. И, допустим, чтобы перебрать все объекты, мы можем использовать следующую конструкцию:

$resources = $modx->getCollection('modResource');
$output = '<p>Всего ресурсов: '.count($resources).'</p>';
foreach ($resources as $k => $res) {
  $output .= '<p>['.$k.'] => '.$res->get('pagetitle').'</p>';
}
return $output;

Доступ к настройкам системы

Чтобы получить настройку системы мы можем использовать метод getOption(). Кстати, если вы используете компонент ClientConfig, то получить настройку из него поможет эта же конструкция:

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

Получаем поля объекта методом get()

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

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

В этом куске кода в строке 1 мы получили ресурс с id=2, а во второй строке получили longtitle данного ресурса.

TV-параметры

Значение TV поля мы можем извлекать с помощью метода getTVValue():

$resource = $modx->getObject('modResource',array('pagetitle'=>'SomePage'));
$val = $resource->getTVValue('name_of_tv');
$val = $resource->getTVValue($id); // ID TV (не ресурса)

Либо альтернативным вариантом:

/* берем объект TV */
$tv = $modx->getObject('modTemplateVar',array('name'=>'MyTV'));

/* берем значение TV */
$rawValue = $tv->getValue($id);

/* обрабатываем вывод значения TV */
$processedValue = $tv->renderOutput($id);

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

Данные конструкции позволит вам очень удобно управлять выводом в сниппетах. Допустим у нас есть чанк ShowResource:

<div class="ShowResource">
    <p>Page Title: [ [+pagetitle] ]</p>
    <p>Long Title: [ [+longtitle] ]</p>
    <p>Alias: [ [+alias] ]</p>
    <p>Summary: [ [+introtext] ]</p>
</div>

Чтобы обработать его, нам поможет следующая конструкция:

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

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

Запуск сниппета с помощью API MODx

В наших сниппетах можно использовать и другие сниппеты. Это очень удобно, когда, допустим, нужно написать фильтр. Метод runSnippet() нам поможет в этом:

$modx->runsnippet('getResources', $props);

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

С помощью API MODX мы можем изменять поля объектов. Для этого у нас в арсенале есть метод set():

$resource->set('modResource', 'pagetitle');
$resource->save();

У TV маленько другой принцип. Там за это отвечает setTVValue():

$resource->setTVValue('tvname', 'value');
$resource->save();

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

Еще одна очень полезная штука для динамичных сайтов - это создание объектов:

$object = $modx->newObject('modChunk');
$object->set('name', 'ChunkName');
$object->setContent('This will be the content of the new chunk.');
$object->set('description', 'I created this chunk in a snippet');
$object->set('category', 'MyChunks');
$object->save(); 

Основные объекты MODx и их свойства

Document/Resource (class name = 'modResource')

  • id (int - Resource Identifier)
  • pagetitle (text)
  • isfolder (int 0/1)
  • longtitle (text)
  • description (text)
  • alias (text)
  • published (int 0/1)
  • introtext (text - aka summary)
  • content (text)
  • template (int - template id number)
  • menuindex (int)
  • searchable (int 0/1)
  • cacheable (int 0/1)
  • createdby (int user id number)
  • editedby (int user id number)
  • deleted (int 0/1)
  • deletedby (int user id number)
  • publishedby (int user id number)
  • createdon (date - date of first save)
  • publishedon (date - date of most recent change to published)
  • editedon (date - date it was last edited)
  • menutitle (text)
  • donthit (int 0/1) (deprecated)
  • haskeywords (int 0/1) (deprecated)
  • hasmetatags (int 0/1) (deprecated)
  • hidemenu (int 0/1)
  • Related Objects available with getOne()
    • Parent (class="modResource")
    • Template (class="modTemplate")
    • CreatedBy (class="modUser")
    • EditedBy (class="modUser")
    • DeletedBy (class="modUser")
    • PublishedBy (class="modUser")
    • ContentType (class="modContentType")
    • Context (class="modContext")
  • Related Objects available with getMany()
    • Children (class="modResource")
    • TemplateVars (class="modTemplateVar")
    • TemplateVarTemplates (class="modTemplateVarTemplate")

Chunk (class name = 'modChunk')

  • name (text)
  • description (text)
  • category (int - category id number)
  • snippet (text - chunk's contents)
  • locked (int 0/1 - AKA locked for editing)
  • Related Objects available with getOne()
    • Category (class="modCategory")
  • Related Objects available with getMany()
    • PropertySets (class="modElementPropertySet")

Snippet (class name = 'modSnippet')

  • name (text)
  • description (text)
  • category (int - category id number)
  • snippet (text - snippet's contents)
  • locked (int 0/1 - AKA locked for editing)
  • properties (text)
  • Related Objects available with getOne()
    • Category (class="modCategory")
  • Related Objects available with getMany()
    • PropertySets (class="modElementPropertySet")

Plugin (class name = 'modPlugin')

  • name (text)
  • description (text)
  • category (int - category id number)
  • plugincode (text - plugin's contents)
  • locked (int 0/1 - AKA locked for editing)
  • properties (text)
  • disabled (int 0/1)
  • Related Objects available with getOne()
    • Category (class="modCategory")
  • Related Objects available with getMany()
    • PropertySets (class="modElementPropertySet")
    • PluginEvents (class="modPluginEvent")

Template (class name = 'modTemplate')

  • templatename (text)
  • description (text)
  • category (int - category id number)
  • content (text)
  • icon (text)
  • locked (int 0/1)
  • Related Objects available with getOne()
    • Category (class="modCategory")
  • Related Objects available with getMany()
    • PropertySets (class="modElementPropertySet")
    • TemplateVarTemplates (class="modTemplateVarTemplate")

TemplateVariable (class name = 'modTemplateVar')

  • type (text)
  • name (text)
  • caption (text)
  • description (text)
  • category (int - category id)
  • locked (int 0/1)
  • elements (text)
  • rank (int)
  • display (text)
  • display_params (text)
  • default_text (text)
  • Related Objects available with getOne()
    • Category (class="modCategory")
  • Related Objects available with getMany()
    • PropertySets (class="modElementPropertySet")
    • TemplateVarTemplates (class="modTemplateVarTemplate")
    • TemplateVarResources (class="modTemplateVarResource")
    • TemplateVarResourceGroups (class="modTemplateVarResourceGroup")

User (class name = 'modUser')

  • username (text)
  • password (text)
  • cachepwd (text)
  • Related Objects available with getOne()
    • Profile" (class="modUserProfile")
  • Related Objects available with getMany()
    • CreatedResources (class="modResource")
    • EditedResources (class="modResource")
    • DeletedResources (class="modResource")
    • PublishedResources (class="modResource")
    • SentMessages (class="modUserMessage")
    • ReceivedMessages (class="modUserMessage")
    • UserSettings (class="modUserSetting")
    • UserGroupMembers (class="modUserGroupMember")

User Profile (class name = 'modUserProfile')

  • fullname (text)
  • role (int)
  • email (text)
  • phone (text)
  • mobilephone (text)
  • blocked (int 0/1)
  • blockeduntil (int - date)
  • blockedafter (int - date)
  • logincount (int)
  • lastlogin (int - date)
  • thislogin (int - date)
  • failedlogincount (int)
  • sessionid (text)
  • dob (int - date)
  • gender (int 0/1)
  • country (text)
  • state (text)
  • zip (text)
  • fax (text)
  • photo (text)
  • comment (text)
  • Related Objects available with getOne()
    • User (class="modUser")
    • UserRole (class="modUserRole")
Написано по материалам BobRay MODx Guides