Часть 3. Пишем процессоры и подготавливаем пакет для работы.

16.10.2020
3363

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

Часть 3. Пишем процессоры и подготавливаем пакет для работы.

0 Число голосов: 4
3
5
1
4

Комментарии ()

  1. Lin 09 июня 2022, 16:59 # 0
    Думаю, что вы с ними справитесь, если что подсматривайте мои исходники на GitHub.
    Здравсвуйте,Не подскажете ссылку где можно «подсмотреть»?

    Наши клиенты

    Многие компании уже доверяют нам. Будьте в их числе!

    Хотите реализовать проект?

    Контакты

    Напишите нам - мы расскажем вам много интересного!


    Пермь, шоссе Космонавтов 252, офис 218