msCatalyst: фильтр, поиск и синхронизация каталога для miniShop2 и MiniShop3 (бывший msFacets)
Есть решение
Привет! Недавно я публиковал здесь заметку про msFacets, фасетный фильтр для miniShop2 и MiniShop3. С тех пор план поменялся. После той заметки мне написали пользователи: фильтр нужен, но каталог сначала надо как-то загрузить и потом держать в актуальном виде. По их отзывам я добавил импорт, экспорт и синхронизацию каталога с 1С, Google Таблицами, файлами и любым API. Название msFacets про это не говорит, поэтому компонент теперь называется msCatalyst. Выходит он на следующей неделе. Старую заметку я удалил, чтобы вы не искали пакет под прежним именем. Если вы успели её прочитать или прокомментировать, извините за путаницу.
Демо-сайт: chelnysite.ru. Там каталог на 100 000 товаров в 12 разделах. Над выдачей видно, сколько миллисекунд фильтр считал на сервере и сколько занял весь запрос из браузера. Выберите бренд, цвет и размер сразу или поищите «кросовки» с опечаткой.

Что внутри
Фильтр


Поиск

Индекс хранит битовую маску на каждое значение фильтра. Числовые поля лежат упакованными колонками, порядки сортировки посчитаны заранее. При клике по фильтру msCatalyst складывает маски и не перебирает товары в базе. Цифры с демо-сайта на обычном виртуальном хостинге:
Синхронизация вместо разового импорта
Обычный импорт загружает файл и забывает о нём. При следующей загрузке он переписывает каталог целиком или плодит дубли. msCatalyst помнит, какой товар на сайте соответствует какой строке или записи источника. Он обновляет только изменившееся и работает по расписанию в обе стороны.

Обмен настраивается профилем. В профиле вы указываете источник, направление, сопоставление полей, ключ товара и расписание. Профилей может быть несколько: например, прайс поставщика по API и остатки из Google Таблицы.
Ничего не пишется без вашего согласия
Перед первым обменом msCatalyst проходит пять шагов. Результат каждого шага вы видите и подтверждаете.
Модификации и новые опции
Модификации msCatalyst пишет в msOptionsPrice2 на MODX 2 и в ms3Variants на MODX 3. Фильтр по цене учитывает их цены, фасеты показывают их опции. Отсутствующие категории по пути «Обувь/Кроссовки», производителей и опции msCatalyst создаёт сам и привязывает опции к нужным категориям. Картинки он загружает по ссылке и пропускает уже загруженные.
Админка на демо
Админку компонента можно открыть без входа в менеджер MODX: chelnysite.ru/admin-demo. Там работают все вкладки. Можно проверить поиск по каталогу на 100 000 товаров и пройти мастер синхронизации на трёх готовых профилях: прайс поставщика в CSV, поставщик по API и выгрузка каталога в фид. Пробный прогон покажет план изменений с полями «было → станет». Применить план в демо нельзя, а ваши правки настроек и синонимов видны только вам.
На телефоне

Фильтры открываются выдвижной панелью. На кнопке видно число выбранных фильтров, внизу панели стоит кнопка «Показать результаты» с количеством товаров.
Как подключить
Вызов в шаблоне каталога:
Требования и цена
Вопросы и пожелания пишите в комментариях. Особенно интересно, с какими системами вы синхронизируете каталог сейчас.
Демо-сайт: chelnysite.ru. Там каталог на 100 000 товаров в 12 разделах. Над выдачей видно, сколько миллисекунд фильтр считал на сервере и сколько занял весь запрос из браузера. Выберите бренд, цвет и размер сразу или поищите «кросовки» с опечаткой.

Что внутри
- Фасетный фильтр и поиск для каталога. Держит 100 000 товаров и пересчитывает выдачу за 10–40 мс.
- Синхронизация каталога с внешними системами по расписанию, с проверкой перед записью и откатом.
- Страница в админке: проверка поиска, синонимы, настройки, индекс, наборы фильтров и мастер синхронизации.
Фильтр

- Фасеты по производителю, разделу, полям товара, опциям, TV и полям ресурса.
- Цену, вес и другие числовые поля покупатель задаёт ползунком или полями «от» и «до».
- У каждого варианта стоит число товаров. После каждого выбора числа пересчитываются.
- Выбранные фильтры видны над каталогом, каждый снимается крестиком.
- Каждый шаг пишется в историю браузера. Покупатель листает страницы 1, 2, 3, нажимает «Назад» и попадает на страницу 2 с теми же фильтрами.
- Без JavaScript фильтр работает как обычная GET-форма, ссылки пагинации настоящие.

Поиск

- Словоформы, опечатки и транслит. Запрос «кросовки адидас» находит кроссовки Adidas. phpMorphy подключается, если стоит на сервере, но поиск работает и без него.
- Поиск идёт по названию, артикулу, введению, описанию и тексту товара. Веса полей задаёт параметр searchFields, например «pagetitle^3, ms:article^5».
- Синонимы вы ведёте таблицей в админке. Например, научите поиск находить Nike по слову «найк».
- Четыре режима: поиск внутри каталога, отдельная страница результатов, выпадающий список, список вместе со страницей. Для шапки сайта есть сниппет msCatalystSearch.
Индекс хранит битовую маску на каждое значение фильтра. Числовые поля лежат упакованными колонками, порядки сортировки посчитаны заранее. При клике по фильтру msCatalyst складывает маски и не перебирает товары в базе. Цифры с демо-сайта на обычном виртуальном хостинге:
- Выдачу и все счётчики фильтр пересчитывает за 10–40 мс на сервере. От клика до нового списка в браузере проходит 120–250 мс.
- Поиск по всему каталогу отвечает за 100–150 мс, подсказки живого поиска приходят за 50–100 мс.
- Индекс весит 4,7 МБ и загружается за 5 мс. С нуля он собирается около 10 секунд частями по 2000 товаров и укладывается в 100 МБ памяти.
Синхронизация вместо разового импорта
Обычный импорт загружает файл и забывает о нём. При следующей загрузке он переписывает каталог целиком или плодит дубли. msCatalyst помнит, какой товар на сайте соответствует какой строке или записи источника. Он обновляет только изменившееся и работает по расписанию в обе стороны.

Обмен настраивается профилем. В профиле вы указываете источник, направление, сопоставление полей, ключ товара и расписание. Профилей может быть несколько: например, прайс поставщика по API и остатки из Google Таблицы.
- Файлы CSV и XLSX. Загрузка в админке или ссылка на файл. Разделитель и кодировку (UTF-8 или Windows-1251) msCatalyst определяет сам. XLSX читается построчно, без сторонних библиотек.
- Любой JSON или XML API. Адрес, заголовки, авторизация Bearer, Basic или ключом. Постраничная выдача по номеру страницы, смещению, курсору или ссылке на следующую страницу.
- Google Таблицы в обе стороны. Подключение через сервисный аккаунт Google. msCatalyst читает лист и пишет обратно цены, остатки, ссылки на товары и новые товары с сайта.
- 1С по CommerceML 2. Группы, свойства, характеристики, цены и остатки. Заказы уходят в 1С, статусы возвращаются на сайт.
- Экспорт-фиды. Адрес с токеном отдаёт товары раздела вместе с модификациями в CSV, XLSX, JSON или XML. В Google Таблицу msCatalyst отправляет только товары, изменённые с прошлого обмена.
Ничего не пишется без вашего согласия
Перед первым обменом msCatalyst проходит пять шагов. Результат каждого шага вы видите и подтверждаете.
- Анализ источника. msCatalyst показывает все поля с типами, примерами значений, долей пустых и числом уникальных. Он предлагает поле-ключ и находит модификации: общий артикул родителя, колонки характеристик или вложенные предложения.
- Сопоставление полей. Для каждого поля источника msCatalyst предлагает пару на сайте и пишет уверенность в процентах. Он учитывает название поля на русском и английском, тип данных и совпадение значений с теми, что уже есть на сайте. Если пары нет, msCatalyst предложит создать опцию нужного типа и при записи привяжет её к категориям товаров. Правила преобразования чистят текст, делят списки, переводят «да/нет» в флажок, добавляют наценку и округляют цену.
- Каталоги бок о бок. Товары, категории, производители, опции и их значения из источника стоят рядом с сайтом. Отдельно видны новые товары, найденные, неоднозначные и конфликтные. «Чёрн.» встаёт в пару с «Чёрный», «1,5 кг» становится числом 1.5.
- Утверждение схемы. Сопоставление сохраняется версией. По расписанию обмен идёт только по утверждённой схеме. Если источник поменял структуру, обмен останавливается и показывает разницу, а вы утверждаете новую версию.
- План изменений. Перед записью вы видите, сколько товаров msCatalyst создаст, обновит и снимет с публикации, и каждое поле в виде «было → станет». Предохранители останавливают обмен, если снимается слишком много товаров, цена прыгает больше заданного процента или источник вернул заметно меньше записей, чем в прошлый раз.
Модификации и новые опции
Модификации msCatalyst пишет в msOptionsPrice2 на MODX 2 и в ms3Variants на MODX 3. Фильтр по цене учитывает их цены, фасеты показывают их опции. Отсутствующие категории по пути «Обувь/Кроссовки», производителей и опции msCatalyst создаёт сам и привязывает опции к нужным категориям. Картинки он загружает по ссылке и пропускает уже загруженные.
Админка на демо
Админку компонента можно открыть без входа в менеджер MODX: chelnysite.ru/admin-demo. Там работают все вкладки. Можно проверить поиск по каталогу на 100 000 товаров и пройти мастер синхронизации на трёх готовых профилях: прайс поставщика в CSV, поставщик по API и выгрузка каталога в фид. Пробный прогон покажет план изменений с полями «было → станет». Применить план в демо нельзя, а ваши правки настроек и синонимов видны только вам.
На телефоне

Фильтры открываются выдвижной панелью. На кнопке видно число выбранных фильтров, внизу панели стоит кнопка «Показать результаты» с количеством товаров.
Как подключить
Вызов в шаблоне каталога:
[[!msCatalyst?
&parents=`5`
&facets=`parent|title=Раздел, vendor|title=Производитель, ms:color|title=Цвет, ms:price|range|step=100|title=Цена`
&sorts=`menuindex, pagetitle, ms:price:asc, ms:price:desc`
]]Поиск в шапке:[[!msCatalystSearch? &parents=`5` &searchPage=`5`]]SEO-заголовки в шаблоне:<title>[[!+mscatalyst.title]]</title>
<meta name="description" content="[[!+mscatalyst.description]]">
<h1 data-msc-h1>[[!+mscatalyst.h1]]</h1>Если вы уже поставили msFacets, установите msCatalyst поверх. Он перенесёт настройки, синонимы и наборы фильтров. Вызовы [[!msFacets]], старые плейсхолдеры и классы оформления продолжат работать.Требования и цена
- MODX 2.8 с miniShop2 или MODX 3 с MiniShop3.
- pdoTools.
- PHP от 7.2 до 8.4. Перед выпуском пакет проходит больше 2000 автотестов на PHP 7.2, 7.4 и 8.4.
- Цена 4990 руб., лицензия на один сайт.
Вопросы и пожелания пишите в комментариях. Особенно интересно, с какими системами вы синхронизируете каталог сейчас.
Комментарии: 3
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Лучше бы отдельными пакетами сделал фильтры, поиск, импорт/экспорт.
Но само собой, при наращивании функционала, надо не демпинговать других, поэтому, я пересмотрел стратегию и стоимость. Пока по сути, компонент это — mSearch+mFilter+SEOFilter+mSync, что уже считаю отлично, для ИМ всеобъемлющее решение «купил — всё получил».
Как дела обстоят с поддержкой мультиязычности?