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


Документация по шаблонам и вёрстке фронтенда mFilter.
| Раздел | Описание |
|---|---|
| Шаблоны | Чанки и разметка |
| Плейсхолдеры | Переменные для шаблонов |
| Пагинация | Режимы, шаблоны, кнопка "Показать ещё" |
mFilter использует Fenom для шаблонизации. Основные компоненты фронтенда:
<form id="mfilter-form" data-mfilter-form>
<!-- Фильтры -->
</form><div id="mfilter-results" data-mfilter-results>
<!-- Товары/ресурсы -->
</div><div id="mfilter-pagination" data-mfilter-pagination>
<!-- Постраничная навигация -->
</div><!-- Сниппет формы -->
[[!mFilterForm]]
<!-- Сниппет результатов -->
[[!mFilter?
&element=`msProducts`
&paginator=`pdoPage`
&parents=`5`
]]<div class="catalog">
<aside class="catalog__sidebar">
[[!mFilterForm?
&tplOuter=`@FILE chunks/mfilter/form.outer.tpl`
&tplFilter.default=`@FILE chunks/mfilter/filter.default.tpl`
]]
</aside>
<main class="catalog__content">
<div data-mfilter-results>
[[!mFilter?
&element=`msProducts`
&paginator=`pdoPage`
&tpl=`@FILE chunks/product.card.tpl`
]]
</div>
<div data-mfilter-pagination>
[[!+page.nav]]
</div>
</main>
</div>| Атрибут | Элемент | Описание |
|---|---|---|
data-mfilter-form | form | Контейнер формы |
data-mfilter-results | div | Контейнер результатов |
| Атрибут | Элемент | Описание |
|---|---|---|
data-mfilter-pagination | div | Контейнер пагинации |
data-mfilter-pagination-mode | form | Режим пагинации: links (по умолчанию), loadmore, infinite |
data-mfilter-total | span | Количество результатов |
data-mfilter-filter | fieldset | Блок фильтра |
data-mfilter-key | input | Ключ фильтра |
| Класс | Описание |
|---|---|
mfilter-loading | Загрузка данных |
mfilter-empty | Нет результатов |
mfilter-active | Есть активные фильтры |
| Класс | Описание |
|---|---|
mfilter-filter | Блок фильтра |
mfilter-filter--disabled | Недоступный фильтр |
mfilter-value | Значение фильтра |
mfilter-value--selected | Выбранное значение |
mfilter-value--disabled | Недоступное значение |
mfilter-item-empty | Значение с count=0 |
mfilter-count | Счётчик товаров |
После применения фильтра сервер возвращает suggestions — количество товаров для каждого значения фильтра. На основе этих данных JS обновляет UI:
.mfilter-count обновляется числом.mfilter-item получает класс mfilter-item-empty при count=0<option> с count=0 получают атрибут disabled (серые, нельзя выбрать)<option> с count>0 — disabled снимается<option value=""> (placeholder) не блокируетсяdata-available-min, data-available-max// Получить экземпляр фильтра
const instance = window.MFilterUI.get('mfilter-form');
// Состояние
instance.state.filters // активные фильтры
instance.state.page // текущая страница
instance.state.pageCount // всего страниц
instance.state.total // всего результатов
instance.state.sort // текущая сортировка
instance.state.limit // лимит на страницеdocument.addEventListener('mfilter:ui:ready', function(e) {
const instance = e.detail.instances.values().next().value;
instance.on('success', function(data) {
console.log('Фильтр применён', data.response);
});
instance.on('change', function(data) {
console.log('Поле изменено', data.field);
});
});| Событие | Описание |
|---|---|
init | Экземпляр инициализирован |
change | Изменено поле формы |
beforeSubmit | Перед отправкой запроса (можно отменить через cancel: true) |
success | Ответ получен. data.append = true — для loadMore |
error | Ошибка запроса |
afterSubmit | После завершения запроса (всегда) |
seoUpdate | SEO-данные обновлены |
instance.submit() // Применить фильтры
instance.reset() // Сбросить всё
instance.loadMore() // Загрузить следующую страницу
instance.setFilter('color', ['red']) // Установить фильтр
instance.removeFilter('color') // Убрать фильтр
instance.goToPage(3) // Перейти на страницу
instance.syncFormWithState() // Синхронизировать форму с stateВстроенные шаблоны находятся в:
core/components/mfilter/elements/chunks/Для кастомизации скопируйте в свою папку и укажите путь через параметр tpl*.