Как я говорил в одной из прошлых статей, процессоры – это скрипты, которые выполняют какую-либо одну из функций. В данной части мы с вами подготовим наши процессоры для работы с админкой. Процессоры в таком виде, в котором мы с вами с ними познакомимся появились в 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.