
События
Серверные события 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 — [мин, макс]; верхняя граница не больше миллиона
if (isset($values[1])) {
$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. Там же выводит переменную mfilterConfig с адресом API. Подробнее — JavaScript → Подключение.
OnDocFormSave
Срабатывает, когда ресурс сохраняется через процессор: форма ресурса MODX, товар в админке MiniShop3. Параметр — resource.
- Обновляет индекс TV ресурса, если включена настройка
mfilter.tv_index_on_save. - Пересобирает индекс фасетов для товара и сбрасывает кэш значений и счётчиков у страниц каталога, в дереве которых он лежит. Если установлен MiniShop3, только для товаров.
- Если ресурс — страница каталога с набором фильтров, сбрасывает её кэш mFilter.
$resource->save() в обход процессора событие не вызывает и editedon не меняет, поэтому такую правку не увидит ни плагин, ни синхронизация индекса по расписанию. Обновите индекс сами — buildForProducts(), см. Синхронизация индекса фасетов.
OnResourceDelete
Срабатывает при удалении ресурса через процессор. Параметр — resource.
- Убирает ресурс из индекса TV.
- Убирает товар из индекса фасетов.
- Если ресурс был привязан к набору фильтров, перестраивает кэш адресов.
Удаление в MODX — перенос в корзину. Восстановленный из корзины товар в индекс сам не вернётся: сохраните его заново или вызовите buildForProducts().
Удаление прямым запросом к базе событие не вызывает — нужна полная пересборка индекса фасетов. Привязка удалённого ресурса к набору фильтров остаётся в базе, на работу она не влияет.
OnCacheUpdate
Срабатывает при очистке кэша MODX. Очищает кэш адресов фильтров. После смены адреса страницы каталога очистите кэш MODX — иначе адреса фильтров под новым адресом отдают 404.
Кэш mFilter со счётчиками и выборками это событие не очищает. Он сбрасывается:
- по истечении срока из настройки
mfilter.cache_lifetime; - при сохранении страницы каталога или набора фильтров;
- после сборки индекса фасетов;
- целиком — кнопкой «Очистить кэш» на вкладке «Обслуживание».
Кнопка не сбрасывает списки товаров и границы диапазонов, сохранённые в сессии посетителя, — они обновятся при следующей загрузке страницы каталога. Подробнее — Кэширование.
msOnAfterImport
Срабатывает после импорта MiniShop3 из CSV. Параметр stats — итоги импорта: total, created, updated, errors, skipped. Списка изменённых товаров событие не передаёт, поэтому плагин пересобирает индекс фасетов целиком:
если установлен Scheduler, ставит задачу
mfl_rebuild_facet_indexв очередь;если нет — пересобирает сразу, и ответ импорта ждёт окончания пересборки. Если в это время уже идёт другая пересборка, импорт её не ждёт и пишет в журнал, что индекс нужно пересобрать ещё раз:
[mFilter] Facet index rebuild after MS3 import skipped: another rebuild is running. If it started before this import, the products of this import are outside it — rebuild the index once it finishes. Install Scheduler to have rebuilds queued instead of skipped.
Закончив, пересборка сбрасывает кэш значений и счётчиков и, если настроен прогрев, переносит его на ближайший запуск планировщика.
Свой импортёр, который знает изменённые товары, может обновить индекс точечно — см. Синхронизация индекса фасетов.
