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

JavaScript

Архитектура и подключение JavaScript mFilter.

Архитектура

mFilter использует двухуровневую архитектуру:

┌─────────────────────────────────────────┐
│              mfilter.js                  │  ← Точка входа, автоинициализация
├─────────────────────────────────────────┤
│              UI Layer                    │  ← DOM-bindings для SSR
│            (FilterUI.js)                 │
├─────────────────────────────────────────┤
│             API Core                     │  ← Headless ядро
│  ApiClient.js │ FilterAPI.js │ hooks.js │
└─────────────────────────────────────────┘

API Core (Headless)

Независимое ядро без привязки к DOM:

  • ApiClient.js — HTTP-клиент для запросов к серверу
  • FilterAPI.js — методы работы с фильтрами
  • hooks.js — система хуков для расширения
  • mfilter.headless.js — инициализация и экспорт window.mfilter

UI Layer (SSR)

DOM-привязки для работы с готовой разметкой:

  • FilterUI.js — управление формой, результатами, пагинацией
  • mfilter.slider.js — интеграция с noUiSlider
  • mfilter.js — автоинициализация

Файлы

ФайлРазмерНазначение
core/ApiClient.js~3 KBHTTP-клиент
core/FilterAPI.js~5 KBAPI методы
modules/hooks.js~3 KBСистема хуков
mfilter.headless.js~4 KBHeadless точка входа
ui/FilterUI.js~40 KBUI для SSR
mfilter.slider.js~8 KBnoUiSlider интеграция
mfilter.js~4 KBАвтоинициализация

Подключение

Автоматическое (по умолчанию)

Плагин mFilter автоматически подключает скрипты на страницах с фильтрами.

Управление через системную настройку mfilter.register_frontend:

  • true — автоподключение (по умолчанию)
  • false — отключить, подключать вручную

Ручное подключение

html
<!-- Базовые стили -->
<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>

Минимальный набор (только Headless)

Для SPA-приложений:

html
<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:

html
<script>
window.mfilterConfig = {
    apiUrl: '/assets/components/mfilter/api.php',
    resourceId: 5,      // ID категории
    debug: false        // Режим отладки
};
</script>

Инициализация

Автоматическая

Элементы с data-mfilter инициализируются автоматически:

html
<form data-mfilter data-mfilter-results=".results">
    <!-- фильтры -->
</form>

Ручная

javascript
// Создать инстанс
const instance = mfilterInit('#my-filter', {
    ajax: true,
    autoSubmit: true,
    autoSubmitDelay: 500
});

// Получить существующий инстанс
const filter = mfilterGet('my-filter');

// Уничтожить инстанс
mfilterDestroy('my-filter');

Data-атрибуты

На контейнере/форме

АтрибутОписание
data-mfilterМаркер для автоинициализации
data-mfilter-resultsCSS-селектор блока результатов
data-mfilter-paginationCSS-селектор пагинации
data-mfilter-ajaxВключить AJAX (true/false)
data-mfilter-modeРежим: form или instant
data-mfilter-auto-submitАвто-отправка (true/false)
data-mfilter-delayЗадержка авто-отправки (мс)
data-mfilter-seo-urlSEO 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-idID ресурса

На элементах

АтрибутОписание
data-filterКлюч фильтра (на блоке)
data-range="min"Поле минимума диапазона
data-range="max"Поле максимума диапазона
data-mfilter-sliderМаркер для noUiSlider
data-mfilter-sortЭлемент сортировки
data-mfilter-limitЭлемент выбора лимита
data-mfilter-tplЭлемент переключения шаблона

События DOM

СобытиеОписаниеdetail
mfilter:readyAPI Core инициализирован{ mfilter }
mfilter:ui:readyUI инициализирован{ instances }
mfilter:contentLoadedНовый контент загружен (AJAX){ container }
mfilter:beforeSubmitПеред отправкой{ state, instance }
mfilter:afterSubmitПосле отправки{ state, instance }
mfilter:successУспешный ответ{ response, instance }
mfilter:errorОшибка{ error, instance }

Подписка на события

javascript
document.addEventListener('mfilter:ui:ready', (e) => {
    console.log('Инстансы:', e.detail.instances);
});

document.addEventListener('mfilter:success', (e) => {
    console.log('Результаты:', e.detail.response);
});

Глобальные объекты

ОбъектОписание
window.mfilterAPI Core (headless)
window.mfilterHooksСистема хуков
window.MFilterUIКонструктор UI
window.MFilterSliderAPI слайдеров
window.mfilterInit()Создать инстанс
window.mfilterGet()Получить инстанс
window.mfilterDestroy()Удалить инстанс

noUiSlider

Для диапазонных фильтров используется noUiSlider.

Подключение

Подключите noUiSlider до скриптов mFilter:

html
<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>

Кастомизация слайдера

javascript
// Создать слайдер вручную
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]);

Форматы

javascript
MFilterSlider.formats.integer   // 12345
MFilterSlider.formats.float     // 123.45
MFilterSlider.formats.currency  // 12 345 ₽
MFilterSlider.formats.percent   // 50%

jQuery (опционально)

Если jQuery загружен, доступен плагин:

javascript
$('#my-filter').mfilter({
    ajax: true,
    autoSubmit: true
});