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

События

Серверные события MODX, на которые подписан плагин mFilter, и собственное событие OnMFilterInit для расширения. События в браузере — в JS API, перехват запросов фильтрации — хуки Headless API.

Обзор

СобытиеЧто делает плагин mFilter
OnMFilterInitСобственное событие: регистрация своих типов фильтров
OnHandleRequestРазбирает SEO-адрес фильтра и передаёт запрос странице каталога
OnLoadWebDocumentПодключает стили и скрипты
OnDocFormSaveОбновляет индекс TV и индекс фасетов товара, сбрасывает кэш страницы каталога
OnResourceDeleteУбирает товар из индекса TV и индекса фасетов
OnCacheUpdateОчищает кэш адресов фильтров
msOnAfterImportПолная пересборка индекса фасетов после импорта MiniShop3 из CSV

OnMFilterInit

Срабатывает один раз за запрос — когда создаётся сервис mfilter, до первого обращения к реестрам. Параметр события — mfilter, экземпляр MFilter\MFilter; в плагине он доступен переменной $mfilter.

php
$mfilter->getFilterTypesRegistry()->register('sale', new \MySite\SaleFilterType($modx, $mfilter));

Полный пример — рецепт Свой тип фильтра.

В $mfilter->getSourceRegistry() тоже можно зарегистрировать источник, но при фильтрации источники из реестра не используются — свой источник появится только в списке источников в админке.

Подменить встроенный тип

register() с именем встроенного типа заменяет его. Так можно поменять поведение, унаследовав стандартный класс:

php
namespace MySite;

use MFilter\Handlers\FilterTypes\NumberFilterType;

class CappedNumberFilterType extends NumberFilterType
{
    public function buildQuery($query, string $filterKey, array $values, array $config)
    {
        // $values — [мин, макс]; верхняя граница не больше миллиона
        $values[1] = min((float) $values[1], 1000000);

        return parent::buildQuery($query, $filterKey, $values, $config);
    }
}
php
$mfilter->getFilterTypesRegistry()->register('number', new \MySite\CappedNumberFilterType($modx, $mfilter));

OnHandleRequest

Разбирает SEO-адрес фильтра в начале запроса. В менеджере не работает.

  1. Ставит плейсхолдеры по умолчанию: пустые mfilter.filters и mfilter.seo.*. Поэтому шаблон страницы без фильтров их не теряет.
  2. Разбирает адрес. Если адрес не относится к каталогу с фильтрами, дальше ничего не происходит.
  3. Если адрес с фильтрами не заканчивается /, поступает по настройке mfilter.non_canonical_url_handling: 404 — страница ошибки, по умолчанию; 301 — редирект на адрес со /; другое значение — ничего не делает.
  4. Заполняет плейсхолдеры фильтров, сортировки, страницы и SEO. Список — Плейсхолдеры.
  5. Если в адресе есть сегменты фильтров, передаёт запрос странице каталога через sendForward().

Запросы AJAX идут в api.php и через это событие не проходят.

OnLoadWebDocument

Если включена настройка mfilter.register_frontend, подключает файлы из mfilter.frontend_assets: стили — в <head>, скрипты — в конец страницы с defer. Подробнее — JavaScript → Подключение.

OnDocFormSave

Срабатывает, когда ресурс сохраняется через процессор: форма ресурса MODX, товар в админке MiniShop3. Параметр — resource.

  1. Обновляет индекс TV ресурса, если включена настройка mfilter.tv_index_on_save.
  2. Пересобирает индекс фасетов для товара. Если установлен MiniShop3, только для товаров.
  3. Если ресурс — страница каталога с набором фильтров, сбрасывает её кэш mFilter.

$resource->save() в обход процессора событие не вызывает. Такие правки индекс фасетов подхватит задача синхронизации — см. Синхронизация индекса фасетов.

OnResourceDelete

Срабатывает при удалении ресурса через процессор. Параметр — resource.

  1. Убирает ресурс из индекса TV.
  2. Убирает товар из индекса фасетов.
  3. Если ресурс был привязан к набору фильтров, перестраивает кэш адресов.

Удаление прямым запросом к базе событие не вызывает — нужна полная пересборка индекса фасетов. Привязка удалённого ресурса к набору фильтров остаётся в базе, на работу она не влияет.

OnCacheUpdate

Срабатывает при очистке кэша MODX. Очищает кэш адресов фильтров.

Кэш mFilter с числами и выборками этим событием не очищается: он живёт по настройке mfilter.cache_lifetime и сбрасывается при сохранении страницы каталога. Очистить его полностью — кнопка «Очистить кэш» на вкладке «Обслуживание».

msOnAfterImport

Срабатывает после импорта MiniShop3 из CSV. Параметр stats — счётчики total, created, updated, errors, skipped. Списка изменённых товаров событие не передаёт, поэтому плагин пересобирает индекс фасетов целиком:

  • если установлен Scheduler, ставит задачу mfl_rebuild_facet_index в очередь;
  • если нет — пересобирает сразу, и ответ импорта ждёт окончания пересборки.

Свой импортёр, который знает изменённые товары, может обновить индекс точечно — см. Синхронизация индекса фасетов.