Skip to content
mFilter
mFilter
Фасетная фильтрация для MODX 3 с поддержкой SEO URL
  • MODX 3
  • PHP 8.1
  • Vue 3
  1. Компоненты
  2. mFilter

mFilter 1.9.0 ​

Версия про то, чтобы выдача не подменялась молча. Форма без настроек вызова сниппета больше не показывает чужие данные, настройки закэшированной страницы не истекают через сутки, а SEO-шаблоны подставляют названия вместо идентификаторов. Числа у значений обновляются сразу после правки товара, а ошибки в админке стали видны.

Исправления ​

  • Форма без настроек вызова сниппета подменяла выдачу. AJAX находит параметры вызова mFilter — элемент, чанки, лимит, условия — по хешу из разметки. Если хеша не было или по нему ничего не находилось, сервер молча отвечал стандартными чанками и всеми опубликованными ресурсами под страницей. На каталоге с &element после первого клика в выдаче появлялись категории вперемешку с товарами. Теперь хеш обязателен: без него страница не отправляет запрос и пишет в консоль браузера, что добавить в tplOuter. На хеш, по которому ничего нет, сервер отвечает ошибкой 410 с объяснением.
  • Через сутки после отрисовки страницы фильтрация «сбрасывала шаблон». Параметры вызова сниппета хранились сутки, а страница с их хешем живёт в кэше MODX дольше. На следующий день первый клик не находил параметров, и выдача рисовалась стандартными чанками с лимитом 20. Теперь найденные параметры не истекают, а продлеваются, и каталог больше не пишет в базу на каждой отрисовке.
  • Сортировка пропадала из адреса после первого выбора фильтра. Страница, открытая с сортировкой (/catalog/sort--price-asc/), теряла её в адресе после первого AJAX-запроса: выдача оставалась отсортированной, ссылка — нет. В режиме SEO-адресов заодно перестали теряться ?sort= и ?limit=.
  • Блок производителей пропадал с формы. При sort: count или sort: value — в том числе по рецепту из документации — фильтр производителей исчезал, а pinned, custom_order и selected_first у него не работали. Теперь производители сортируются так же, как значения других типов, а pinned и custom_order находят их и по названию.
  • Числа у значений не обновлялись после сохранения товара. Сохранение и удаление товара и синхронизация индекса по расписанию оставляли старый кэш, и категория до часа показывала прежние числа. Теперь кэш значений и счётчиков сбрасывается у страниц каталога, в дерево которых попадает товар. Категория, из которой товар перенесли, пока ждёт истечения кэша.
  • SEO-шаблон подставлял идентификаторы вместо названий. Производитель, раздел, категория товара и TV со списком ресурсов попадали в шаблон и индивидуальную запись числом: «Диваны — 3». Теперь название определяется по типу фильтра — и производитель под ключом brand тоже получает имя.
  • Ошибки в админке показывались ключом лексикона или не показывались вовсе. Вместо текста в уведомлении стоял ключ вроде mfl_slug_not_found, а ошибка сохранения в редакторах уходила только в консоль браузера — окно просто не закрывалось. Теперь сообщения приходят текстом, а ошибка сохранения — уведомлением с причиной.

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

  • sort: label — сортировка значений по подписи, которую видит посетитель. pinned и custom_order принимают и значения, и подписи. Текст сравнивается без учёта регистра для любого алфавита. Подробнее — Сортировка значений фильтра.
  • {$ключ_raw} в SEO-шаблоне — значение фильтра до подстановки названия. У производителя или раздела это идентификатор — для словоформы, заведённой на идентификатор. Подробнее — SEO-шаблоны.

Внимание при обновлении ​

Страница без data-mfilter-hash не фильтрует ​

Если в разметке выдачи нет data-mfilter-hash, страница больше не отправляет AJAX-запросы. Перестают работать фильтры, сортировка, лимит, переключатель вида, «Показать ещё», бесконечная прокрутка, чипы mFilterSelected, сброс, переходы Назад и Вперёд. Ссылки пагинации работают обычным переходом. В консоли браузера — ошибка с подсказкой.

Затронет свой чанк tplOuter без атрибута и обёртку выдачи, перенесённую из чанка в шаблон ресурса. Стандартный mfilter.outer атрибут содержит. Если вы ставили mFilter до 1.1.2 и не меняли mfilter.outer — при обновлении чанки не перезаписываются, — откройте исходный код страницы каталога и проверьте, что data-mfilter-hash не пуст. Подробнее — Обязательные точки подключения.

Запросы без хеша из своего кода — mfilter.api.apply(), Headless API — работают как прежде.

Названия вместо идентификаторов в SEO-шаблонах ​

Значения производителей, разделов, категорий товаров и TV со списком ресурсов теперь подставляются в SEO-шаблон и индивидуальную запись названием. Если шаблон рассчитывал на число, поправьте его:

  • словоформы, заведённые на идентификатор (значение 3), больше не находятся — заведите их на название или пишите {$ключ_raw.gen};
  • опция или TV с ключом parent, category или vendor_id и числовыми значениями теперь подставляет название ресурса или производителя с таким номером — исходное значение доступно как {$parent_raw} и т. п.

sort: value у производителей и разделов ​

У типов, где значение — идентификатор (производители, «Родители», «Категории товаров»), sort: value теперь сортирует по названию, а не по номеру. У производителей недокументированный sort: id раньше упорядочивал по номеру, теперь оставляет порядок по имени.

mFilter 1.9.1 ​

Патч к 1.9.0: порядок товаров на странице и сортировка в поиске, настройка mfilter.default_limit, которая не действовала, и параметр offset.

Исправления ​

  • Товары из дополнительных категорий шли на странице по id. Каталог с &element=msProducts и sortby=menuindex: товары, добавленные в раздел как в дополнительную категорию MiniShop3, выводились по возрастанию id, а не в порядке, заданном в админке. Набор товаров на странице был правильным, неверным — порядок внутри неё. Теперь страница выводится в том порядке, который mFilter получил при выборке, без повторной сортировки.
  • На странице поиска выбор сортировки менял порядок только внутри страницы. Результаты mSearch набирались по релевантности, а выбранная сортировка пересортировывала каждую страницу отдельно: при «сначала дорогие» часть дорогих товаров оказывалась на второй странице. Теперь выбранная сортировка упорядочивает весь результат поиска, без неё — релевантность.
  • Настройка mfilter.default_limit не действовала. Число товаров на странице задавало свойство сниппета limit = 20: администратор ставил 24, а выводилось 20. Теперь свойство по умолчанию пустое: пустое — действует настройка, заполненное — перекрывает её, &limit в вызове главнее всех. Пустая настройка даёт 20, а не весь каталог одной страницей.
  • Параметр offset работал по-разному в разных режимах. С &element он обрезал начало каждой страницы, без &element терялся после первого AJAX-запроса. Теперь в обоих режимах offset пропускает первые N товаров выдачи. Как в pdoPage: «Найдено» считает все товары, число страниц — оставшиеся после offset.

Внимание при обновлении ​

Страницы из кэша MODX и offset ​

Страница, закэшированная до обновления, хранит прежние настройки вызова: с &element первая отрисовка из кэша покажет укороченную страницу, без &element AJAX начнёт список сначала. Если в вызове есть offset, очистите кэш сайта после обновления.

Свойство limit сниппета mFilter ​

Свойства сниппета при обновлении пакета перезаписываются — так было и раньше. Если в свойство limit было вписано своё число, после обновления оно станет пустым, и лимит будет браться из mfilter.default_limit. Своё значение задайте в настройке или параметром &limit в вызове.

Свой сниппет вместо msProducts или pdoResources ​

При выводе страницы mFilter передаёт элементу id страницы в resources и пустой sortby. Собственный элемент, который сортирует сам, должен в этом случае сохранять порядок resources — см. Требования к element.