Skip to content
  1. Компоненты
  2. simpleFilters

simpleFilters

Простая фильтрация ресурсов MODX3 и товаров MiniShop3.

Основные свойства

  • Поддержка полей ресурсов, TV и MIGX полей, а также полей и опций товаров MiniShop3.
  • Работает как со стандартными таблицами MODX, так и с собственной индексной таблицей.
  • Поддерживает логику AND и OR.
  • Типы фильтров: чекбокс, радиокнопка, выпадающий список, слайдер для числовых значений (на основе noUiSlider).
  • Настройка псевдонимов фильтров в URL.
  • Пагинация (постраничная и кнопкой «Загрузить ещё»).
  • Настраиваемая сортировка и выбор количества на страницу.
  • Системные события для тонкой настройки (тексты фильтров, значения, сортировка полей и т. д.).

Системные настройки

ПараметрОписаниеЗначение по умолчанию
sf_index_templatesШаблоны ресурсов, поля которых нужно индексировать
sf_index_fieldsПоля ресурсов, которые нужно индексировать
sf_index_fieldsПуть к JS-файлу относительно корня сайта{assets_url}components/simplefilters/js/web/default.min.js
sf_css_pathПуть к CSS-файлу относительно корня сайта{assets_url}components/simplefilters/css/web/default.min.css
sf_seopages_aliasesАлиасы фильтров для формирования SEO-страниц (должны соответствовать псевдонимам в параметре aliases сниппета simpleFilters) в JSON:
{"ms_vendor_id":"brand", "ms_color":"color"}
sf_seopages_idsID страниц для SEO-ссылок (отдельные страницы).
Укажите через запятую ID страниц с вызовом сниппета simpleFilters, на которых используются SEO-ссылки
sf_seopages_tplsID шаблонов страниц для SEO-ссылок (например, категории).
Укажите через запятую ID шаблонов, где вызывается сниппет simpleFilters и на которых используются SEO-ссылки

Начало работы

Индексирование полей и значений

По умолчанию компонент работает с таблицей modx_sf_index, в которой должны содержаться значения полей для ресурсов, что ускоряет выборку.

Для добавления данных нужно заполнить системные настройки sf_index_templates и sf_index_fields, где указать шаблоны ресурсов, участвующих в фильтрации и поля которые нужно индексировать, соответственно.

Используются следующие префиксы:

  • Поле ресурса — без префикса
  • TV-параметр — tv_
  • MIGX-поле — migx_
  • Поле товара MiniShop3 — ms_
  • Опция товара MiniShop3 — mso_

Например, у нас установлен MiniShop, шаблоны товаров 4 и 5 и нам нужно фильтровать по:

  • цене (поле товара price)
  • производителю (поле товара vendor_id)
  • новинке (поле товара new)
  • цвету (поле товара color)
  • материалу (опция товара material)
  • остатку (tv-параметр inctock)
  • полю «Высота» из MIGX-TV *chars, у которого названия параметров указаны в поле title, а значения в value

В sf_index_templates указываем 4,5, а в sf_index_fields так:

ms_price,ms_vendor_id,ms_new,ms_color,mso_material,tv_instock,migx_chars_Высота:title|value

Далее два варианта:
1. Запустить через консоль следующий скрипт:

php
<?php
$sf = $modx->getService('Simplefilters');
$sf->updateIndexAll();

2. Вызвать один раз на любой странице сайта сниппет simpleFiltersUpdate, который идет в комплекте.

Индексация при сохранении ресурса

Происходит автоматически посредством плагина simpleFilters (висит на событии onDocFormSave).

Индексация по расписанию

Можно использовать CronManager или Scheduler.
Просто добавьте сниппет simpleFiltersUpdate в задание и настройте периодичность запуска.

Индексация после импорта

Если используете Impex3, создайте плагин на событие OnImpexAterAllImport с вышеуказанным скриптом:

php
switch ($modx->event->name){
    case 'OnImpexAterAllImport':
        $sf = $modx->getService('Simplefilters');
        $sf->updateIndexAll();
    break;
}

Если используете штатный импорт MiniShop3 из CSV, сделайте то же самое на msOnAfterImport:

php
switch ($modx->event->name){
    case 'msOnAfterImport':
        $sf = $modx->getService('Simplefilters');
        $sf->updateIndexAll();
    break;
}

Работа без индекса

Если ресурсов или полей немного или нет возможности обновлять индекс (по расписанию, после импорта и т. д), режим работы можно переключить на стандартные запросы к таблицам ресурсов, TV-парметров и т. д.
Для этого в вызове сниппета нужно указать &fromIndex=`0`

JavaScript

Для отправки формы можно использовать метод sf.submit:

js
sf.submit();

После обновления данных срабатывает событие sfilters:

js
document.addEventListener('sfilters', (e) => {
    // console.log(e);
};