Управление плагинами и событиями из файлов [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
5
604
+8
Поблагодарить автора Отправить деньги

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

Сергей Шлоков
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
      Спасибо, очень удобная вещь.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        6