Repository navigation
[Bug] msProducts не выводит товары дополнительных категорий на витрине #481
Description
Описание проблемы
На витрине сниппет msProducts не выводит товары, привязанные к текущей категории только как к дополнительной (ms3_category_members), хотя в админке привязка отображается и товар опубликован.
Типичный вызов (Fenom):
{'!msProducts' | snippet : ['parents' => $_modx->resource.id]}
Источник: MODX.Pro #25216 (апрель 2025, MiniShop3 1.0.0-alpha).
Шаги воспроизведения
- Создать категорию A (основная) и категорию B.
- Создать товар с
parent = A, опубликовать. - В карточке товара добавить B в дополнительные категории (
ms3_category_members). - На странице категории B вывести
msProductsсparents => id категории B. - Включить
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):
- Разбор
parents/depth/ исключений (-id) вручную (толькоmsCategory). - Выборка
product_idизmsCategoryMemberдля целевых категорий. - WHERE:
(`msProduct`.`parent` IN (...) OR `msProduct`.`id` IN (...)). $scriptProperties['parents'] = 0— отключение parent-фильтра pdoTools.
Предложенное решение
Для пользователей на старых версиях: обновиться до MiniShop3 ≥ 1.2.3.
Для кодовой базы (follow-up):
- ✅ Фикс на витрине уже в
main— закрыть issue после добавления регрессионного покрытия. - Добавить автоматический тест на выборку
msProducts/ SQL-условие сmsCategoryMember(сейчас тестов нет). - Убрать дублирование: вынести общую логику «товары категории (parent + members)» в сервис и использовать в сниппете и в админском гриде (см. [Bug] Грид товаров категории в админке не показывает товары из дополнительных категорий #480).
- В документации (
docs.modx.pro) явно описать поведениеparentsи дополнительных категорий.
Связанные issues
- [Bug] Грид товаров категории в админке не показывает товары из дополнительных категорий #480 — та же проблема в админском гриде товаров категории (
CategoryProductsListService), там фикса ещё нет.
Проверка после обновления
showLog=1под mgr — в SQL должен бытьOR msProduct.id IN (...).- Запись в
ms3_category_membersдля пары(product_id, category_id). - При
showZeroPrice=0товары с нулевой ценой по-прежнему скрываются (это ожидаемо, не баг).
Activity
fix(mgr): complete category grid scope for additional categories
fix(mgr): complete category grid scope for additional categories
fix(stan): align msProducts scope DI with PHPStan baseline
refactor(products): drop dead isProductInCategory() method
fix(mgr): complete category grid scope for additional categories
fix(stan): align msProducts scope DI with PHPStan baseline
refactor(products): drop dead isProductInCategory() method
fix(mgr): complete category grid scope for additional categories
fix(stan): align msProducts scope DI with PHPStan baseline
refactor(products): drop dead isProductInCategory() method
fix(mgr): complete category grid scope for additional categories
fix(stan): align msProducts scope DI with PHPStan baseline
refactor(products): drop dead isProductInCategory() method
fix(mgr): complete category grid scope for additional categories
fix(stan): align msProducts scope DI with PHPStan baseline
refactor(products): drop dead isProductInCategory() method
fix(mgr): complete category grid scope for additional categories
fix(stan): align msProducts scope DI with PHPStan baseline
refactor(products): drop dead isProductInCategory() method
fix(mgr): complete category grid scope for additional categories
fix(stan): align msProducts scope DI with PHPStan baseline
refactor(products): drop dead isProductInCategory() method
fix(mgr): complete category grid scope for additional categories
fix(stan): align msProducts scope DI with PHPStan baseline
refactor(products): drop dead isProductInCategory() method
fix(products): дополнительные категории в msProducts и гриде категории (
chore: sync beta with upstream modx-pro/MiniShop3 (#1)