mFilter

Фильтр для MODX3 с поддержкой SEO-friendly URL
Автор дополнения
Николай Савин
Пакетов
20
Закачек
32 734
Обычно отвечает в течение суток
Автор дополнения
Пакетов
20
Закачек
32 734
Обычно отвечает в течение суток
Версия 1.4.4-beta1
Дата выпуска 08.06.2026
Загрузки 103
Просмотры 1 110
Внимание, этот компонент требует PHP 8.1 или выше!
Внимание, этот компонент требует MODX 3 или выше.



Возможности



  • Фасетная фильтрация — фильтрация по любым полям ресурсов, TV, опциям MiniShop3
  • SEO URL — человекочитаемые URL вида /catalog/brand_apple/color_black/
  • Кросс-фильтрация — подсчёт доступных значений с учётом активных фильтров
  • AJAX — обновление результатов без перезагрузки страницы
  • Headless API — REST API для интеграции с Vue, React, Svelte
  • SEO оптимизация — динамические title, description, H1, canonical
  • Словоформы — склонение названий фильтров в SEO-текстах
  • Интеграция — работает с MiniShop3, mSearch, pdoTools
  • Vue-интерфейс — современная админ-панель на Vue 3 + PrimeVue

Системные требования



  • MODX Revolution | 3.0.0+
  • PHP | 8.1+
  • MySQL | 5.7+ / MariaDB 10.3+

Зависимости


  • pdoTools 3.x — для работы сниппетов и шаблонизатора Fenom
  • VueTools — для административного интерфейса
  • MiniShop3 (опционально) — для фильтрации товаров

Быстрый старт


Добро пожаловать в документацию — docs.modx.pro/components/mfilter/quick-start

1.4.4-beta1

Новые возможности

  • Новый тип фильтра ms3_categories — «Категории товаров (MS3)». Аналог parents, но заточен под MiniShop3: рабочее множество ограничивается class_key = msProduct, дополнительно учитываются вторичные категории через msCategoryMember. Используйте этот тип на MS3-каталогах вместо parents. Тип появляется в выпадашке админки только когда MS3 установлен.

Исправления

  • Системные настройки mFilter без названий в админке MODX. В лексиконе был только один setting_* ключ (tv_index_on_save), остальные 21 настройка показывались с raw-ключом (mfilter.url_separator) в колонке «Название» вместо человекочитаемого заголовка. Добавлены пары setting_ + setting__desc для всех 22 настроек и 10 area_mfilter.* для группировки в разделы. Описания в _desc объясняют практический смысл настройки, а не просто переводят название.
  • Унаследованный баг группировки OR в ParentsFilterType::buildQuery. На MS3-каталогах с использованием вторичных категорий (msCategoryMember) условие OR:modResource.id:IN собиралось плоским массивом, и xPDO эмитил WHERE base AND parent IN(...) OR id IN(...). Из-за приоритета AND/OR secondary IDs обходили scope раздела, published=1, deleted=0 и любые другие одновременно активные фильтры — в выборке могли появляться непубликованные товары или товары из других разделов. При переезде логики в MS3CategoriesFilterType OR обёрнут в [[...]] — xPDO теперь корректно группирует: WHERE base AND (parent IN OR id IN).
  • Фантомная «категория-дедушка» в фильтре по категориям на MS3-каталогах. При вызове mFilterForm без главного сниппета mFilter плейсхолдер mfilter.baseIds не выставлен, и mFilterForm использует fallback через Filter::getResourceIds(). На MS3-сайтах в выборку попадали ресурсы с class_key = msCategory и isfolder = 0 (пустые подкатегории, отображающиеся в дереве как обычные документы). ParentsFilterType читал у них modResource.parent, и в фильтре появлялся «дедушка» — родитель этой пустой категории. Решение через новый тип ms3_categories: он отсекает msCategory из baseIds на этапе сбора категорий. Issue surfaced on dev.fastfoodmenu.ru.
  • Значения фильтров с двойными кавычками были полностью сломаны. Касалось любых значений вида Штрих-М "Лайт", Apple "Magic" Mouse и т. п. — типичные модели техники с кавычками в названиях. Симптомы каскадные:

    • Корень бага (HTML). Чанки mfilter.item.tpl, mfilter.boolean.tpl, mfilter.color.tpl, mfilter.selected.item.tpl выводили значения сырыми: value="{$value}". Браузер обрывал атрибут на внутренней ", и input.value оказывался обрезанным до первой кавычки ("Штрих-М "). Из-за этого FormData отправлял на API обрезанную строку — фильтрация по таким значениям физически не работала, возвращая 0 товаров.
    • JS поверх битого HTML. В FilterUI.updateSuggestionCount / syncFormWithState и SelectedFilters.removeFilter использовался querySelector('[value="..."]') с прямой подстановкой значения из бекенда. Полная (не обрезанная) строка с кавычкой делала CSS-селектор невалидным, querySelector бросал SyntaxError, и цикл обновления значений всего фильтра прерывался на первом таком элементе — в UI только одно значение показывало корректный count, все остальные сбрасывались в 0 и становились disabled.

    Исправление:

    • Серверная часть (корень): добавлен |esc ко всем user-supplied value/label/valueLabel в перечисленных чанках. |esc в pdoTools = htmlspecialchars с экранированием "" плюс защита MODX-тегов. HTML теперь валидный, input.value содержит полное значение, фильтрация работает.
    • Клиентская часть (defense-in-depth): новые хелперы FilterUI.findInputByValue / findOptionByValue сравнивают element.value === target в JS вместо CSS-селектора — безопасно для любых строк. Применены в трёх точках вызова (updateSuggestionCount, syncFormWithState, SelectedFilters.removeFilter).
    • updateSuggestions оборачивает каждый per-item update в try/catch, ограничивая blast radius любой будущей регрессии в DOM-лукапе.

    Issue surfaced on dev.fastfoodmenu.ru.

Архитектура

  • ParentsFilterType стал class-agnostic. Вся MS3-специфика (services->has('ms3'), msCategoryMember для вторичных категорий) вынесена в новый MS3CategoriesFilterType. Чистое разделение: parents работает с любым MODX-каталогом, ms3_categories — только с MiniShop3.

Миграция

  • Действие требуется на MS3-сайтах, где фильтр категорий привязан к типу parents: в админке mFilter откройте свой FilterSet, у фильтра категорий смените тип с «Родители (категории)» на «Категории товаров (MS3)». Иначе вторичные категории msCategoryMember и отсечка msCategory перестанут работать (старый parents больше их не делает).

Последние обсуждения в сообществе MODX.pro