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

JavaScript ​

Скрипты mFilter подключаются сами и сами находят форму фильтров — для обычного каталога здесь ничего делать не нужно.

Управлять фильтром из своего кода — JS API. Работать с сервером без формы, из своего приложения — Headless API.

Подключение ​

Стили и скрипты добавляет плагин mFilter — на каждую страницу сайта, даже без формы фильтров. Список файлов — в системной настройке mfilter.frontend_assets, скрипты встают в конец страницы с атрибутом defer.

Чтобы подключать файлы самому, выключите настройку mfilter.register_frontend и добавьте в шаблон ресурса те же файлы в том же порядке:

html
<link rel="stylesheet" href="/assets/components/mfilter/css/web/vendor/nouislider/nouislider.min.css">
<link rel="stylesheet" href="/assets/components/mfilter/css/web/mfilter.css">

<script src="/assets/components/mfilter/js/web/vendor/nouislider/nouislider.min.js" defer></script>
<script src="/assets/components/mfilter/js/web/core/ApiClient.js" defer></script>
<script src="/assets/components/mfilter/js/web/core/FilterAPI.js" defer></script>
<script src="/assets/components/mfilter/js/web/modules/hooks.js" defer></script>
<script src="/assets/components/mfilter/js/web/mfilter.headless.js" defer></script>
<script src="/assets/components/mfilter/js/web/ui/FilterUI.js" defer></script>
<script src="/assets/components/mfilter/js/web/ui/SelectedFilters.js" defer></script>
<script src="/assets/components/mfilter/js/web/mfilter.slider.js" defer></script>
<script src="/assets/components/mfilter/js/web/mfilter.js" defer></script>

Порядок не меняйте: mfilter.js запускает форму и рассчитывает, что остальные файлы уже загружены. После обновления mFilter сверьте список с настройкой mfilter.frontend_assets — в новых версиях в неё добавляются файлы.

Скрипты шлют запросы на /assets/components/mfilter/api.php. С выключенной mfilter.register_frontend плагин не выводит адрес API, поэтому на сайте в подкаталоге или с другим assets_url задайте его перед скриптами сами:

fenom
<script>var mfilterConfig = { apiUrl: '{$_modx->config.assets_url}components/mfilter/api.php' };</script>

Настройки формы ​

Поведение формы задают data-атрибуты тега <form>. Сниппет mFilterForm выводит свои атрибуты переменной {$formAttrs} в чанке формы — параметр &tplOuter, по умолчанию mfilter.form. В своей копии чанка оставьте переменную и допишите нужные атрибуты рядом:

fenom
<form{$formAttrs} data-mfilter-pagination-mode="loadmore">

Три атрибута mFilterForm выводит сам — их меняют параметрами сниппета:

  • data-mfilter-mode — параметр &ajaxMode. При включённой автоотправке режим всегда instant.
  • data-mfilter-auto-submit — параметр &autoSubmit, по умолчанию — настройка mfilter.auto_submit.
  • data-mfilter-delay — параметр &autoSubmitDelay, по умолчанию — настройка mfilter.auto_submit_delay.

Не дописывайте в чанк второй такой же атрибут: из двух одинаковых браузер учитывает только первый. Это касается и служебных атрибутов из {$formAttrs}: id, class, method, action, адресов, разделителей, текущих фильтров и data-mfilter-debug при включённой настройке mfilter.debug_profiler. id и class формы меняют параметры &formId и &formClass — см. mFilterForm.

Так выглядит тег стандартного чанка формы, когда ничего не выбрано:

html
<form id="mfilter-form"
      class="mfilter-form"
      method="POST"
      action="bytovaya-tehnika/"
      data-mfilter="true"
      data-mfilter-mode="instant"
      data-mfilter-auto-submit="true"
      data-mfilter-delay="300"
      data-mfilter-action="/assets/components/mfilter/api.php"
      data-resource-id="152148"
      data-base-url="/bytovaya-tehnika/"
      data-mfilter-url-separator="--"
      data-mfilter-values-separator="-or-"
      data-mfilter-active-filters="{}">

data-mfilter-mode, data-mfilter-auto-submit и data-mfilter-delay задают параметры сниппета, остальное — служебные атрибуты.

«По умолчанию» в таблице — значение, когда атрибута нет. «Опция» — то же название для формы, созданной вручную. Атрибут-переключатель выключается только значением "false", любое другое, даже пустое, его включает.

АтрибутОпцияПо умолчаниюЧто задаёт
data-mfilter-modeajaxModeforminstant — следить за полями формы. Без этого не работают автоотправка и событие mfilter:change
data-mfilter-auto-submitautoSubmitfalseОтправлять запрос при изменении поля
data-mfilter-delayautoSubmitDelay500Задержка автоотправки, мс
data-mfilter-ajaxajaxtruefalse — кнопка отправки формы и ссылки пагинации перезагружают страницу. Автоотправка, сортировка, число на странице и JS API по-прежнему обновляют выдачу без перезагрузки
data-mfilter-seo-urlseoUrltruefalse — при загрузке читать фильтры из параметров адреса, а не из SEO-адреса. Адрес после фильтрации всё равно SEO: его строит сервер
data-mfilter-push-statepushStatetrueМенять адрес страницы и историю браузера
data-mfilter-reset-pageresetPagetrueВозвращаться на первую страницу при смене фильтров
data-mfilter-scroll-to-resultsscrollToResultstrueПрокручивать к результатам после обновления
data-mfilter-scroll-offsetscrollOffset100Отступ прокрутки сверху, px
data-mfilter-paginationpaginationSelector.mfilter-paginationКуда вставлять пагинацию
data-mfilter-pagination-modepaginationModelinkslinks, loadmore или infinite — см. Пагинация
data-mfilter-loading-overlayloadingOverlaytrueДобавлять класс active элементу .mfilter-overlay на время запроса. В стандартных чанках этого элемента нет — см. Индикатор загрузки
data-mfilter-debugdebugfalseПредупреждения о разметке в консоли браузера и замеры запроса в блоке .mfilter-profiler
—resultsSelector.mfilter-resultsКуда вставлять карточки
—totalSelector.mfilter-totalГде обновлять число найденных товаров
—emptyResultsSelector.mfilter-emptyБлок «ничего не найдено»
—profilerSelector.mfilter-profilerКуда выводить замеры при debug
—infiniteOffset200За сколько пикселей до конца выдачи подгружать следующую страницу при infinite
—loadingClassmfilter-loadingКласс формы на время запроса

Слайдер диапазона ​

Слайдер у числового фильтра строит библиотека noUiSlider, она входит в mFilter. Скрипт находит элемент с атрибутом data-mfilter-slider и связывает его с полями data-range="min" и data-range="max". Поля ищутся внутри родителя слайдера, поэтому все три элемента должны лежать в общем блоке.

Разметка — стандартный чанк mfilter.slider, параметр &tplSlider сниппета mFilterForm. Чтобы настроить слайдер, допишите атрибуты элементу слайдера в своей копии чанка:

fenom
<div data-mfilter-slider data-key="{$key}" data-min="{$min}" data-max="{$max}" data-step="100" data-pips="true"></div>
АтрибутБез атрибутаЧто задаёт
data-stepШаг подбирается сам — до ста шагов на весь диапазонШаг ручек
data-tooltips="false"Над ручками видны числаСкрыть числа над ручками
data-pips="true"Шкалы нетШкала с делениями под слайдером
Без атрибутовdata-pips="true"data-tooltips="false"
Слайдер без атрибутовСлайдер со шкалойСлайдер без чисел над ручками

Поставить диапазон из своего кода — mfilterGet().setFilter('price', { min: 1000, max: 5000 }), слайдер передвинется сам. Подробнее — JS API.