
События
Серверные события 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.
$mfilter->getFilterTypesRegistry()->register('sale', new \MySite\SaleFilterType($modx, $mfilter));Полный пример — рецепт Свой тип фильтра.
В $mfilter->getSourceRegistry() тоже можно зарегистрировать источник, но при фильтрации источники из реестра не используются — свой источник появится только в списке источников в админке.
Подменить встроенный тип
register() с именем встроенного типа заменяет его. Так можно поменять поведение, унаследовав стандартный класс:
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);
}
}$mfilter->getFilterTypesRegistry()->register('number', new \MySite\CappedNumberFilterType($modx, $mfilter));OnHandleRequest
Разбирает SEO-адрес фильтра в начале запроса. В менеджере не работает.
- Ставит плейсхолдеры по умолчанию: пустые
mfilter.filtersиmfilter.seo.*. Поэтому шаблон страницы без фильтров их не теряет. - Разбирает адрес. Если адрес не относится к каталогу с фильтрами, дальше ничего не происходит.
- Если адрес с фильтрами не заканчивается
/, поступает по настройкеmfilter.non_canonical_url_handling:404— страница ошибки, по умолчанию;301— редирект на адрес со/; другое значение — ничего не делает. - Заполняет плейсхолдеры фильтров, сортировки, страницы и SEO. Список — Плейсхолдеры.
- Если в адресе есть сегменты фильтров, передаёт запрос странице каталога через
sendForward().
Запросы AJAX идут в api.php и через это событие не проходят.
OnLoadWebDocument
Если включена настройка mfilter.register_frontend, подключает файлы из mfilter.frontend_assets: стили — в <head>, скрипты — в конец страницы с defer. Подробнее — JavaScript → Подключение.
OnDocFormSave
Срабатывает, когда ресурс сохраняется через процессор: форма ресурса MODX, товар в админке MiniShop3. Параметр — resource.
- Обновляет индекс TV ресурса, если включена настройка
mfilter.tv_index_on_save. - Пересобирает индекс фасетов для товара. Если установлен MiniShop3, только для товаров.
- Если ресурс — страница каталога с набором фильтров, сбрасывает её кэш mFilter.
$resource->save() в обход процессора событие не вызывает. Такие правки индекс фасетов подхватит задача синхронизации — см. Синхронизация индекса фасетов.
OnResourceDelete
Срабатывает при удалении ресурса через процессор. Параметр — resource.
- Убирает ресурс из индекса TV.
- Убирает товар из индекса фасетов.
- Если ресурс был привязан к набору фильтров, перестраивает кэш адресов.
Удаление прямым запросом к базе событие не вызывает — нужна полная пересборка индекса фасетов. Привязка удалённого ресурса к набору фильтров остаётся в базе, на работу она не влияет.
OnCacheUpdate
Срабатывает при очистке кэша MODX. Очищает кэш адресов фильтров.
Кэш mFilter с числами и выборками этим событием не очищается: он живёт по настройке mfilter.cache_lifetime и сбрасывается при сохранении страницы каталога. Очистить его полностью — кнопка «Очистить кэш» на вкладке «Обслуживание».
msOnAfterImport
Срабатывает после импорта MiniShop3 из CSV. Параметр stats — счётчики total, created, updated, errors, skipped. Списка изменённых товаров событие не передаёт, поэтому плагин пересобирает индекс фасетов целиком:
- если установлен Scheduler, ставит задачу
mfl_rebuild_facet_indexв очередь; - если нет — пересобирает сразу, и ответ импорта ждёт окончания пересборки.
Свой импортёр, который знает изменённые товары, может обновить индекс точечно — см. Синхронизация индекса фасетов.
