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

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

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

По умолчанию компонент работает с таблицей 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`

Сниппет simpleFilters

Выводит список ресурсов, фильтры, подключает все необходимые скрипты и стили.

Параметры

ПараметрОписаниеЗначение по умолчанию
&parentsРодители для выборки. ID через запятую.Текущий ресурс
&resourcesРесурсы для выборки. ID через запятую.
&showUnpublishedВывод неопубликованных ресурсов0
&templatesШаблоны ресурсов через запятую
&fromIndexВыборка из индекса1
&whereПервоначальная выборка в JSON-формате
&sortbyПоле для сортировкиmenuindex
&sortdirНаправление сортировкиASC
&limitКоличество на страницу10
&includeTVsTV-поля через запятую для включения в вывод
&tvPrefixПрефикс для TV-полей в чанке ресурсаtv_
&msPrefixПрефикс для полей товара miniShop3ms_
&msoPrefixПрефикс для опций товара miniShop3mso_
&hideOneСкрывать фильтры с одним значением1
&checkEmptyПросчитывать результат для каждого значения фильтра, чтобы отключать неактивные0
&filtersСписок фильтров в формате поле1:тип_поля1,поле2:тип_поля2,поле3:тип_поля3
&aliasesПсевдонимы фильтров для URL в формате поле1==псевдоним1,поле2==псевдоним2,поле3==псевдоним3
&fseparatorРазделитель значений фильтра в адресной строке_
&modeРежим работы: and — совпадение всех условий, or — совпадение хотя бы одного условияor
Шаблонизация
&tplЧанк вывода ресурса
&tplWrapperЧанк-обёртка всего выводаsf_wrapper
&tplFilterЧанк блока фильтра типа чекбокс или радиокнопкаsf_filter
&tplFilterRowЧанк строки фильтра типа чекбоксsf_filter_row
&tplFilterRadioRowЧанк строки фильтра типа радиокнопкаsf_filter_radio_row
&tplFilterSelectЧанк блока фильтра типа селектsf_filter_select
&tplFilterSelectRowЧанк опции фильтра типа селектsf_filter_option_row
&tplFilterSliderЧанк блока фильтра типа слайдерsf_filter_slider
&tplSelectedЧанк оформления блока выбранного фильтраsf_selected_filter
&tplSelectedRowЧанк оформления строки выбранного фильтраsf_selected_row
Пагинация
&tplPaginationWrapperЧанк-обёртка блока пагинацииsf_pagination
&tplPaginationЧанк вывода ссылки на страницуsf_page
&tplPaginationFirstЧанк вывода ссылки на первую страницуsf_page_first
&tplPaginationLastЧанк вывода ссылки на последнюю страницуsf_page_last
&tplMoreButtonЧанк вывода кнопки «Загрузить ещё»sf_morebutton

Настройка фильтров

В параметре &filters используйте следующие префиксы:

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

Для типов:

  • Чекбокс — checkbox или оставить пустым
  • Выпадающий список — select
  • Слайдер — slider
  • Радиокнопка — radio

Пример указания списка фильтров и псевдонимов:

&filters=`
    parent:select,
    ms_vendor_id:select,
    ms_price:slider,
    tv_instock:slider,
    migx_chars_Высота:slider:title|value,
    ms_color,
    ms_tags:select
`
&aliases=`
    ms_vendor_id==brand,
    ms_price==price,
    tv_instock==instock,
    migx_chars_Высота==height,
    ms_color==color,
    ms_tags==tags
`

MIGX-поля

Поля этого типа указываются в формате:

migx_[имя tv]_[название параметра]:[тип фильтра]:[поле названия]|[поле значения]

Допустим есть MIGX-TV chars с такой конфигурацией:

json
[{"fields":
  [
    {"field":"title", "caption":"Параметр"},
    {"field":"value", "caption":"Значение"}
  ]
}]

А у товаров значения указываются следующим образом:

MIGX значения

Чтобы создать фильтр-слайдер для параметра «Высота» нужно прописать:

migx_chars_Высота:slider:title|value

Фильтр для параметра «Назначение» в виде чекбоксов так:

migx_chars_Назначение:title|value

В настройке индексации sf_index_fields всегда без указания типа фильтра:

migx_chars_Назначение:title|value,migx_chars_Высота:title|value

Параметр &where

Поддерживает один параметр/значение. Работает только с таблицами ресурса и продукта MiniShop3 (поля указываются без префиксов, как в базе).

ОписаниеПример
Вывод новинок'where' => '{"new":"1"}'
Вывод товаров с ценой больше 2000'where' => '{"price:>":"2000"}'
Вывод ресурсов со словом "скидка" в longtitle'where' => '{"longtitle:like":"скидка"}'

Шаблонизация

В чанках по умолчанию используется Fenom (требуется наличие pdoTools), но поддерживается и стандартный синтаксис.

Компонент поддерживает кастомные чанки для разных фильтров.

Для этого нужно указать параметры в виде &tplFilter_параметр и &tplFilterRow_параметр.

Например, если требуется для фильтра по тегам (ms_tags) какое-то своё оформление, создайте соответствующие чанки и укажите в вызове:

&tplFilter_ms_tags=`чанк_для_блока`
&tplFilterRow_ms_tags=`чанк_для_элемента`

Если для параметра указан псевдоним, то используется он:

$aliases=`ms_tags==tag`
&tplFilter_tag=`чанк_для_блока`
&tplFilterRow_tag=`чанк_для_элемента`

Названия блоков фильтров задаются через лексиконы в формате sf_filter_фильтр (также можно менять в плагине).

JavaScript

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

js
sf.submit();

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

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

Системные события

Все события принимают массив $data.

СобытиеОписание
sfOnGetIdsВызывается после первоначального сбора ID выводимых ресурсов. Можно добавить ресурс, прописав его ID или полностью переписать набор.
sfOnGetFilterValuesВызывается после создания значений фильтра. Принимает массив со значениями (например, можно отсортировать по-своему), названием и типом фильтра.
sfOnBeforeCreateFilterRowВызывается при создании строки (элемента фильтра). Можно заменить названия, значения и т. д.
sfOnBeforeCreateFilterВызывается при создании блока фильтра. Например, можно изменить название блока, значения для слайдера и т. д.
sfOnCheckResourceВызывается при проверке ресурса на соответствие значению выбранного фильтра. Приходит id ресурса, название фильтра и значение. Чтобы ресурс добавился в выборку, должно возвращать $data['result'] = true;

Примеры обработки событий можно посмотреть в файле core/components/simplefilters/docs/pluginExamples.md.