Skip to content
mFilter
mFilter
Фасетная фильтрация для MODX 3 с поддержкой SEO URL
  1. Компоненты
  2. mFilter
  3. Разработка
  4. События

События

Системные события MODX для расширения mFilter.

Плагин mFilter

Плагин обрабатывает следующие события:

СобытиеОписание
OnHandleRequestРоутинг SEO URL
OnLoadWebDocumentПодключение CSS/JS
OnDocFormSaveИнвалидация кэша
OnCacheUpdateОчистка кэша mFilter
OnResourceDeleteОчистка связанных данных

OnMFilterInit

Срабатывает при инициализации сервиса mFilter. Используется для:

  • Регистрации кастомных типов фильтров
  • Регистрации источников данных
  • Модификации конфигурации

Параметры

ПараметрТипОписание
mfilterMFilterЭкземпляр главного класса

Пример: Регистрация типа фильтра

php
<?php
// Плагин на событие OnMFilterInit

/** @var MFilter\MFilter $mfilter */
$mfilter = $modx->event->params['mfilter'];

// Регистрация своего типа фильтра
$mfilter->getFilterTypeRegistry()->register(
    'mytype',
    new MyNamespace\MyFilterType($modx)
);

Пример: Регистрация источника данных

php
<?php
/** @var MFilter\MFilter $mfilter */
$mfilter = $modx->event->params['mfilter'];

// Регистрация источника для кастомной таблицы
$mfilter->getSourceRegistry()->register(
    'myproducts',
    new MyNamespace\MyProductsSource($modx, $mfilter)
);

OnHandleRequest

Обрабатывает входящий запрос, определяет SEO URL фильтров.

Логика работы

  1. Получает REQUEST_URI
  2. Пытается распарсить как SEO URL фильтра
  3. Если успешно:
    • Устанавливает плейсхолдеры фильтров
    • Вызывает sendForward() на целевой ресурс

Плейсхолдеры после роутинга

ПлейсхолдерОписание
mfilter.filtersМассив активных фильтров
mfilter.sortСортировка (price-asc)
mfilter.sortByПоле сортировки
mfilter.sortDirНаправление
mfilter.pageНомер страницы
mfilter.limitЛимит на странице
mfilter.seo.h1SEO H1
mfilter.seo.titleSEO Title
mfilter.seo.descriptionSEO Description
mfilter.seo.canonicalCanonical URL
mfilter.seo.noindexФлаг noindex

OnLoadWebDocument

Подключает фронтенд-ассеты (CSS/JS) на страницы.

Управление

Отключить автоподключение: mfilter.register_frontend = false

Кастомизация списка файлов

Системная настройка mfilter.frontend_assets:

json
[
    "[[+cssUrl]]web/mfilter.css",
    "[[+jsUrl]]web/core/ApiClient.js",
    "[[+jsUrl]]web/mfilter.js"
]

OnDocFormSave

Срабатывает при сохранении ресурса.

Действия

  • Инвалидирует кэш страницы если она связана с фильтрами
  • Перестраивает кэш роутера если изменился URI

OnCacheUpdate

Срабатывает при очистке кэша MODX.

Действия

  • Очищает кэш роутера mFilter
  • Очищает кэш результатов

OnResourceDelete

Срабатывает при удалении ресурса.

Действия

  • Удаляет связанную конфигурацию PageConfig
  • Удаляет привязки FilterSet
  • Перестраивает кэш роутера

Создание плагина

Базовый шаблон

php
<?php
/**
 * My mFilter Extension
 *
 * Events: OnMFilterInit
 */

if ($modx->event->name !== 'OnMFilterInit') {
    return;
}

/** @var MFilter\MFilter $mfilter */
$mfilter = $modx->event->params['mfilter'];

// Ваш код расширения

Регистрация плагина

  1. Создайте файл в core/components/mypackage/elements/plugins/
  2. Зарегистрируйте плагин в MODX
  3. Привяжите к событию OnMFilterInit

Примеры расширений

Логирование фильтрации

php
<?php
// Плагин: mFilterLogger
// События: OnMFilterInit

$mfilter = $modx->event->params['mfilter'];

// Добавляем хук на применение фильтров
$mfilter->getFilter()->addHook('afterApply', function($result, $params) use ($modx) {
    $modx->log(
        modX::LOG_LEVEL_ERROR,
        '[mFilter] Applied filters: ' . json_encode($params['filters']) .
        ', Results: ' . $result['total']
    );
});

Кастомная валидация

php
<?php
// Плагин: mFilterValidator
// События: OnMFilterInit

$mfilter = $modx->event->params['mfilter'];

// Валидация перед применением
$mfilter->getFilter()->addHook('beforeApply', function(&$params) use ($modx) {
    // Ограничить максимальную цену
    if (isset($params['filters']['price']['max'])) {
        if ($params['filters']['price']['max'] > 1000000) {
            $params['filters']['price']['max'] = 1000000;
        }
    }
});

Интеграция с аналитикой

php
<?php
// Плагин: mFilterAnalytics
// События: OnMFilterInit

$mfilter = $modx->event->params['mfilter'];

$mfilter->getFilter()->addHook('afterApply', function($result, $params) use ($modx) {
    // Отправка в Google Analytics через Measurement Protocol
    $data = [
        'v' => 1,
        'tid' => 'UA-XXXXX-Y',
        'cid' => session_id(),
        't' => 'event',
        'ec' => 'filter',
        'ea' => 'apply',
        'el' => json_encode($params['filters']),
        'ev' => $result['total']
    ];

    // Асинхронная отправка
    $ch = curl_init('https://www.google-analytics.com/collect');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
});