За обновлениями можно следить в telegram-канале https://t.me/quasiart

Что такое плагин?

Между плагином и сниппетом очень много общего. Как и сниппет, плагин содержит код на PHP. Разница кроется в способе вызова: если вызов сниппета определяется местом, где вы указали его тег (в шаблоне, чанке, другом сниппете или ресурсе), то плагин может вызываться при срабатывании определённых системных событий (обработка запроса, очистка кэша, сохранение ресурса, вывод страницы и т. д.). Список системных событий можно посмотреть здесь .

Что за системные события?

Во время работы MODX срабатывают определённые события. И за этими событиями могут быть закреплены плагины. За каждым событием может быть закреплено неопределённое количество плагинов, приоритет запуска которых настраивается.

Обработка событий

Поведение плагина зависит от типа события: для каких-то событий нужно возвращать значение через оператор return, для других — обращаться к данным и изменять их по ссылке.

Узнать название события можно следующим способом:

$eventName = $modx->event->name;

Пример

Впервые мне пришлось написать плагин для новостей на одном сайте. Суть в том, чтобы для изображений внутри статьи автоматически создавались миниатюры. Допустим, есть статья, внутри которой 5 изображений с определённым классом, а в атрибуте src указан путь до оригинала изображения. Написанный мной плагин перед выводом отбирает все теги изображения с определённым классом и подменяет у них значение атрибута src на адрес созданной миниатюры. Миниатюра создаётся с помощью phpThumb. Код далеко не идеальный, но пока нареканий не было.

$content = $modx->resource->get('content');
preg_match_all('/]+>/im', $content, $result);
if (isset($result[0]) && count($result[0]) > 0) {
    $images = $result[0];
    foreach ($images as $image) {
        if (containResizeClass($image)) {
            $imageLink = genThumb($image);
            $content = str_replace($image, $imageLink, $content);
        }
    }
}
$modx->resource->set('content', $content);

Итак, что же здесь происходит? Сначала в переменную $content копируется конечный HTML-код. Затем в массив $result заносятся результаты поиска по регулярному выражению. В данном случае искались абсолютно все изображения страницы. Затем скрипт в цикле начинает обрабатывать все полученные изображения. Если тег изображения содержит определённый класс (проверка внутри функции containResizeClass), то в переменную $imageThumb заносится тег с адресом миниатюры, а затем тег оригинала заменяется на тег миниатюры.

Таким образом, если на странице есть следующий тег,

<img alt="Котики" class="thumb_me article_image_left" src="assets/images/fat_cat.jpg" />

то с помощью плагина можно автоматически заменять этот код на всё, что угодно:

<a class="fancybox-thumbs" data-fancybox-group="news_thumb" href="fat_cat.jpg">
<img alt="Котики" class="thumb_me article_image_left" src="/assets/components/phpthumbof/cache/fat_cat.2b43bb836baec1488cd299.jpg" />
</a>

В последней строке идёт замена содержимого страницы с оригинального на то, что мы получили после обработки изображений. Код функций нет смысла показывать, так как это статья про плагины, а не строковые функции PHP или MODX API. Данный плагин запускается при срабатывании события OnLoadWebDocument.

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

В качестве ещё одного примера могу привести более простой плагин для минификации HTML страницы. 

$html = &$modx->resource->_output;
$html = preg_replace('|\s+|', ' ', $html);
$modx->resource->set('content', $html);

Данный сниппет привязан к событию «OnWebPagePrerender».

Примеры плагинов