Skip to content

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

Closed

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 товары с нулевой ценой по-прежнему скрываются (это ожидаемо, не баг).

Activity

  1. self-assigned this
    on Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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