simpleFilters - простая фильтрация для MODX3

Всем привет!

Пока мы ждём нового mFilter для MODX3 (который обещает быть ого-го), предлагаю вниманию уважаемого сообщества более простое решение здесь и сейчас ).

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


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

Пакет устанавливается стандартным образом из репозитория.

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

  • sf_css_path — путь к JS-файлу, по умолчанию {assets_url}components/simplefilters/js/web/default.min.js
  • sf_css_path — путь к CSS-файлу, по умолчанию {assets_url}components/simplefilters/css/web/default.min.css

Сниппет simpleFilters

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

Параметры (в скобках — значение по умолчанию):
  • parents — родители для выборки (текущий ресурс)
  • sortby — поле для сортировки (menuindex)
  • sortdir — направление сортировки (ASC)
  • limit — кол-во на страницу (10)
  • includeTVs — TV-поля через запятую для включения в вывод
  • tvPrefix — префикс для TV-полей (tv_)
  • msPrefix — префикс для полей товара miniShop3 (ms_)
  • msoPrefix — префикс для опций товара miniShop3 (mso_)
  • templates — шаблоны ресурсов через запятую
  • where — первоначальная выборка в JSON-формате
  • filters — список фильтров в формате поле1: тип_поля1, поле2: тип_поля2, поле3: тип_поля3
  • fseparator — разделитель значений фильтра в адресной строке (_)
  • mode — режим работы: and — совпадение всех условий, or — совпадение хотя бы одного уcловия (or)
В параметре &filters используйте следующие префиксы:
  • Поле ресурса — без префикса
  • TV-параметр — tv_
  • Поле товара MiniShop3 — ms_
  • Опция товара MiniShop3 — mso_
Для типов:
  • Чекбокс — checkbox или оставить пустым
  • Выпадающий список — select
  • Слайдер — slider
  • Радиокнопка — radio
Пример указания списка фильтров:

...
&filters=`ms_vendor_id:select,ms_price:slider,tv_instock:slider,ms_color,ms_tags:select`
...

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

Вывод новинок:
&where=`{ "new":"1" }`

Вывод товаров с ценой больше 2000:
&where=`{ "price:>":"2000" }`

Вывод ресурсов со словом «скидка» в longtitle:
&where=`{ "longtitle:like":"скидка" }`

Шаблоны

В чанках по умолчанию используется Fenom (требуется наличие pdoTools), но поддерживается и стандартный синтаксис
  • tpl — чанк вывода ресурса
  • tplWrapper — чанк-обертка всего вывода (sf_wrapper)
  • tplPaginationWrapper — чанк-обертка пагинации (sf_pagination)
  • tplPagination — чанк вывода ссылки на страницу (sf_page)
  • tplPaginationFirst — чанк вывода ссылки на первую страницу (sf_page_first)
  • tplPaginationLast — чанк вывода ссылки на последнюю страницу (sf_page_last)
  • tplMoreButton — чанк вывода кнопки «Загрузить ещё» (sf_morebutton)
  • 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)
Компонент поддерживает кастомные чанки для разных фильтров.

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

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

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

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

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

Павел Романов
21 января 2026, 10:17
modx.pro
1
379
+7

Комментарии: 13

Александр
21 января 2026, 10:50
0
Кроме обычной пагинации предусмотрена ли загрузка «по кнопке»?
    Павел Романов
    21 января 2026, 11:04
    0
    В данный момент нет, но в ближайшее время планирую добавить.
    Также в планах работа с MIGX-параметрами, но это позже.
      Павел Романов
      23 января 2026, 16:27
      0
      Добавлено в версии 1.0.3
      Артур Шевченко
      21 января 2026, 11:28
      0
      Как будто бы 2 секунды на фильтрацию 1000 товаров без единой твшки это многовато.
        Павел Романов
        21 января 2026, 11:43
        0
        Новинки, Акции, Хиты, Цена и Цвет — поля товара miniShop3.
        На складе — TV-шка.
        Материал — опция категории (ms3_product_option).

        Компонент потому и «simple», что не претендует на суперскорость.
        Для >1000 товаров в категории или большого кол-ва фильтров нужно использовать другие решения.
        Miša Bulic
        21 января 2026, 15:14
        0
        Для упрощенной версии и ограниченного функционала, высоковата цена. Быстродействие оставляет желать лучшего.
          Павел Романов
          21 января 2026, 15:39
          0
          У Modstore есть правила размещения и это компромиссный вариант, который устроил обе стороны.
          В любом случае никто же не заставляет покупать и всегда хорошо, когда есть выбор.
          Нужно что-то большее, подождите выхода нового mFilter и купите его — никто же не запрещает.

          Что касается скорости, то это решение для небольших магазинов, у которых в одной категории порядка 300-500 товаров (согласитесь, таких много).
          Да, на большом количестве будут тормоза, ну так они и на mFilter2 есть и ничего, многие пользуются.
          Вот, к примеру, всего порядка 650 товаров в категории подтормаживает не меньше и ничего.
          Николай Савин
          21 января 2026, 19:50
          +1
          Цитата из демки
          Демо с 1 000 товарами в одной категории и логикой AND (то есть выполняются все условия по отмеченным опциям):
          Я проверил… выбрал все цвета — получил 0 результатов. Реально AND работает. Выбирается товар у которого одновременно есть Красный, Синий, Белый и так далее цвета. Однако типовой фасетный фильтр работает через OR, то есть выбрать все товары у которых цвета Синий ИЛИ Белый ИЛИ Красный т.д.

          То есть налицо логическая ошибка и антипаттерн. Не могу представить ситуации, в которых такая архитектура может быть уместна.

          Не сочти за претензию, я скорее удивлен твоему выбору.
            Павел Романов
            21 января 2026, 20:00
            +2
            Иногда нужно отобрать в этой логике (например, блюдо по ингредиентам, чтобы было и то и то).
            В демке именно так, но ничего не мешает указать в вызове &mode=`or` и будет стандартный режим.
          Сергей Карпович
          22 января 2026, 11:54
          0
          Захожу на страницу, по счетчику грузится за 0,5 сек
          Обновляю просто страницу, страница загружается по счетчику за 2 секунд. Также и по фильтрам, скорость загрузки скачет в 4 раза при одних и тех же условиях.

          Интересно, почему так происходит?
            Павел Романов
            22 января 2026, 12:21
            0
            Что касается просто открытия/обновления страницы (без значений в URL), то довольно ровно 0.4 – 0.49.
            В остальном чем больше фильтров выбрано, тем дольше обработка (проверяется больше условий).
            Если выбраны только новинки, то 0.45, если добавить еще что-то, будет дольше.
            Ну и зависит, конечно, от типа поля. Для TV и опций товаров нужны дополнительные запросы.
              Сергей Карпович
              22 января 2026, 12:50
              0
              Ну я говорю разную скорость при одних и тех же условиях.
              1 — зашел на страницу — 0.5 сек
              2. — просто обновил страницу — 2 сек
              3. — выбрал один чекбокс — 1 сек
              4 обновил страницу с этим же чек боксом — 2,5сек

              Время округлил
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            13