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-х дней (пусть и не полных).
Обратной совместимостью здесь и не пахнет =)
Если будут вопросы в процессе адаптации ваших дополнений — пишите в комментариях!
Комментарии: 1
Это, наверное, первое платное дополнение в истории для MODX 3.
Расскажи потом, сколько будет закачек. У pdoTools вот так:
Обратной совместимостью здесь и не пахнет =)Да и не должно было, по идее. Но вот эти все метания с «а давайте сохраним совместимость» привели к трате лишних пары лет, выгоранию основных разработчиков и нынешней стагнации 3й версии.
Расскажи потом, сколько будет закачек. У pdoTools вот так:
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.