Процессоры в MODX
В MODX есть файлы-процессоры, это php скрипты, которые выполняют определенные функции. Загляните в /core/model/modx/processors, и вы увидите, как их много.
Работать с процессорами можно из любого сниппета или плагина при помощи метода runProcessor:
К примеру, в директории security есть процессоры login и logout, которые управляют авторизацией юзеров. Вот как мы можем авторизовать юзера:
Это очень удобно и гарантирует, что компонент будет работать во всех версиях MODX. Поэтому, если возможно, всегда нужно использовать стандартные процессоры.
Конечно, стандартные процессоры не умеют работать с вашими расширениями.
Использование своих процессоров отличается от стандартных только тем, что нужно указать директорию, откуда их брать. Смотрим пример из miniShop:
Как вы видите, процессор для запуска указывается без расширения, путем от директории процессоров. Если мы не указываем свою директорию, то это будет /core/model/modx/processors/, по умолчанию. В моем примере — мы ее меняем на директории внутри компонента miniShop.
Вот и сладкое! Смотрим пример:
Вот исходный код всего процессора miniShop для создания нового товара.
При таком подходе, опять же, мы гарантируем, что независимо от будущих изменений в MODX наш процессор будет работать во всех версиях. И, что очень важно, будет работать плагины, которые должны работать при создании новых ресурсов. Также будет сгенерирован alias (если вы их используете), причем как это указано в настройках, через транслитерацию, или нет.
Таким же образом работает и обновление товаров, а другой мой компонент mSearch, ловит событие OnDocFormSave и индексирует этот ресурс.
Конечно, можно не использовать в таких случаях runProcessor, а работать через newObject — но тогда нужно самостоятельно генерировать события для плагинов, определять незаданные поля нового ресурса, генерировать alias и еще много чего.
Зачем, если авторы MODX все для нас уже предусмотрели?
Процессоры — отличная вещь и нужно использовать их по-максимуму, везде, во всех своих сниппетах. Если вы хотите сделать что-то с ресурсом или другим элементом — посмотрите, нет ли для этого готового процессора в системе?
Если есть — используйте его. Это оградит вас от лишней головной боли, и позволит другим расширениям и плагинам взаимодействовать с вашим кодом. Кстати, так и писать выходит меньше — запустил runProcessor, получил ответ и делай, что хочешь.
Работать с процессорами можно из любого сниппета или плагина при помощи метода runProcessor:
$response = $modx->runProcessor('action/path/to/processor',$arrayOfProperties,$otherOptions);В ответ мы получаем объект modProcessorResponse, со всеми его методами.Стандартные процессоры
К примеру, в директории security есть процессоры login и logout, которые управляют авторизацией юзеров. Вот как мы можем авторизовать юзера:
$username = 'bezumkin';
$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, 'login error. Username: '.$username.', Message: '.$response->getMessage());
}Выход с сайта и того проще:$response = $modx->runProcessor('/security/logout');
if ($response->isError()) {
$modx->log(modX::LOG_LEVEL_ERROR, 'Logout error. Username: '.$modx->user->get('username').', uid: '.$modx->user->get('id').'. Message: '.$response->getMessage());
}Именно так и сделана авторизация в моем компоненте Loginza.Это очень удобно и гарантирует, что компонент будет работать во всех версиях MODX. Поэтому, если возможно, всегда нужно использовать стандартные процессоры.
Конечно, стандартные процессоры не умеют работать с вашими расширениями.
Собственные процессоры
Использование своих процессоров отличается от стандартных только тем, что нужно указать директорию, откуда их брать. Смотрим пример из miniShop:
// Массив, который мы передадим в процессор, там его ловить в $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 все для нас уже предусмотрели?
Заключение
Процессоры — отличная вещь и нужно использовать их по-максимуму, везде, во всех своих сниппетах. Если вы хотите сделать что-то с ресурсом или другим элементом — посмотрите, нет ли для этого готового процессора в системе?
Если есть — используйте его. Это оградит вас от лишней головной боли, и позволит другим расширениям и плагинам взаимодействовать с вашим кодом. Кстати, так и писать выходит меньше — запустил runProcessor, получил ответ и делай, что хочешь.
Комментарии: 26
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Сегодня вечером или завтра утром постараюсь сделать перевод.
Удачи.
Если нужно просто создать ресурс — вот простейший код:
$data = array('pagetitle' => 'Название', 'content' => 'Текст страницы');
$modx->runProcessor('resource/create', $data);
Все.
В массив $data можно пихать любые свойства ресурса MODX, если их нет — будут дефолтные. Можно даже пустой массив отправить, тогда появится «Ресурс без названия».
Считаете, нужно это добавить в заметку?
Я имел в виду простоу топик-урок, как с фронта создать ресурс по правильному (модексовски). Думаю это как отдельная тема уже.
Хотя гнать коня не нужно наверное, если будет нужно кому, то попросят!
Да и вообще, непростая это тема, много заморочек.
Но на будущее оставим этот вопрос. Может и напишу, если буду что-то такое делать.
да, это было бы здорово!
community.modx-cms.ru/blog/documentation/869.html
Будет время — напишу про создание ресурсов с фронтенда — добавляйте rss блога себе в ридер.
Тема очень интересна. Сейчас рассматриваю возможность использования процессоров для создания контента из front-end'a сайта (ну не хочу я пускать всех в mgr, да и конечному пользователю будет удобно из front-end'a работать). Конкретно пытаюсь сделать добавление статей в блог. Может я конечно изобретаю велосипед, и все уже написано за меня? Не поможете советом по этому вопросу?
причем если указать явно $resource_id = 1 работает.
И сразу еще вопрос только для процессора modObjectGetProcessor
Подскажите как там получать и возвращать данные, немного не понял его.
теперь запускается процессор на панели ресурса(modx-resource-tabs) getlist — trItemData, в котором получаю объекты trItemData, но проблема в том, что получаю все объекты всех ресурсов. Отсюда становится понятно, что надо указывать id текущего ресурса для выборки объектов trItemData(собственно поле id_res для этого и делал), но вот как получить для where id текущего ресурса никак не пойму.
Проще говоря как получить объекты trItemData только текущего ресурса(trItem)?
А вы его передаёте в процессор?
Спасибо большое Сергей! все получилось, подсмотрел в других компонентах
Сделал так:
В плагине создал запись
в js
В плагине 2 последние строчки конфига можно убрать. Так как res_id можно получить в js. А Trans.config.connector_url дублирует Trans.config.connectorUrl.
Js будет выглядеть так
Насчет connectorUrl проглядел) вот что значит не подумав скопировать)
Еще раз спасибо Сергей!
Вышибает с 500 ошибкой