Управление плагинами и событиями из файлов [ExtraPlugins]

Всем привет.

На конец то придумал решения чтобы не лазить в админку для подключения плагинов и подписания их на события.

Это особо актуально, если работаешь через 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);

    }
Содержимое метода setEventValue
public function setEventValue($key,$value)
    {
        // Возвращаем значения по этому событию
        $this->modx->event->returnedValues[$key] = $value;
    }


github
modstore
Пакет яндекс диск

Донаты приветствуются)
Андрей Степаненко
18 августа 2021, 08:52
modx.pro
6
1 817
+8
Поблагодарить автора Отправить деньги

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

Сергей Шлоков
18 августа 2021, 12:40
0
Не только мне одному пришла в голову подобная мысль. Только мне она пришла чуть раньше — 4 года назад. Middlewares. Сам пользуюсь и другие не жалуются.
Наверно и ты мог бы сэкономить своё время ;)

П.С. Ну а по тексту… Количество ошибок и опечаток расстраивает. Есть хорошее правило у редакторов — вычитывать текст перед публикацией. Событие «Добавление в корзину» меняет лого, хотя файл называется Title.php.

П.П.С. Кстати, обрати внимание, в моём компоненте не нужно прописывать добавленный метод в events.php. Он сразу срабатывает.
    Андрей Степаненко
    18 августа 2021, 12:57
    0
    Как событие msOnBeforeAddToCart поймать с помощью Middlewares с учетом приоритета запуска?
      Андрей Степаненко
      18 августа 2021, 13:15
      0
      То есть вот про эти приоритеты
      prnt.sc/1qa09wr

      Хотя можешь не смотреть))
      Уже посмотрел что не как, по этому и не использую Middlewares в проектах.
      Алексей Соин
      24 августа 2021, 13:37
      0
      на странице компонента на modstore очепятка:

      ModxPlugins/Web/Title.php
      вместо
      ModxPlugins/Web/Logo.php
      как в данной статье
      Роман
      24 августа 2021, 14:13
      0
      Спасибо, очень удобная вещь.
        Семён Кудрявцев
        02 октября 2021, 11:15
        0
        Решил попробовать компонент, но вышло с трудом из-за некорректной инструкции
        Во первых везде написано, что при установке в папке core создаются файлы — по факту они не создаются.
        Во вторых в папке самого компонента в core есть папка plugins с описанной структурой, но и там ошибка, в файле events.example вызывается файл Title.php, тогда как в папке ModxPlugins/Web/ лежит Logo.php
        В третьих даже если прям там в папке самого компонента переименовать файл events.example в php и исправить Title на Logo один фиг ничего не заработает.
        А чтобы заработало нужно самому скопировать из папки компонента папку plugins в папку core, и сделать в ней вышеописанные правки.
        Хорошо бы исправить инструкцию, и либо сделать реально чтобы файлы формировались в папке core, либо написать что их надо самим копировать.
        И было бы неплохо иметь возможность в системных настройках указывать свой путь для плагинов, и указывать его ещё на этапе установки, чтобы уже первичных набор файлов записался туда.
          Сергей Шлоков
          19 ноября 2021, 21:15
          0
          Андрей, а у тебя реально работают приоритеты? Просто я смотрю на код и вижу, что ты создаёшь один виртуальный плагин с id=1000. И не понимаю, как заставить один и тот же плагин сработать в разных приоритетах?
          'eventMap' => 
            array (
              'OnHandleRequest' => 
                array(
                   1000 => '1000',
                   3 => '3',
                   1000 => '1000',
                   7 => '7',
                ) ,
            );
          В индексированном массиве нельзя указывать один и тот же индекс для разных записей.

          П.С. Сознаюсь, что я не тестировал твой компонент, просто код смотрел. Поэтому и спрашиваю. :)
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          9