Skip to content

[Bug] msProducts не выводит товары дополнительных категорий на витрине #481

Description

@Ibochkarev

Описание проблемы

На витрине сниппет msProducts не выводит товары, привязанные к текущей категории только как к дополнительной (ms3_category_members), хотя в админке привязка отображается и товар опубликован.

Типичный вызов (Fenom):

{'!msProducts' | snippet : ['parents' => $_modx->resource.id]}

Источник: MODX.Pro #25216 (апрель 2025, MiniShop3 1.0.0-alpha).

Шаги воспроизведения

  1. Создать категорию A (основная) и категорию B.
  2. Создать товар с parent = A, опубликовать.
  3. В карточке товара добавить B в дополнительные категории (ms3_category_members).
  4. На странице категории B вывести msProducts с parents => id категории B.
  5. Включить showLog под менеджером — в выборке только товары с parent = B, без товаров из msCategoryMember.

Ожидаемое поведение

На странице категории B отображаются:

  • товары с parent = B;
  • товары, у которых B указана в дополнительных категориях (ms3_category_members).

Поведение должно быть согласовано с miniShop2 и с логикой OptionCategoryService::getProductsInCategory().

Фактическое поведение

На версиях до ~1.2.3 (2026-01): pdoTools фильтровал выборку только по parent; дополнительные категории игнорировались.

На актуальных версиях (main, ≥ 1.2.3): проблема исправлена в elements/snippets/ms3_products.php — кастомный WHERE с msCategoryMember и отключением стандартной фильтрации pdoTools (parents = 0).

Скриншоты

Не приложены (форум: showLog видит только основные товары).

Окружение

  • MiniShop3: воспроизводится на ≤ 1.0.x–1.1.x; исправлено с ~1.2.3
  • MODX: 3.1.2-pl (из отчёта на MODX.Pro)
  • PHP: 8.1+ (из отчёта)
  • pdoTools: 3.x

Логи ошибок

Логи из core/cache/logs/error.log
Runtime-ошибок нет. При showLog видно, что WHERE не содержит OR по id из ms3_category_members (на старых версиях).

Дополнительный контекст

Анализ

Корневая причина (исторически): сниппет делегировал фильтрацию по parents pdoTools/Fetch, который работает с деревом ресурсов MODX (parent) и не знает про ms3_category_members.

Исправление (changelog 2026-01, «Сниппет msProducts»):

Файл: core/components/minishop3/elements/snippets/ms3_products.php (блок ~стр. 146–250):

  1. Разбор parents / depth / исключений (-id) вручную (только msCategory).
  2. Выборка product_id из msCategoryMember для целевых категорий.
  3. WHERE: (`msProduct`.`parent` IN (...) OR `msProduct`.`id` IN (...)).
  4. $scriptProperties['parents'] = 0 — отключение parent-фильтра pdoTools.

Предложенное решение

Для пользователей на старых версиях: обновиться до MiniShop3 ≥ 1.2.3.

Для кодовой базы (follow-up):

  1. ✅ Фикс на витрине уже в main — закрыть issue после добавления регрессионного покрытия.
  2. Добавить автоматический тест на выборку msProducts / SQL-условие с msCategoryMember (сейчас тестов нет).
  3. Убрать дублирование: вынести общую логику «товары категории (parent + members)» в сервис и использовать в сниппете и в админском гриде (см. [Bug] Грид товаров категории в админке не показывает товары из дополнительных категорий #480).
  4. В документации (docs.modx.pro) явно описать поведение parents и дополнительных категорий.

Связанные issues

Проверка после обновления

  1. showLog=1 под mgr — в SQL должен быть OR msProduct.id IN (...).
  2. Запись в ms3_category_members для пары (product_id, category_id).
  3. При showZeroPrice=0 товары с нулевой ценой по-прежнему скрываются (это ожидаемо, не баг).

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions