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

JS API

Управление фильтром из своего кода: поставить или снять фильтр, сменить сортировку, отреагировать на обновление выдачи.

Получить форму

js
const filter = mfilterGet();

Без аргумента mfilterGet() возвращает форму фильтров на странице. Если форм несколько, передайте id — его задаёт параметр &formId сниппета mFilterForm, по умолчанию mfilter-form: mfilterGet('mfilter-form').

Форма появляется, когда скрипты mFilter загрузились. Код, который выполняется сразу при загрузке страницы, ждите событием:

js
document.addEventListener('mfilter:ui:ready', () => {
    mfilterGet().setSort('price-asc');
});

В обработчиках кликов это не нужно: к моменту клика форма уже есть.

Методы

МетодЧто делает
setFilter(ключ, значения)Заменяет значения фильтра
addFilter(ключ, значения)Добавляет значения к уже выбранным
removeFilter(ключ, значение)Снимает значение; без значения — весь фильтр
reset()Снимает все фильтры и сортировку
setSort(сортировка)Меняет сортировку: price-asc, pagetitle-desc
setLimit(число)Меняет число товаров на странице
setTpl(вид)Переключает вид — ключ из параметра &tpls сниппета mFilter
goToPage(номер)Переходит на страницу
loadMore()Догружает следующую страницу к показанным товарам
getFilters()Возвращает выбранные фильтры
getState()Возвращает фильтры, страницу, число страниц и товаров, сортировку, лимит, вид
on(событие, обработчик), off(событие, обработчик)Подписка на события этой формы

Методы, которые что-то меняют, сами отправляют запрос и обновляют выдачу. Вызовы подряд уходят одним запросом, их можно писать цепочкой:

js
filter.setFilter('color', 'red').setSort('price-asc');   // один запрос

После этих методов submit() не нужен. Он отправляет поля формы немедленно и пригодится кнопке вне формы, когда автоотправка выключена.

Значения фильтров

js
filter.setFilter('color', 'red');
filter.setFilter('color', ['red', 'blue']);
filter.setFilter('vendor', [5, 7]);
filter.setFilter('price', { min: 1000, max: 5000 });

filter.removeFilter('vendor', 5);
filter.removeFilter('price');
  • Ключ — ключ фильтра из набора фильтров.
  • Производители и категории задаются по id. По названию или слагу из адреса — setFilter('vendor', 'apple') — такой фильтр по производителю не отберёт.
  • Числа и строки равнозначны: removeFilter('vendor', 5) снимет значение '5'. getFilters() возвращает значения строками.
  • Диапазон: границу можно не передавать — { min: 1000 } означает «от 1000», вторая граница снимается. removeFilter('price') снимает обе.
  • Даты выбираются как значения из списка: setFilter('publishedon', ['2024-03-15']). Диапазон дат { from, to } сейчас не работает — см. Типы фильтров.

События

События всплывают от формы до document, поэтому их слушают на document. Данные лежат в e.detail.

СобытиеКогдаЧто в e.detail
mfilter:successВыдача обновленаfilters, total, page, pageCount, sort, limit, tpl, response — ответ сервера
mfilter:errorЗапрос не удалсяerror
mfilter:beforeSubmitПеред запросомstate, cancel — поставьте true, чтобы отменить запрос
mfilter:afterSubmitПосле запроса, удачного или нетте же поля, что у success, без response
mfilter:contentLoadedНовые карточки вставлены на страницуcontainer, appendtrue при догрузке, и поля как у success
mfilter:changeПользователь изменил поле формы с автоотправкойfield, name, value, state
mfilter:seoUpdateОбновлены заголовок и метатегиseoData
mfilter:ui:readyФормы на странице готовыinstances

Кроме change, в событиях формы есть и instance — сама форма. Через filter.on('success', обработчик) приходят те же данные, но сразу аргументом, без e.detail.

Примеры

Кнопка вне формы

html
<button type="button" data-in-stock>Только в наличии</button>

<script>
document.querySelector('[data-in-stock]').addEventListener('click', () => {
    mfilterGet().setFilter('in_stock', 1);
});
</script>

Больше вариантов — сортировка в шапке, быстрые фильтры, цена в отдельном блоке — в рецепте Внешние фильтры.

Число товаров в шапке

js
document.addEventListener('mfilter:success', (e) => {
    document.querySelector('.header-count').textContent = e.detail.total;
});

Отменить запрос

js
document.addEventListener('mfilter:beforeSubmit', (e) => {
    if (Object.keys(e.detail.state.filters).length > 5) {
        e.detail.cancel = true;
    }
});

Свои скрипты на новых карточках

js
document.addEventListener('mfilter:contentLoaded', (e) => {
    initGallery(e.detail.container);   // ваша функция
});

После фильтрации карточки заменяются новыми, и обработчики, навешанные на старые, пропадают. Запускайте свои скрипты заново в пределах e.detail.container.

Создать форму вручную

Скрипт сам находит формы с атрибутом data-mfilter. Вручную форму создают только для своей разметки без него:

js
document.addEventListener('mfilter:ui:ready', () => {
    mfilterInit('#my-form', {
        ajaxMode: 'instant',
        autoSubmit: true,
    });
});

При ручном создании data-атрибуты формы не читаются — все настройки передаются объектом. Опции — те же настройки, что у атрибутов, их список — в таблице Настройки формы. Автоотправке нужны обе опции: autoSubmit: true без ajaxMode: 'instant' ничего не делает, потому что за полями никто не следит.

С jQuery то же самое записывается как $('#my-form').mfilter({ … }), если jQuery подключён раньше скриптов mFilter.

Форма, которую выводит mFilterForm, включает автоотправку сама — по системной настройке mfilter.auto_submit.

Удалить форму

js
mfilterDestroy('mfilter-form');

id обязателен: без него форма не удаляется.