• Блог
  • Загрузка плагинов из файлов

Продолжаю вчерашнюю тему про загрузку элементов из файлов. Теперь вот дошла очередь и до плагинов. Немного с ними поэкспериментировав, нашёл более менее удобный способ и для них. Получилось на мой взгляд вполне даже ничего.

Инструкция

Постараюсь описать покороче и попроще.

Шаг 1. Создаем файл плагина. Положить его можно куда угодно, но удобнее держать все элементы в одном хранилище. Оно у нас по-умолчанию в core/elements/. Плагины будут лежать в подпапке plugins. Создаём в ней файл plugin.php. Путь получается core/elements/plugins/plugin.php.

Содержимое будет следующее

<?php
switch ($modx->event->name) {
    case 'OnMODXInit':
        if (!file_exists(MODX_BASE_PATH . $this->static_file)) break;
        //1. Указываем события
        $events = array('OnWebPagePrerender');

        foreach ($events as $event) {
            $modx->eventMap[$event][$this->id] = $this->id;
        }
        //2. Определяем параметры плагина
        $props = array();

        $content = @file_get_contents(MODX_BASE_PATH . $this->static_file) . "\nreturn;";
        $modx->pluginCache[$this->id]['properties'] = $props;
        $modx->pluginCache[$this->id]['plugincode'] = $content;
        $modx->pluginCache[$this->id]['disabled'] = 0;  // 1 - выключить плагин, 0 - включить

        $includeFilename = $modx->getCachePath() . 'includes/' . $this->getScriptCacheKey(). '.include.cache.php';
        file_put_contents($includeFilename, $content);

	// Сюда можно добавить свой код для события OnMODXInit
	/* код */
        break;
    // 3. Ниже пишем код для добавленных событий
    case 'OnWebPagePrerender':
	// Для проверки работоспособности выводим сообщение в журнал ошибок.
        $modx->log(1,'Сообщение в журнале ошибок.');
        break;
}

В событии OnMODXInit прописана вся логика. В комментариях подсказки.

Добавляем в массив $events нужные события. Если нужно, указываем параметры плагина. Я никогда не пользовался этим. А дальше работаем в привычном режиме — указываем case с нужными событиями, прописываем логику и т.д. Что удобно, плагин можно тут же отключить, указав disabled = 1.

Шаг 2. В админке создаём плагин с одной единственной строкой:

<?php
if (!empty($this->static_file) && file_exists($this->static_file)) include_once $this->static_file;

Отмечаем для него событие OnMODXInit. Дальше нужно привязать файл к плагину:

  1. Отмечаем чекбокс «Статичный файл».
  2. В открывшемся поле выбираем наш файл или прописываем руками (core/elements/plugins/plugin.php).
  3. Убираем чекбокс «Статичный файл».
  4. Сохраняем плагин.

Для чего это нужно? Чтобы сохранить путь к статическому файлу в плагине. А чекбокс убираем, чтобы он не синхронизировал файл с базой.

В принципе, можно в базе в таблице modx_site_plugins у нашего плагина в поле static_file прописать путь к файлу — «core/elements/plugins/plugin.php». Кому как удобнее.

Вот в общем-то и всё. Теперь можно спокойно кодить в любимом IDE редакторе, всё изменения сразу же применяются. По-моему, получилось достаточно просто.

П.С. Сразу оговорюсь, что я тестировал только на фронте. Но по идее всё должно работать и в бэкэнде.

Заключение

Теперь вся разработка вынесена наружу. В админку теперь нужно заходить только для того, чтобы связать шаблоны и плагины с файлами. Но это разовое мероприятие.

Я использую описанную концепцию на этом сайте. Реально, очень удобно. В админке остались только элементы установленных пакетов. Все мои элементы теперь хранятся на диске. Скорость загрузки страниц вообще не изменилась. Админка у меня теперь только для контента.

0   3455

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.