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

JS API

Программное управление фильтрами через JavaScript API.

Получение инстанса

javascript
// По ID элемента
const filter = mfilterGet('mfilter-form');

// Через MFilterUI
const filter = MFilterUI.get('mfilter-form');

// Все инстансы
const all = MFilterUI.instances; // Map

Методы инстанса

Управление фильтрами

javascript
// Установить значение фильтра
filter.setFilter('brand', 'apple');
filter.setFilter('brand', ['apple', 'samsung']); // множественный

// Удалить значение
filter.removeFilter('brand', 'apple');

// Удалить весь фильтр
filter.removeFilter('brand');

// Сбросить все фильтры
filter.reset();

// Получить текущие фильтры
const filters = filter.getFilters();
// { brand: ['apple'], color: ['red', 'blue'] }

// Получить полное состояние
const state = filter.getState();
// { filters: {...}, page: 1, sort: 'price-asc', limit: 24 }

Сортировка и пагинация

javascript
// Установить сортировку
filter.setSort('price-asc');
filter.setSort('price-desc');

// Установить лимит
filter.setLimit(48);

// Перейти на страницу
filter.goToPage(3);

// Загрузить ещё (для бесконечной прокрутки)
filter.loadMore();

Отправка

javascript
// Отправить форму (собирает данные из DOM)
filter.submit();

// Отправить без сбора данных (использует текущий state)
filter.submitWithoutCollect();

Синхронизация

javascript
// Синхронизировать форму с внутренним состоянием
filter.syncFormWithState();

События

javascript
// Подписаться на событие
filter.on('change', (data) => {
    console.log('Изменение:', data.field, data.value);
});

filter.on('success', (data) => {
    console.log('Результаты:', data.response);
});

filter.on('error', (data) => {
    console.error('Ошибка:', data.error);
});

// Отписаться
filter.off('change', handler);
filter.off('change'); // все обработчики события

Доступные события инстанса

СобытиеОписаниеДанные
initИнициализация{ instance }
changeИзменение поля{ field, name, value, state }
beforeSubmitПеред отправкой{ state, instance, cancel }
afterSubmitПосле отправки{ state, instance }
successУспешный ответ{ response, instance }
errorОшибка{ error, instance }
seoUpdateОбновление SEO{ seoData, instance }
destroyУничтожение{ instance }

Примеры

Внешний фильтр

html
<select id="quick-brand">
    <option value="">Все бренды</option>
    <option value="apple">Apple</option>
    <option value="samsung">Samsung</option>
</select>

<script>
document.getElementById('quick-brand').addEventListener('change', (e) => {
    const filter = mfilterGet('main-filter');

    if (e.target.value) {
        filter.setFilter('vendor', e.target.value);
    } else {
        filter.removeFilter('vendor');
    }

    filter.submit();
});
</script>

Сброс при клике на кнопку

html
<button id="clear-filters">Сбросить все фильтры</button>

<script>
document.getElementById('clear-filters').addEventListener('click', () => {
    const filter = mfilterGet('mfilter-form');
    filter.reset();
});
</script>

Программная фильтрация

javascript
const filter = mfilterGet('mfilter-form');

// Установить несколько фильтров
filter.setFilter('brand', ['apple', 'samsung']);
filter.setFilter('price', { min: 10000, max: 50000 });
filter.setSort('price-asc');
filter.setLimit(24);

// Отправить
filter.submit();

Отслеживание изменений

javascript
const filter = mfilterGet('mfilter-form');

filter.on('success', ({ response }) => {
    // Отправить в аналитику
    gtag('event', 'filter_applied', {
        filters: JSON.stringify(filter.getFilters()),
        results_count: response.total
    });
});

Отмена отправки

javascript
const filter = mfilterGet('mfilter-form');

filter.on('beforeSubmit', (data) => {
    const filters = data.state.filters;

    // Отменить если выбрано слишком много фильтров
    if (Object.keys(filters).length > 5) {
        data.cancel = true;
        alert('Выберите не более 5 фильтров');
    }
});

Кастомная обработка результатов

javascript
const filter = mfilterGet('mfilter-form');

filter.on('success', ({ response }) => {
    // Обновить счётчик в шапке
    document.querySelector('.header-count').textContent = response.total;

    // Обновить URL без использования встроенного pushState
    if (response.urls?.current) {
        window.history.replaceState({}, '', response.urls.current);
    }
});

Синхронизация двух форм

javascript
const mainFilter = mfilterGet('main-filter');
const mobileFilter = mfilterGet('mobile-filter');

// При изменении основной формы — обновить мобильную
mainFilter.on('success', () => {
    const state = mainFilter.getState();

    // Вручную обновить состояние мобильной формы
    Object.entries(state.filters).forEach(([key, values]) => {
        mobileFilter.setFilter(key, values);
    });
    mobileFilter.syncFormWithState();
});

Создание инстанса

javascript
// Создать новый инстанс
const instance = mfilterInit('#my-element', {
    ajax: true,
    seoUrl: true,
    pushState: true,
    autoSubmit: true,
    autoSubmitDelay: 500,
    resultsSelector: '.my-results',
    paginationSelector: '.my-pagination',
    scrollToResults: true,
    scrollOffset: 100,

    // Callbacks
    onInit: function(instance) {
        console.log('Инициализирован');
    },
    onChange: function(field, state) {
        console.log('Изменено:', field.name);
    },
    onBeforeSubmit: function(state) {
        console.log('Отправка...');
    },
    onSuccess: function(response) {
        console.log('Результаты:', response);
    },
    onError: function(error) {
        console.error('Ошибка:', error);
    }
});

Опции инстанса

ОпцияПо умолчаниюОписание
ajaxtrueИспользовать AJAX
ajaxModeformРежим: form или instant
seoUrltrueSEO-friendly URL
pushStatetrueОбновлять URL браузера
autoSubmitfalseАвто-отправка при изменении
autoSubmitDelay500Задержка авто-отправки (мс)
resetPagetrueСбрасывать страницу при фильтрации
scrollToResultstrueСкроллить к результатам
scrollOffset100Отступ скролла (px)
loadingClassmfilter-loadingCSS класс загрузки
loadingOverlaytrueПоказывать оверлей
resultsSelector.mfilter-resultsСелектор результатов
paginationSelector.mfilter-paginationСелектор пагинации
paginationModelinksРежим: links, loadmore, infinite
debugfalseРежим отладки

Уничтожение

javascript
// По ID
mfilterDestroy('mfilter-form');

// Через MFilterUI
MFilterUI.destroy('mfilter-form');