MODX. Некоторая информация по API MODX

Документация по версии API Modx Revolution 2.2

Документация по версии API Modx Revolution 2.x

Подключаем MODX API

Для внешнего использования MODX:

// Подключаем MODX API
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('web');
$modx->getService('error','error.modError', '', '');

или:

// Подключаем
define('MODX_API_MODE', true);
require 'index.php';

// Включаем обработку ошибок
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

Проверяем:

if ($res = $modx->getObject('modResource', 1)) {
    print_r($res->toArray());
}

//или так
$response = $modx->runProcessor('resource/get', array('id' => 1));
if (!$response->isError()) {
    print_r($response->response['object']);
}
else {
    $modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
}

Процессоры

Процессор — код php, который выполняется вашим AJAX-коннектором (modX::runProcessor). Он делает все, что требуется, и возвращает JSON.​

modObjectUpdateProcessor

Процесс modObjectUpdateProcessor отвечает за обновление данных. Пример класса процессора:

<?php
class sampleCodeUpdateProcessor extends modObjectUpdateProcessor {
    public $classKey = 'sampleCode';
    public $languageTopics = array('sample:pricing');
    public $objectType = 'sample';
}
return 'sampleCodeUpdateProcessor';
Детальный процесс обработки процесса на основе modObjectUpdateProcessor
  1. Процессор создается, свойства установливаются.

  2. Выполняется метод checkPermissions(), использующаяся для проверки, пользовательских прав.

  3. Запускается метод getLanguageTopics(), подгружающая лексические данные.

  4. Метод initialize(): получает первичный ключ (из открытой переменной primaryKeyField, по умолчанию имеет значение «id»), получает объект на основе classKey и публикует значение первичного ключа и, если это расширение modAccessibleObject, проверяет сеанс пользователя на соответствие «сохранить» политику. Если функция initialialize не возвращает true, запрос отменяется с сообщением об ошибке.

  5. Запускается метод beforeSet(): по умолчанию эта функция только проверяет, установлены ли какие-либо ошибки (например, $ this-> addFieldError ('fieldname', 'error')). Если в результате не true, процессор возвращает ошибку.

  6. Вызывается метод fromArray() для объекта (доступного как $ this-> object) со всеми опубликованными свойствами.

  7. Запускается метод beforeSave(). Как и в случае с методом beforeSet, он только проверяет, были ли зарегистрированы ошибки. Если результат не является логическим значением true, процессор возвращает ошибку со значением, возвращаемым как сообщение.

  8. Вызывается метод validate() для объекта. Если это не возвращает положительное значение, сообщения об ошибках устанавливаются как ошибки поля.

  9. Если вы установили переменную beforeSaveEvent для класса, это событие вызывается, и если оно не возвращает true, сохранение предотвращается. Хотя функция fireBeforeSaveEvent() помечена как открытая, вы, вероятно, не захотите переопределять это в обычных случаях.

  10. Запускается метод SaveObject(), который вызывает save() на объекте. Согласно встроенным комментариям, это может быть переопределено для временного и непостоянного обновления объекта.

  11. Запускается метод FireAfterSaveEvent(), который запускает событие, указанные в afterSaveEvent переменной класса.

  12. Запускается метод LogManagerAction(), который регистрирует общее сообщение в лог менеджер (доступен в разделе Отчеты> Диспетчер действий).

  13. Сообщение об успешном завершении возвращается через метод cleanup(), которая фактически оборачивает pre-2.2 $ modx-> error-> success / fail, часто используемый в процессорах.

  14. Результат (success или failure) обрабатывается в объекте modProcessorResponse и возвращается.

modObjectGetListProcessor

Процесс modObjectGetListProcessor используется для заполнения сеток в modExt Grid (формы данных в админке MODX), или в любом другом виджете или сниппете использующем JSON Data Store.

Минимальный код класса для процессора GetList:

<?php
class sampleGetListProcessor extends modObjectGetListProcessor {
    public $classKey = 'sampleClassName'; // имя класса, объект которого вы собираетесь получить
    public $defaultSortField = 'id';  // поле по которому будет происходить сортировка
    public $defaultSortDirection = 'desc'; // направление для сортировки
}
return 'sampleGetListProcessor '; // запускаем обработку класса
Детальный процесс обработки процесса на основе modObjectGetListProcessor
  1. Процессор создается, свойства установливаются.

  2. С помощью checkPermissions(), происходит проверка — разрешен ли пользователю доступ к процессору.

  3. Происходит поиск лексических данных для загрузки через getLanguageTopics, который получает свои данные из переменной languageTopics (в виде массива).

  4. Вызывается метод initialize(), который устанавливает ряд свойств по умолчанию, включая sort, для переменной класса defaultSortField (default: name) и направление к переменной defaultSortDirection (default: ASC).

  5. Вызывается process().

  6. process() запускает beforeQuery(), и если результат — false, он будет считать, что процессор вышел из строя, и отменит дальнейшее выполнение.

  7. process() запускает getData().

  8. Метод getData() создает объект xPDOQuery для типа classKey.

  9. Метод getData() вызывает prepareQueryBeforeCount(xPDOQuery $c) (если установлен), позволяющий добавлять дополнительные условия к запросам. После этого он получает общее количество результатов, используя modX.getCount.

  10. Метод getData() вызывает prepareQueryAfterCount(xPDOQuery $c) (если установлен).

  11. Запрос сортируется с помощью метода getSortClassKey(), а также свойств sortAlias, sort и dir .

  12. Если свойство limit больше 0, оно ограничивает запрос и устанавливает смещение.

  13. Вызывается modX.getCollection с вашими данными, если они были получены.

  14. Каждая строка повторяется с использованием метода iterate(array $data). Повторяется вызов beforeIteration(array $list) и начинает циклически проходить по строкам.

  15. Если переменная checkListPermission имеет значение true, объект расширяет modAccessibleObject, и если checkPolicy('list') — значение false, строка пропускается.

  16. Вызывается prepareRow(xPDOObject | modAccessibleObject $object), который должен вернуть массив с полями объектов. Отличный метод для настройки полученных данных. Массив добавляется в список.

  17. После прохода по всему набору результатов вызывается afterIteration(array $list).

  18. Данные возвращаются.

Константы MODx Revolution

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

Код Описание Результат
MODX_BASE_URL относительный путь к корню сайта /
MODX_ASSETS_URL относительный путь к ресурсам /assets/
MODX_MANAGER_URL относительный путь к админ части /manager/
MODX_CONNECTORS_URL относительный путь к коннекторам /connectors/
MODX_URL_SCHEME протокол сайта http:// или https://
MODX_HTTP_HOST адрес сайта site.ru

MODX_CORE_PATH

{core_path}

абсолютный путь к ядру сайта /home/www/core

MODX_ASSETS_PATH

{assets_path}

абсолютный путь к ресурсам /home/www/assets/
MODX_PROCESSORS_PATH абсолютный путь к процессорам /home/www/core/model/modx/processors/
MODX_CONNECTORS_PATH абсолютный путь к коннекторам /home/www/connectors/
MODX_MANAGER_PATH абсолютный путь к админ части /home/www/manager

MODX_BASE_PATH

{base_path}

абсолютный путь к корню сайта /home/www/
MODX_API_MODE подключение API MODX  

Методы MODX

sendForward()

sendForward('id') — позволяет загрузить некий ресурс без изменения url. При помощи этого метода работает выдача страниц «404 не найдено» и «401 требуется авторизация».

Также при помощи этого метода можно выдавать заменяющую страницу, сохранив оригинальные pagetitle, introtext и другие поля, нужно просто указать дополнительный массив с ключами:

$options = array(
	'merge' => 1, // Включает механизм склейки полей
	// список оригинальных полей, которые нужно исключить из результата
	'forward_merge_excludes' => 'id,template,type,published,class_key'
);
$modx->sendForward(15, $options);

Ключ forward_merge_excludes заведует полями исходной страницы, которые нужно исключить из результатов. К эти полям обязательно будут прибавлены: content, pub_date, unpub_date, richtext.

getOption() [xPDO]

Подробности в статье посвященной getOption().

Работа с классами

Методы addPackage(), addExtensionPackage(), loadClass(), getService()

Подробности в статье посвященной методам loadClass(), getService(), addPackage() и addExtensionPackage().