easyComm 3, работа в MODX 3


Приветствую участников сообщества!

В этой заметке я лишь хотел сказать о том, что в магазин Modstore выложена версия easyComm 3.0.1-pl, которая работает в MODX 3!


Сейчас вы можете скачать 2 версии компонента в зависимости от вашей версии MODX (1.10.3-pl или 3.0.1-pl), выбор происходит автоматически.

Нового функционала нет, я лишь адаптировал компонент для MODX 3. Даже наоборот, я пока отключил поддержку плагинов, т.е. вы НЕ СМОЖЕТЕ добавить поля как это описано в текущей документации. Думаю, к этому можно будет вернуться позже.

В общем, если вы вдруг рискнете сделать продакшн сайт на альфа версии MODX 3, знайте, easyComm вам в помощь!)))
Кстати, чисто потыкать и посмотреть на работу я думаю можно на modhost, создав тестовый сайт.

Ниже немного расскажу о том, с чем я столкнулся в процессе работы.
Сразу скажу, я не претендую на абсолютную истину и знание MODX 3, возможно, где-то я сделал неправильно, поправляйте меня.

Несколько ссылок по теме, чем я пользовался:
1. Статья «Подготовка дополнения для работы в MODX 3»: modx.pro/development/19429
2. Исходники Collection, адаптированные под modx 3: github.com/modxcms/Collections/tree/for-3
3. Исходники pdoTools, адаптированные под modx 3: github.com/modx-pro/pdoTools/tree/3x-new/core/components/pdotools
и статьи из официальной документации
4. Dependency Injection Container docs.modx.com/3.x/en/extending-modx/di-container
5. Namespaces docs.modx.com/3.x/en/extending-modx/namespaces

Основные шаги, как запустить компонент на MODX 3

1. Переносим код компонента в папку src (см. исходники Collections, pdoTools). Теперь мы вовсю пользуемся namespace и use.
В /src у нас будут: папка Model с объектами, процессоры, основной код компонента.

2. Файл схемы easycomm.mysql.schema.xml меняется.
Вот пример того, как теперь выглядит схема в easyComm (кусочек для демонстрации):
<?xml version="1.0" encoding="UTF-8"?>
<model package="EasyComm\Model\" baseClass="xPDO\Om\xPDOObject" platform="mysql" defaultEngine="MyISAM" version="3.0">
    <object class="ecThread" table="ec_threads" extends="xPDO\Om\xPDOSimpleObject">
    .....
    </object>
</model>
Местоположение этого файла не меняется, но вот на его основе генерируется уже немного другая модель (у меня это происходит в файле /_build/build.model.php).
Код для генерации модели:
$sources = array(
    'root' => $root,
    'build' => $root . '_build',
    'source_core' => $root . 'core/components/' . PKG_NAME_LOWER,
    'src' => $root . 'core/components/' . PKG_NAME_LOWER . '/src',
    'model' => $root . 'core/components/' . PKG_NAME_LOWER . '/src/Model',
    'schema' => $root . 'core/components/' . PKG_NAME_LOWER . '/schema',
    'xml' => $root . 'core/components/' . PKG_NAME_LOWER . '/schema/' . PKG_NAME_LOWER . '.mysql.schema.xml',
);
................

/** @var xPDOManager $manager */
$manager = $modx->getManager();
/** @var xPDOGenerator $generator */
$generator = $manager->getGenerator();

// Remove old model
rrmdir($sources['model'] . '/mysql');

// Generate a new one
$generator->parseSchema($sources['xml'], $sources['src'], array('namespacePrefix' => PKG_NAME, 'update' => 0));

3. В методах getObject, newObject, newQuery и других с параметром $class нам нужно указывать полностью класс объекта:
// Пример 1
$message = $modx->getObject(EasyComm\Model\ecMessages::class, 1);
// Пример 2
$chunk = $modx->newObject(modChunk::class);
Это же касается случаев, когда мы делаем JOIN, к примеру.

4. Теперь мы не пользуемся
$modx->getService('easyComm');
, вместо этого у нас эти методы:
$modx->services->add('EasyComm', new EasyComm($modx));
$modx->services->has('EasyComm');
$modx->services->get('EasyComm');
Здесь примеры правильного использования.

5. Загрузка модели теперь может быть автоматической, для чего достаточно в папке \core\components\easycomm\ поместить файл bootstrap.php следующего содержания:
<?php
/**
 * @var \MODX\Revolution\modX $modx
 * @var array $namespace
 */

$modx->addPackage('EasyComm\Model', $namespace['path'] . 'src/', null, 'EasyComm\\');
$modx->services->add('EasyComm', function($c) use ($modx) {
    return new EasyComm\EasyComm($modx);
});

6. Процессоры запускаем чуть по другому, нужно указывать класс процессора.
Было:
$modx->runProcessor('object/create', $data, array('processors_path' => $config['processorsPath']));
Стало:
$corePath = $modx->getOption('ec_core_path', $config, $modx->getOption('core_path') . 'components/easycomm/');
$processorsPath = $corePath . 'src/Processors/';
$modx->runProcessor(EasyComm\Processors\Message\Create::class, $data, array('processors_path' => $processorsPath));
Или вот пример для очистки кеша:
$modx->runProcessor('System/ClearCache');

Все эти изменения приводят к тому, что на переписывание компонента ушло около 4-х дней (пусть и не полных).
Обратной совместимостью здесь и не пахнет =)
Если будут вопросы в процессе адаптации ваших дополнений — пишите в комментариях!
Наумов Алексей
23 мая 2020, 11:44
modx.pro
2
2 247
+17

Комментарии: 1

Василий Наумкин
24 мая 2020, 05:00
+1
Это, наверное, первое платное дополнение в истории для MODX 3.

Обратной совместимостью здесь и не пахнет =)
Да и не должно было, по идее. Но вот эти все метания с «а давайте сохраним совместимость» привели к трате лишних пары лет, выгоранию основных разработчиков и нынешней стагнации 3й версии.

Расскажи потом, сколько будет закачек. У pdoTools вот так:
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1