
mFilter
Фасетная фильтрация для MODX 3 с поддержкой SEO URL


Архитектура и подключение JavaScript mFilter.
mFilter использует двухуровневую архитектуру:
┌─────────────────────────────────────────┐
│ mfilter.js │ ← Точка входа, автоинициализация
├─────────────────────────────────────────┤
│ UI Layer │ ← DOM-bindings для SSR
│ (FilterUI.js) │
├─────────────────────────────────────────┤
│ API Core │ ← Headless ядро
│ ApiClient.js │ FilterAPI.js │ hooks.js │
└─────────────────────────────────────────┘Независимое ядро без привязки к DOM:
window.mfilterDOM-привязки для работы с готовой разметкой:
| Файл | Размер | Назначение |
|---|---|---|
core/ApiClient.js | ~3 KB | HTTP-клиент |
core/FilterAPI.js | ~5 KB | API методы |
modules/hooks.js | ~3 KB | Система хуков |
mfilter.headless.js | ~4 KB | Headless точка входа |
ui/FilterUI.js | ~40 KB | UI для SSR |
mfilter.slider.js | ~8 KB | noUiSlider интеграция |
mfilter.js | ~4 KB | Автоинициализация |
Плагин mFilter автоматически подключает скрипты на страницах с фильтрами.
Управление через системную настройку mfilter.register_frontend:
true — автоподключение (по умолчанию)false — отключить, подключать вручную<!-- Базовые стили -->
<link rel="stylesheet" href="/assets/components/mfilter/css/web/mfilter.css">
<!-- API Core (обязательно) -->
<script src="/assets/components/mfilter/js/web/core/ApiClient.js"></script>
<script src="/assets/components/mfilter/js/web/core/FilterAPI.js"></script>
<script src="/assets/components/mfilter/js/web/modules/hooks.js"></script>
<script src="/assets/components/mfilter/js/web/mfilter.headless.js"></script>
<!-- UI Layer (для SSR) -->
<script src="/assets/components/mfilter/js/web/ui/FilterUI.js"></script>
<script src="/assets/components/mfilter/js/web/mfilter.slider.js"></script>
<script src="/assets/components/mfilter/js/web/mfilter.js"></script>Для SPA-приложений:
<script src="/assets/components/mfilter/js/web/core/ApiClient.js"></script>
<script src="/assets/components/mfilter/js/web/core/FilterAPI.js"></script>
<script src="/assets/components/mfilter/js/web/modules/hooks.js"></script>
<script src="/assets/components/mfilter/js/web/mfilter.headless.js"></script>Глобальная конфигурация через window.mfilterConfig:
<script>
window.mfilterConfig = {
apiUrl: '/assets/components/mfilter/api.php',
resourceId: 5, // ID категории
debug: false // Режим отладки
};
</script>Элементы с data-mfilter инициализируются автоматически:
<form data-mfilter data-mfilter-results=".results">
<!-- фильтры -->
</form>// Создать инстанс
const instance = mfilterInit('#my-filter', {
ajax: true,
autoSubmit: true,
autoSubmitDelay: 500
});
// Получить существующий инстанс
const filter = mfilterGet('my-filter');
// Уничтожить инстанс
mfilterDestroy('my-filter');| Атрибут | Описание |
|---|---|
data-mfilter | Маркер для автоинициализации |
data-mfilter-results | CSS-селектор блока результатов |
data-mfilter-pagination | CSS-селектор пагинации |
data-mfilter-ajax | Включить AJAX (true/false) |
data-mfilter-mode | Режим: form или instant |
data-mfilter-auto-submit | Авто-отправка (true/false) |
data-mfilter-delay | Задержка авто-отправки (мс) |
data-mfilter-seo-url | SEO URL (true/false) |
data-mfilter-push-state | Обновлять URL (true/false) |
data-mfilter-scroll-to-results | Скролл к результатам |
data-mfilter-scroll-offset | Отступ скролла (px) |
data-mfilter-debug | Режим отладки |
data-base-url | Базовый URL категории |
data-resource-id | ID ресурса |
| Атрибут | Описание |
|---|---|
data-filter | Ключ фильтра (на блоке) |
data-range="min" | Поле минимума диапазона |
data-range="max" | Поле максимума диапазона |
data-mfilter-slider | Маркер для noUiSlider |
data-mfilter-sort | Элемент сортировки |
data-mfilter-limit | Элемент выбора лимита |
data-mfilter-tpl | Элемент переключения шаблона |
| Событие | Описание | detail |
|---|---|---|
mfilter:ready | API Core инициализирован | { mfilter } |
mfilter:ui:ready | UI инициализирован | { instances } |
mfilter:contentLoaded | Новый контент загружен (AJAX) | { container } |
mfilter:beforeSubmit | Перед отправкой | { state, instance } |
mfilter:afterSubmit | После отправки | { state, instance } |
mfilter:success | Успешный ответ | { response, instance } |
mfilter:error | Ошибка | { error, instance } |
document.addEventListener('mfilter:ui:ready', (e) => {
console.log('Инстансы:', e.detail.instances);
});
document.addEventListener('mfilter:success', (e) => {
console.log('Результаты:', e.detail.response);
});| Объект | Описание |
|---|---|
window.mfilter | API Core (headless) |
window.mfilterHooks | Система хуков |
window.MFilterUI | Конструктор UI |
window.MFilterSlider | API слайдеров |
window.mfilterInit() | Создать инстанс |
window.mfilterGet() | Получить инстанс |
window.mfilterDestroy() | Удалить инстанс |
Для диапазонных фильтров используется noUiSlider.
Подключите noUiSlider до скриптов mFilter:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/nouislider@15/dist/nouislider.min.css">
<script src="https://cdn.jsdelivr.net/npm/nouislider@15/dist/nouislider.min.js"></script>// Создать слайдер вручную
MFilterSlider.create('#my-slider', {
start: [1000, 50000],
range: { min: 0, max: 100000 },
step: 100,
tooltips: true,
format: MFilterSlider.formats.currency
});
// Обновить диапазон
MFilterSlider.updateRange('#my-slider', 0, 200000);
// Установить значения
MFilterSlider.set('#my-slider', [5000, 30000]);MFilterSlider.formats.integer // 12345
MFilterSlider.formats.float // 123.45
MFilterSlider.formats.currency // 12 345 ₽
MFilterSlider.formats.percent // 50%Если jQuery загружен, доступен плагин:
$('#my-filter').mfilter({
ajax: true,
autoSubmit: true
});