
Архитектура ms3ProductSets
Связанные страницы: Потоки, API, Типы подборок.
Обзор компонентов
- Сниппет вывода:
ms3ProductSetsФормирует список ID по типу подборки и рендерит черезmsProducts. - Сниппет лексикона/конфига:
mspsLexiconScriptЭкспортируетwindow.mspsLexiconиwindow.mspsConfig. - Коннектор:
assets/components/ms3productsets/connector.phpЕдиная точка для фронта и manager action-ов. - Helpers:
core/components/ms3productsets/include/helpers.phpОбщая бизнес-логика формирования подборок, шаблонов и служебных операций. - Плагины:
OnDocFormSave— синхронизация TV в таблицу связей;OnResourceDelete— очистка связей удаляемого ресурса.
- Manager UI: Vue-приложение в
assets/components/ms3productsets/js/mgr/.
Таблицы БД
Связь шаблонов массового применения с строками выдачи (логическая, template_name в строках ссылается на имя шаблона):
ms3_product_sets
Связи для выдачи подборок.
product_id— товар, на карточке которого показываем подборкуrelated_product_id— рекомендуемый товарtype— тип подборкиsortorder— порядокtemplate_name— имя шаблона, если связь создана массовым применением- уникальный ключ: (
product_id,related_product_id,type)
ms3_product_set_templates
Шаблоны для массового применения к категориям.
nametyperelated_product_ids(строка ID через запятую)sortorderdescription(добавляется в upgrade-резолвере)
Алгоритм подбора (высокоуровнево)
- Нормализация параметров (
type,resource_id,max_items,exclude_ids, чанки). - Запрос
msps_get_products_by_type(...):
- сначала ручная подборка из
ms3_product_sets; - если пусто — авто-логика по типу.
- Если ID нет:
hideIfEmpty=true→'';- иначе рендер
emptyTpl.
- Если
return=ids→ вернуть CSV ID. - Иначе рендер через
msProducts+ опциональноtplWrapper.
Логика по типам
Общий порядок: ручные связи из ms3_product_sets → при пустоте авто (если ms3productsets.auto_recommendation = 1) → exclude_ids и лимит через msps_apply_set_filters.
vip: ручная подборкаtype=vip; fallback наms3productsets.vip_set_{set_id}.auto_sales: таблица, иначе co-purchase из заказов (msps_get_auto_sales: товары из тех же заказов, что и текущий; статусы2,4,5), иначеsimilar.buy_together,also-bought,cross-sell: таблица, иначеauto_sales, иначе авто по категории (msps_get_auto_recommendations).similar: таблица, иначеmsps_get_similar_products(та же категория, shuffle).cart_suggestion: таблица, иначе авто по категории /category_id.popcorn: таблица, иначе категория текущего товара, иначе авто сresource_id=0.auto,custom: таблица с соответствующимtype, иначе авто по категории.
Ручная подборка из таблицы тоже проходит через exclude_ids.
Кеш подборок
При ms3productsets.cache_lifetime > 0 результат msps_get_products_by_type кешируется.
Ключ: ms3productsets/sets/{generation}/{md5(...)}, где generation — счётчик msps_get_cache_generation(). Сброс (msps_bump_cache_generation) при сохранении/удалении шаблона, apply/unbind, sync TV, cleanup.
Параметры в md5: type, resource_id, category_id, set_id, limit, отсортированные exclude_ids.
Поток данных TV -> таблица
- Админ заполняет TV-поля (
ms3productsets_*) у товара. OnDocFormSaveпроверяет наличие этих TV на шаблоне ресурса.msps_sync_product_sets_from_tv:- если TV заполнен — удаляются TV-записи (пустой
template_name), вставляются новыеrelated_product_idсsortorderиз TV; - если TV пуст — удаляются только записи без
template_name, чтобы не затереть связи, созданные массовым применением шаблонов к категориям.
- если TV заполнен — удаляются TV-записи (пустой
Поток массового применения шаблона
- Менеджер UI вызывает
apply_template. - Категории разворачиваются рекурсивно до товаров (
msProduct). - Шаблон читается из
ms3_product_set_templates. - В
ms3_product_setsвставляются связи сtemplate_name. - При
replace=trueудаляются связи с тем жеtypeиtemplate_name, что у применяемого шаблона (не все связи типа и не TV).
