
mFilter 1.8.0
Версия про обслуживание данных: фоновые задачи, которые не запускались ни разу, переиндексация, которая делала не всё, и подписи значений, которые не доходили до фильтра. Плюс исправление, из-за которого каталог мог отдать пустую страницу.
Исправления
Задачи по расписанию не выполнялись ни на одной установке. Синхронизация индекса фасетов каждые пять минут, прогрев кэша, карта сайта и уборка служебных таблиц регистрировались при установке, но так и стояли в очереди: планировщик берёт работу из списка запусков, а первого запуска повторяющейся задаче никто не заводил. Теперь установка заводит его сама.
Повторные постановки задач удваивали расписание. Кнопка «Прогреть сейчас» ставила задаче новый запуск, не глядя на уже стоящий, и рядом с первой цепочкой навсегда появлялась вторая — своя на каждое нажатие.
Две пересборки индекса шли одновременно. Пересборка начинается с очистки таблиц, поэтому вторая выбрасывала всё, что успела записать первая: окно, когда фильтры показывают неполный набор значений, растягивалось на обе, а каталог читался дважды. У генерации алиасов доходило до порчи данных — одному значению записывались два алиаса. Теперь одновременно выполняется только одна такая работа, а вторая ждёт своей очереди.
Фильтр по TV со списком ресурсов показывал числа. Такой TV хранит идентификаторы страниц, а подписи брались только из поля «Возможные значения», которое у него пустое. Посетитель видел
152149вместо названия раздела — и это число уходило в адрес, на плашку выбранного значения и в заголовок страницы. Теперь подпись берётся из названия страницы.Привязка
@SELECTу TV не работала. Разбор требовал, чтобы после@SELECTшло второе словоSELECT, хотя в MODX@SELECT— это имя привязки, за которым идёт список полей. Значения такого TV попадали в индекс без подписей. Теперь принимается обычная запись; сорвавшийся запрос больше не молчит, а пишет в лог причину.Кнопка «Переиндексация» делала не то, что обещала. Она обходила индекс TV, почти не создавала алиасов — два источника из четырёх в этом пути возвращали пустой список — и чистила кэш первым делом, хотя обход наборов идёт минутами и посетители успевают наполнить его наполовину обновлёнными данными. Теперь шаги идут в правильном порядке, алиасы строятся так же, как на вкладке «Алиасы», а кэш очищается последним.
Очистка кэша ломала фильтрацию на закэшированных страницах. Вместе с кэшем стирались настройки вызова сниппета, по которым AJAX восстанавливает чанки, лимит и разделы. Со стороны это выглядело как «после фильтрации сбросился мой шаблон». Заодно перестали стираться служебные метки, по которым синхронизация индекса понимает, с какого момента догонять правки.
Фигурная скобка в данных роняла страницу в пустоту. Названия товаров, значения опций, ключи фильтров и адреса выводились стандартными чанками без экранирования. Товар с названием вроде «Шуруповёрт {Люкс}» ломал сборку страницы на сайтах, где разметка проходит через Fenom: пустой ответ и ошибка компиляции в логе. Правка задела десять чанков из четырнадцати.
Формы в админке были вытянуты в одну колонку. Набор фильтров, прогрев и словоформы редактируются в окнах, где часть полей задумывалась рядом, а не друг под другом: до дерева страниц приходилось листать мимо всей формы. Заодно дерево страниц вернулось в отведённую ему высоту с прокруткой внутри, у таблиц появилась рамка, а поле «Ключ» перестало сжиматься до двух-трёх символов. Раскладка больше не зависит от набора: раньше у набора с десятью фильтрами дерево уезжало вниз, а у набора с одним оставалось справа при том же размере окна.
Поле «Приоритет» у набора фильтров называлось не тем, чем было. Подпись обещала правило разрешения конфликтов, хотя поле задаёт только порядок строк в списке наборов. Какой набор применится к странице, решают привязка и наследование. Поле переименовано в «Порядок в списке», в подсказке сказано, на что оно не влияет. У паттернов и SEO-шаблонов приоритет работает по-настоящему и назван прежним словом.
Шаблон каталога из комплекта подключал noUiSlider со стороны. Библиотека входит в пакет, и плагин подключает её сам. Мешала не вторая копия, а способ подключения: обычный
<script>в конце страницы задерживает её разбор, пока файл не загрузится, а скрипты mFilter ждут конца разбора — они отложенные. Внешний адрес, отвечающий медленно, задерживал вместе с собой и фильтры. Подключения убраны — вместе с таким же дублемmfilter.css.
Внимание при обновлении
Фоновые задачи начнут выполняться
На сайте с настроенным планировщиком это заметно по нагрузке в первые минуты: индекс фасетов синхронизируется, прогревается кэш, строится карта сайта. Отключить отдельную задачу нечем — у задачи планировщика нет признака «выключена». Единственный рычаг — cron: без него задачи просто встанут в очередь.
Планировщик выполняет одну задачу за запуск. Синхронизация индекса раз в пять минут и уборка раз в десять занимают заметную долю запусков: при cron раз в минуту около трети. Если cron у вас реже, задачи других компонентов будут ждать дольше обычного — увеличьте scheduler.tasks_per_run или запускайте cron чаще.
Свои чанки нужно поправить руками
Обновление не перезаписывает чанки, которые уже есть на сайте. Если вы правили стандартные чанки под себя или сделали с них копии, экранирование до них не доедет — добавьте | esc сами. Экранировать нужно всё, что приходит из данных: название товара, описание, артикул, производителя, значения опций, ключи фильтров, слаги, адреса. Не нужно — числа и вложенную разметку вроде {$rows}, {$items}, {$pagination}.
У mFilterNav разметку задаёт свойство сниппета
Разметка пункта и обёртки хранится не в коде, а в свойствах сниппета — их видно на вкладке «Свойства» в дереве элементов. Значение свойства перебивает значение из кода, поэтому на сайте, где свойство уже заполнено, исправление само не применится. Допишите | esc в tpl и tplOuter либо очистите оба свойства, тогда возьмётся значение из кода.
Анонс товара выводится текстом
В стандартном чанке списка анонс теперь экранируется, как и остальные данные. Если вы держите в анонсе разметку — например, <b> для выделения, — она станет видна текстом. Перенесите её в отдельное поле или уберите | esc у {$introtext} в своей копии чанка.
Шаблон каталога, списанный с образца, чинится вручную
Исправление лежит в файле из поставки, а шаблон ресурса на сайте — ваша копия, обновление её не трогает. Если вы списывали разметку с catalog.tpl прежних версий, уберите у себя подключение noUiSlider с внешнего адреса и строку с mfilter.css: и то и другое подключает плагин. Проверить просто — в сетевых запросах страницы каталога nouislider.min.js должен приходить один раз.
Подписи значений появятся после переиндексации
Исправления, которые касаются подписей — привязка @SELECT и TV со списком ресурсов, — работают с индексом. Чтобы значения в фильтрах сменились с идентификаторов на названия, запустите Переиндексацию в шапке админки mFilter.
