Управление плагинами и событиями из файлов [ExtraPlugins]
Всем привет.
На конец то придумал решения чтобы не лазить в админку для подключения плагинов и подписания их на события.
Это особо актуально, если работаешь через IDE, так как подписывать на события как не крути всегда приходиться через админку.
От проекта к проекту приходиться таскать и заново подключать разные плюшки через плагины, а это рутина)
Всегда удобнее скопировать готовый файлик и прописать строчку кода для подключения каких то плюшек.
Теперь свои плагины можно будет хранить в core/plugins/ModxPlugins/.
Во время установки компонент записывает в директорию /core/plugins/ класс для управления плагинами и событиями.
Каждый новый файл становить плагином, и подключается во время инициализации modx.
После установки, для включения, необходимо переименовать файл core/plugins/events.example на events.php
Компонент проверять наличия файла events.php, и если он есть то плагины подключаются
Как видим выше в файле events.php уже прописан первый плагин.
Через него в админке меняется логотип
Код плагина
То есть видим что каждое новое событие, это целый метод:
файл events.php для нашего файла с классом.
Но все же об одном методе расскажу, он называет setEventValue
Например обновляем опции товара вовремя добавления в корзину.
github
modstore
Пакет яндекс диск
Донаты приветствуются)
На конец то придумал решения чтобы не лазить в админку для подключения плагинов и подписания их на события.
Это особо актуально, если работаешь через IDE, так как подписывать на события как не крути всегда приходиться через админку.
От проекта к проекту приходиться таскать и заново подключать разные плюшки через плагины, а это рутина)
Всегда удобнее скопировать готовый файлик и прописать строчку кода для подключения каких то плюшек.
Теперь свои плагины можно будет хранить в core/plugins/ModxPlugins/.
Во время установки компонент записывает в директорию /core/plugins/ класс для управления плагинами и событиями.
Каждый новый файл становить плагином, и подключается во время инициализации modx.
После установки, для включения, необходимо переименовать файл core/plugins/events.example на events.php
Компонент проверять наличия файла events.php, и если он есть то плагины подключаются
// Содержимое файла core/plugins/events.php
<?php
/**
* Created by Andrey Stepanenko.
* User: webnitros
* Date: 17.08.2021
* Time: 10:29
*/
return [
'ModxPlugins/Web/Logo.php' => [
'OnHandleRequest' => -1, // -1 это приоритет запуска
]
];
Как видим выше в файле events.php уже прописан первый плагин.
core/plugins/ModxPlugins/Web/Logo.php
Через него в админке меняется логотип
Код плагина
<?php
/**
* Created by Andrey Stepanenko.
* User: webnitros
* Date: 17.08.2021
* Time: 8:58
*/
namespace modxPlugins\Web;
use modSystemEvent;
use ModxPlugins\Extra;
class Logo extends Extra
{
/**
* Добавление в корзину
* @param modSystemEvent $event
* @param array $scriptProperties
*/
public function OnHandleRequest(modSystemEvent $event, $scriptProperties = array())
{
if($this->modx->context->key === 'mgr') {
$logo = 'ТУТ длинный base64';
$this->modx->regClientCSS('
<style>
#modx-navbar #modx-home-dashboard {
background-image: url(data:image/png;base64,'.$logo.');
-webkit-background-size: 80px 67px;
background-size: 80px 67px;
width: 95px;
}
</style>');
}
}
}
То есть видим что каждое новое событие, это целый метод:
...
public function OnHandleRequest(modSystemEvent $event, $scriptProperties = array())
{
.....
}
...
Название метода содержит имя события, при добавлении новых методов не забываем добавить событие в файл events.php для нашего файла с классом.
abstract Extra
core/plugins/ModxPlugins/Extra.php
Этот абстрактный класс нужен для расширения плагинов. Пока в нем не особо много фишек.Но все же об одном методе расскажу, он называет setEventValue
Например обновляем опции товара вовремя добавления в корзину.
// события minishop2 https://docs.modx.pro/komponentyi/minishop2/razrabotka/sobyitiya
/**
* Добавление в корзину
* @param modSystemEvent $event
* @param array $scriptProperties
*/
public function msOnBeforeAddToCart(modSystemEvent $event, $scriptProperties = array())
{
$options = $scriptProperties['options'];
$options['new'] = 1;
$this->setEventValue('options', $options);
}
Содержимое метода setEventValuepublic function setEventValue($key,$value)
{
// Возвращаем значения по этому событию
$this->modx->event->returnedValues[$key] = $value;
}
github
modstore
Пакет яндекс диск
Донаты приветствуются)
Поблагодарить автора
Отправить деньги
Комментарии: 9
Не только мне одному пришла в голову подобная мысль. Только мне она пришла чуть раньше — 4 года назад. Middlewares. Сам пользуюсь и другие не жалуются.
Наверно и ты мог бы сэкономить своё время ;)
П.С. Ну а по тексту… Количество ошибок и опечаток расстраивает. Есть хорошее правило у редакторов — вычитывать текст перед публикацией. Событие «Добавление в корзину» меняет лого, хотя файл называется Title.php.
П.П.С. Кстати, обрати внимание, в моём компоненте не нужно прописывать добавленный метод в events.php. Он сразу срабатывает.
Наверно и ты мог бы сэкономить своё время ;)
П.С. Ну а по тексту… Количество ошибок и опечаток расстраивает. Есть хорошее правило у редакторов — вычитывать текст перед публикацией. Событие «Добавление в корзину» меняет лого, хотя файл называется Title.php.
П.П.С. Кстати, обрати внимание, в моём компоненте не нужно прописывать добавленный метод в events.php. Он сразу срабатывает.
Как событие msOnBeforeAddToCart поймать с помощью Middlewares с учетом приоритета запуска?
То есть вот про эти приоритеты
prnt.sc/1qa09wr
Хотя можешь не смотреть))
Уже посмотрел что не как, по этому и не использую Middlewares в проектах.
prnt.sc/1qa09wr
Хотя можешь не смотреть))
Уже посмотрел что не как, по этому и не использую Middlewares в проектах.
на странице компонента на modstore очепятка:
ModxPlugins/Web/Title.php
вместо ModxPlugins/Web/Logo.php
как в данной статье
Поправил, спс
Спасибо, очень удобная вещь.
Решил попробовать компонент, но вышло с трудом из-за некорректной инструкции
Во первых везде написано, что при установке в папке core создаются файлы — по факту они не создаются.
Во вторых в папке самого компонента в core есть папка plugins с описанной структурой, но и там ошибка, в файле events.example вызывается файл Title.php, тогда как в папке ModxPlugins/Web/ лежит Logo.php
В третьих даже если прям там в папке самого компонента переименовать файл events.example в php и исправить Title на Logo один фиг ничего не заработает.
А чтобы заработало нужно самому скопировать из папки компонента папку plugins в папку core, и сделать в ней вышеописанные правки.
Хорошо бы исправить инструкцию, и либо сделать реально чтобы файлы формировались в папке core, либо написать что их надо самим копировать.
И было бы неплохо иметь возможность в системных настройках указывать свой путь для плагинов, и указывать его ещё на этапе установки, чтобы уже первичных набор файлов записался туда.
Во первых везде написано, что при установке в папке core создаются файлы — по факту они не создаются.
Во вторых в папке самого компонента в core есть папка plugins с описанной структурой, но и там ошибка, в файле events.example вызывается файл Title.php, тогда как в папке ModxPlugins/Web/ лежит Logo.php
В третьих даже если прям там в папке самого компонента переименовать файл events.example в php и исправить Title на Logo один фиг ничего не заработает.
А чтобы заработало нужно самому скопировать из папки компонента папку plugins в папку core, и сделать в ней вышеописанные правки.
Хорошо бы исправить инструкцию, и либо сделать реально чтобы файлы формировались в папке core, либо написать что их надо самим копировать.
И было бы неплохо иметь возможность в системных настройках указывать свой путь для плагинов, и указывать его ещё на этапе установки, чтобы уже первичных набор файлов записался туда.
Андрей, а у тебя реально работают приоритеты? Просто я смотрю на код и вижу, что ты создаёшь один виртуальный плагин с id=1000. И не понимаю, как заставить один и тот же плагин сработать в разных приоритетах?
П.С. Сознаюсь, что я не тестировал твой компонент, просто код смотрел. Поэтому и спрашиваю. :)
'eventMap' =>
array (
'OnHandleRequest' =>
array(
1000 => '1000',
3 => '3',
1000 => '1000',
7 => '7',
) ,
);
В индексированном массиве нельзя указывать один и тот же индекс для разных записей.П.С. Сознаюсь, что я не тестировал твой компонент, просто код смотрел. Поэтому и спрашиваю. :)
Сорян. Пропустил
$plugin_id++;
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.