Как я говорил в одной из прошлых статей, процессоры – это скрипты, которые выполняют какую-либо одну из функций. В данной части мы с вами подготовим наши процессоры для работы с админкой. Процессоры в таком виде, в котором мы с вами с ними познакомимся появились в MODX с версии 2.2. Что ж, процессор это php скрипт, который содержит класс, наследующий modProcessor. В MODX на данный момент уже есть достаточно много процессоров, которые можно наследовать и использовать для своих целей:
- modObjectCreateProcessor – получает и возвращает указанный объект.
- modObjectGetListProcessor — Выводит список объектов для таблицы.
- modObjectCreateProcessor — Создаёт новый объект.
- modObjectUpdateProcessor — Обновляет существующий объект.
- modObjectDuplicateProcessor — Делает копию существующего объекта.
- modObjectRemoveProcessor — Удаляет объект.
Для того, чтобы понять, какие методы можно переопределять, смотрите исходник modObjectProcessor. Сам же файл состоит из класса и в конце обязан вернуть свое имя.
Итак, не буду сильно много рассусоливать, приступим к написанию наших процессоров. Подробно разберем только один из них, остальные же я просто приведу в качестве кода.
Если вы внимательно читали наши предыдущие статьи, то вы должны быть в курсе, что наши процессоры хранятся в папке core/components/dartsocials/processors/mgr/. Далее я советую под каждый тип объектов создавать свою папку и размещать там процессоры для работы с одним объектом. В нашем случае, объект один, поэтому оставляем папку item, оставшуюся от modExtra, и в ней будем хранить наши процессоры. Список процессоров у нас также не изменится, мы их с вами модифицируем.
Начнем с процессора create.class.php (комментариями в коде я пояснил, что к чему):
<?php
class DARTSocialsItemsCreateProcessor extends modObjectCreateProcessor
{
/* тип объекта, с которым работаем */
public $objectType = 'DARTSocialsItems';
/* xPDO класс объекта */
public $classKey = 'DARTSocialsItems';
/* Топики словарей, которые нужно подключить */
public $languageTopics = ['dartsocials'];
/* Если нужно, то проверяем права доступа */
public $permission = 'create';
/**
* @return bool
*/
public function beforeSet()
{
$name = trim($this->getProperty('name'));
// здесь просто проверим заполнено ли поле name и проверим его на дублирование
if (empty($name)) {
$this->modx->error->addField('name', $this->modx->lexicon('dartsocials_item_err_name'));
} elseif ($this->modx->getCount($this->classKey, ['name' => $name])) {
$this->modx->error->addField('name', $this->modx->lexicon('dartsocials_item_err_ae'));
}
return parent::beforeSet();
}
}
// возвращаем наименование нашего класса
return 'DARTSocialsItemsCreateProcessor';
Аналогично нам нужно подстроить все наши процессоры. Думаю, что вы с ними справитесь, если что подсматривайте мои исходники на GitHub.
Для того, чтобы настроить в дальнейшем корректную работу с компонентом, в данной части мы с вами реализуем еще несколько вещей. Первое, создадим три системные настройки:
- dartsocials_assets_path — {base_path}extras/DARTSocials/assets/components/dartsocials/
- dartsocials_assets_url — /extras/DARTSocials/assets/components/dartsocials/
- dartsocials_core_path — {base_path}extras/DARTSocials/core/components/dartsocials/
Они нам нужны для того, чтобы мы могли работать в MODX с папкой именно /extras/DARTSocials/ а не стандартных папок core и assets. Далее в основном классе поправим функцию __construct:
/**
* @param modX $modx
* @param array $config
*/
function __construct(modX &$modx, array $config = [])
{
$this->modx =& $modx;
$corePath = $this->modx->getOption('dartsocials_core_path', $config, $this->modx->getOption('core_path') . 'components/dartsocials/');
$assetsUrl = $this->modx->getOption('dartsocials_assets_url', $config, $this->modx->getOption('assets_url') . 'components/dartsocials/');
$assetsPath = $this->modx->getOption('dartsocials_assets_path', $config, $this->modx->getOption('base_path') . 'assets/components/dartsocials/');
$this->config = array_merge([
'corePath' => $corePath,
'modelPath' => $corePath . 'model/',
'processorsPath' => $corePath . 'processors/',
'connectorUrl' => $assetsUrl . 'connector.php',
'assetsUrl' => $assetsUrl,
'cssUrl' => $assetsUrl . 'css/',
'jsUrl' => $assetsUrl . 'js/',
], $config);
$this->modx->addPackage('dartsocials', $this->config['modelPath']);
$this->modx->lexicon->load('dartsocials:default');
}
И нужно также поправить файл core/components/dartsocials/controllers/home.class.php, а именно функцию initialize():
/**
*
*/
public function initialize()
{
$corePath = $this->modx->getOption('dartsocials_core_path', array(), $this->modx->getOption('core_path') . 'components/dartsocials/');
$this->DARTSocials = $this->modx->getService('DARTSocials', 'DARTSocials', $corePath . 'model/');
parent::initialize();
}
И поправим немного файл assets/components/dartsocials/connector.php:
<?php
if (file_exists(dirname(dirname(dirname(dirname(__FILE__)))) . '/config.core.php')) {
/** @noinspection PhpIncludeInspection */
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/config.core.php';
} else {
require_once dirname(dirname(dirname(dirname(dirname(dirname(__FILE__)))))) . '/config.core.php';
}
/** @noinspection PhpIncludeInspection */
require_once MODX_CORE_PATH . 'config/' . MODX_CONFIG_KEY . '.inc.php';
/** @noinspection PhpIncludeInspection */
require_once MODX_CONNECTORS_PATH . 'index.php';
/** @var DARTSocials $DARTSocials */
$corePath = $modx->getOption('dartsocials_core_path', null, $modx->getOption('core_path') . 'components/dartsocials/');
$DARTSocials = $modx->getService('DARTSocials', 'DARTSocials', MODX_CORE_PATH . 'components/dartsocials/model/');
$modx->lexicon->load('dartsocials:default');
// handle request
$path = $modx->getOption('processorsPath', $DARTSocials->config, $corePath . 'processors/');
$modx->getRequest();
/** @var modConnectorRequest $request */
$request = $modx->request;
$request->handleRequest([
'processors_path' => $path,
'location' => '',
]);
Все, мы с вами подготовили все скрипты для админки. В следующей статье будем с вами писать интерфейс на extJS.