К содержанию

msCatalyst: фильтр, поиск и синхронизация каталога для miniShop2 и MiniShop3 (бывший msFacets)

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

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

Что внутри
  • Фасетный фильтр и поиск для каталога. Держит 100 000 товаров и пересчитывает выдачу за 10–40 мс.
  • Синхронизация каталога с внешними системами по расписанию, с проверкой перед записью и откатом.
  • Страница в админке: проверка поиска, синонимы, настройки, индекс, наборы фильтров и мастер синхронизации.
Один пакет ставится на MODX 2.8 с miniShop2 и на MODX 3 с MiniShop3. Вызовы сниппетов и чанки на обеих версиях одинаковые.
Фильтр
Каталог списком с выбранными фильтрами
  • Фасеты по производителю, разделу, полям товара, опциям, TV и полям ресурса.
  • Цену, вес и другие числовые поля покупатель задаёт ползунком или полями «от» и «до».
  • У каждого варианта стоит число товаров. После каждого выбора числа пересчитываются.
  • Выбранные фильтры видны над каталогом, каждый снимается крестиком.
  • Каждый шаг пишется в историю браузера. Покупатель листает страницы 1, 2, 3, нажимает «Назад» и попадает на страницу 2 с теми же фильтрами.
  • Без JavaScript фильтр работает как обычная GET-форма, ссылки пагинации настоящие.
Ползунки цены и веса
Поиск
Живой поиск с подсказками
  • Словоформы, опечатки и транслит. Запрос «кросовки адидас» находит кроссовки Adidas. phpMorphy подключается, если стоит на сервере, но поиск работает и без него.
  • Поиск идёт по названию, артикулу, введению, описанию и тексту товара. Веса полей задаёт параметр searchFields, например «pagetitle^3, ms:article^5».
  • Синонимы вы ведёте таблицей в админке. Например, научите поиск находить Nike по слову «найк».
  • Четыре режима: поиск внутри каталога, отдельная страница результатов, выпадающий список, список вместе со страницей. Для шапки сайта есть сниппет msCatalystSearch.
100 000 товаров
Индекс хранит битовую маску на каждое значение фильтра. Числовые поля лежат упакованными колонками, порядки сортировки посчитаны заранее. При клике по фильтру msCatalyst складывает маски и не перебирает товары в базе. Цифры с демо-сайта на обычном виртуальном хостинге:
  • Выдачу и все счётчики фильтр пересчитывает за 10–40 мс на сервере. От клика до нового списка в браузере проходит 120–250 мс.
  • Поиск по всему каталогу отвечает за 100–150 мс, подсказки живого поиска приходят за 50–100 мс.
  • Индекс весит 4,7 МБ и загружается за 5 мс. С нуля он собирается около 10 секунд частями по 2000 товаров и укладывается в 100 МБ памяти.
Скорость вы проверите на своём сайте. AJAX-ответ приходит с заголовком Server-Timing, а плейсхолдеры mscatalyst.ms и mscatalyst.items выводят время и размер каталога на странице.

Синхронизация вместо разового импорта
Обычный импорт загружает файл и забывает о нём. При следующей загрузке он переписывает каталог целиком или плодит дубли. 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 отправляет только товары, изменённые с прошлого обмена.
В профиле вы решаете, какие поля принадлежат источнику. Например, цену и остаток ведёт 1С, а описание пишет контент-менеджер на сайте. Импорт не трогает чужие поля. Для товаров, которые пропали из источника, вы выбираете действие: снять с публикации, обнулить остаток, пометить удалённым или оставить как есть.

Ничего не пишется без вашего согласия
Перед первым обменом msCatalyst проходит пять шагов. Результат каждого шага вы видите и подтверждаете.
  1. Анализ источника. msCatalyst показывает все поля с типами, примерами значений, долей пустых и числом уникальных. Он предлагает поле-ключ и находит модификации: общий артикул родителя, колонки характеристик или вложенные предложения.
  2. Сопоставление полей. Для каждого поля источника msCatalyst предлагает пару на сайте и пишет уверенность в процентах. Он учитывает название поля на русском и английском, тип данных и совпадение значений с теми, что уже есть на сайте. Если пары нет, msCatalyst предложит создать опцию нужного типа и при записи привяжет её к категориям товаров. Правила преобразования чистят текст, делят списки, переводят «да/нет» в флажок, добавляют наценку и округляют цену.
  3. Каталоги бок о бок. Товары, категории, производители, опции и их значения из источника стоят рядом с сайтом. Отдельно видны новые товары, найденные, неоднозначные и конфликтные. «Чёрн.» встаёт в пару с «Чёрный», «1,5 кг» становится числом 1.5.
  4. Утверждение схемы. Сопоставление сохраняется версией. По расписанию обмен идёт только по утверждённой схеме. Если источник поменял структуру, обмен останавливается и показывает разницу, а вы утверждаете новую версию.
  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 руб., лицензия на один сайт.
msCatalyst появится на modstore.pro на следующей неделе, документация будет на docs.modx.pro. Ссылки я добавлю в эту заметку.
Вопросы и пожелания пишите в комментариях. Особенно интересно, с какими системами вы синхронизируете каталог сейчас.
Денис Усманов
Денис Усманов
3 часа назад
modx.pro
42
Реклама

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

Артур Шевченко
2 часа назад
Пошёл по пути ArtCraft только в отношении mSearch2)))
Лучше бы отдельными пакетами сделал фильтры, поиск, импорт/экспорт.
    Денис Усманов
    Денис Усманов Эксперт
    2 часа назад
    Я задумался о компоненте-агрегаторе, «первый и последний компонент, что тебе нужен».
    Но само собой, при наращивании функционала, надо не демпинговать других, поэтому, я пересмотрел стратегию и стоимость. Пока по сути, компонент это — mSearch+mFilter+SEOFilter+mSync, что уже считаю отлично, для ИМ всеобъемлющее решение «купил — всё получил».
    Сергей Карпович
    2 часа назад
    Выглядит потрясающе.
    Как дела обстоят с поддержкой мультиязычности?
      Денис Усманов
      Денис Усманов Эксперт
      1 час назад
      Тут сложно ответить с ходу, можно подробнее? Нужна поддержка Babel и/или Localizator?
        Сергей Карпович
        1 час назад
        Да, что бы снипеты понимали с каким языком работают, поддержка лексиконов и т/п
        Ограничение выборки по языку (если нет перевода — не выводим)

        Подхватывание переводов полей/TV/Опций, как например делает это mfilter2
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5