Jump to main content Jump to doc navigation

Процессоры в MODX

Процессоры можно сравнить с "командами" или "действиями". До MODX 2.2 они были "простыми" PHP-файлами, но с тех пор они были переписаны на базе modProcessor класса, и его различных подтипов.

Итак, мы говорим про файлы-процессоры, это такие PHP скрипты, которые могут выполнять определенные функции. Для наглядности загляните в /core/model/modx/processors, и вы увидите, как их много.

Работать с процессорами можно из любого Cниппета или Плагина при помощи метода runProcessor:

$response = $modx->runProcessor('action/path/to/processor',$arrayOfProperties,$otherOptions);

В ответ мы получаем объект modProcessorResponse, со всеми его методами.

Стандартные процессоры

К примеру, в каталоге security есть процессоры login и logout, которые управляют авторизацией пользователей. Вот как мы можем его авторизовать:

$username = 'ivanpetrov';
$password = '*********';
$data = array(
    'username' => $username,
    'password' => $password,
    'rememberme' => 1,
    'login_context' => 'web',
);    
$response = $modx->runProcessor('/security/login', $data);
if ($response->isError()) {
    $modx->log(modX::LOG_LEVEL_ERROR, 'Ошибка авторизации. Имя пользователя: '.$username.', Сообщение: '.$response->getMessage());
}

Выход с сайта и того проще:

$response = $modx->runProcessor('/security/logout');
if ($response->isError()) {
    $modx->log(modX::LOG_LEVEL_ERROR, 'Ошибка разавторизации. Имя пользователя: '.$modx->user->get('username').', UID: '.$modx->user->get('id').'. Сообщение: '.$response->getMessage());
}

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

Конечно, стандартные процессоры не умеют работать с вашими расширениями.

Собственные процессоры

Использование своих процессоров отличается от стандартных только тем, что нужно указать директорию, откуда их брать. Смотрим пример из miniShop2:

// Массив, который мы передадим в процессор, там его ловить в $scriptProperties
$processorProps = array(
    'id' => 55
);
// Массив опций для метода runProcessor
$otherProps = array(
    // Здесь указываем где лежат наши процессоры
    'processors_path' => $modx->getOption('core_path') . 'components/minishop/processors/'
);
// Запускаем
$response = $modx->runProcessor('web/orders/getlist', $processorProps, $otherProps);
// И возвращаем ответ от процессора
return $response->response;

Это чуть измененный пример из сниппета miniShop, где он обрабатывает запросы личного кабинета.

Как вы видите, процессор для запуска указывается без расширения, путем от каталога процессоров. Если мы не указываем свой каталог, то это будет /core/model/modx/processors/ по умолчанию. В примере выше — мы ее меняем на каталог внутри компонента miniShop.

Стандартный процессор внутри собственного

Вот и самое интересное! Смотрим пример:

$response = $modx->runProcessor('resource/create', $_POST);
if ($response->isError()) {
    return $modx->error->failure($response->getMessage());
}

$id = $response->response['object']['id'];

В этом примере мы создаем стандартным процессором новый ресурс из присланных данных, и получаем из ответа id этого ресурса, для дальнейшей работы. Вот исходный код всего процессора miniShop для создания нового товара.

При таком подходе гарантируется, что независимо от будущих изменений в MODX свой процессор будет работать во всех версиях. И, что очень важно, будут работать плагины, которые должны работать при создании новых ресурсов. Также будет сгенерирован alias (если вы их используете), причем как это указано в настройках, через транслитерацию, или нет. Таким же образом работает и обновление товаров, а например mSearch, ловит событие OnDocFormSave и индексирует этот ресурс.

Конечно, можно не использовать в таких случаях runProcessor, а работать через newObject — но тогда нужно самостоятельно генерировать события для плагинов, определять незаданные поля нового ресурса, генерировать alias и еще много чего. Зачем, если MODX все это уже предусмотрел?

Заключение

Процессоры — отличная вещь и нужно использовать их по-максимуму, везде, во всех своих Сниппетах. Если вы хотите сделать что-то с ресурсом или другим элементом — посмотрите, нет ли для этого готового процессора в системе? Если есть — используйте его. Это оградит вас от лишней головной боли, и позволит другим расширениям и плагинам взаимодействовать с вашим кодом.

Смотрите также