
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
$sf = $modx->getService('Simplefilters');
$sf->updateIndexAll();2. Вызвать один раз на любой странице сайта сниппет simpleFiltersUpdate, который идет в комплекте.
Индексация при сохранении ресурса
Происходит автоматически посредством плагина simpleFilters (висит на событии onDocFormSave).
Индексация по расписанию
Можно использовать CronManager или Scheduler.
Просто добавьте сниппет simpleFiltersUpdate в задание и настройте периодичность запуска.
Индексация после импорта
Если используете Impex3, создайте плагин на событие OnImpexAterAllImport с вышеуказанным скриптом:
switch ($modx->event->name){
case 'OnImpexAterAllImport':
$sf = $modx->getService('Simplefilters');
$sf->updateIndexAll();
break;
}Если используете штатный импорт MiniShop3 из CSV, сделайте то же самое на msOnAfterImport:
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 |
| &includeTVs | TV-поля через запятую для включения в вывод | |
| &tvPrefix | Префикс для TV-полей в чанке ресурса | tv_ |
| &msPrefix | Префикс для полей товара miniShop3 | ms_ |
| &msoPrefix | Префикс для опций товара miniShop3 | mso_ |
| &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 с такой конфигурацией:
[{"fields":
[
{"field":"title", "caption":"Параметр"},
{"field":"value", "caption":"Значение"}
]
}]А у товаров значения указываются следующим образом:

Чтобы создать фильтр-слайдер для параметра «Высота» нужно прописать:
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:
sf.submit();После обновления данных срабатывает событие sfilters:
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.