Skip to content

[Bug] Грид товаров категории в админке не показывает товары из дополнительных категорий #480

Closed

Description

@Ibochkarev

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

В Vue-гриде «Товары категории» (менеджер) не отображаются товары, привязанные к категории только как дополнительной (таблица ms3_category_members, модель msCategoryMember). В карточке товара такая привязка видна, на витрине после фикса #736 сниппета msProducts тоже работает, но в админском гриде категории — нет.

Источник: MODX.Pro #25216 (комментарий пользователя на 1.12.0-beta1, июль 2026).

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

  1. Создать категорию A и категорию B.
  2. Создать товар с основной категорией A.
  3. В карточке товара на вкладке «Категории» отметить категорию B как дополнительную (запись в ms3_category_members).
  4. Открыть категорию B в менеджере → грид товаров категории.
  5. Убедиться, что товар не попадает в список (при nested=0 и nested=1).

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

Грид категории B показывает:

  • товары с parent = B;
  • товары, у которых B указана в ms3_category_members (как на витрине через msProducts и в логике опций через OptionCategoryService::getProductsInCategory()).

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

CategoryProductsListService::buildProductListQuery() фильтрует только по msProduct.parent:

if ($nested) {
    $c->where(['msProduct.parent:IN' => $categoryIds]);
} else {
    $c->where(['msProduct.parent' => $categoryId]);
}

Дополнительные категории (msCategoryMember) не учитываются.

Скриншоты

Не приложены.

Окружение

  • MiniShop3: 1.12.0-beta1 и новее (проблема в текущем main)
  • MODX: 3.x
  • PHP: 8.2+
  • MySQL: 5.7+ / MariaDB 10.3+

Логи ошибок

Логи из core/cache/logs/error.log
Ошибок в логах нет — это логическая недоработка выборки, а не исключение runtime.

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

Анализ

Слой Файл Учитывает msCategoryMember
Витрина, msProducts elements/snippets/ms3_products.php ✅ (с ~1.2.3, changelog 2026-01)
Опции / синхронизация Services/Option/OptionCategoryService.php → getProductsInCategory() ✅
Дерево категорий в карточке товара Processors/Category/GetNodes.php ✅
Грид товаров категории Services/Category/CategoryProductsListService.php ❌

При рефакторинге Product\GetList (changelog, удаление non-combo ветки) join с msCategoryMember убрали из legacy-процессора, но в новый CategoryProductsListService эквивалентную логику не перенесли.

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

  1. В CategoryProductsListService::buildProductListQuery() расширить фильтрацию по категории:
    • non-nested: (msProduct.parent = :categoryId OR EXISTS/IN по ms3_category_members WHERE category_id = :categoryId);
    • nested: (msProduct.parent IN (:ids) OR msCategoryMember.category_id IN (:ids)).
  2. Предпочтительно переиспользовать уже существующий метод OptionCategoryService::getProductsInCategory() или вынести общий helper (чтобы не дублировать SQL из сниппета ms3_products.php).
  3. Для COUNT(DISTINCT msProduct.id) и списка без option-колонок учесть возможные дубликаты при JOIN (как уже сделано для option-колонок через GROUP BY msProduct.id).
  4. Проверить связанные операции грида:
    • drag-sort (CategoryProductsController::sort) сейчас ищет товар только с parent = categoryId — для товаров из доп. категорий сортировка может не сработать (отдельный edge case, можно описать в PR).
  5. Добавить unit/integration-тест на выборку товаров категории с msCategoryMember.

Связанные места в коде

  • core/components/minishop3/src/Services/Category/CategoryProductsListService.php — основное место правки
  • core/components/minishop3/src/Services/Option/OptionCategoryService.php — эталонная логика getProductsInCategory()
  • core/components/minishop3/elements/snippets/ms3_products.php — аналогичный workaround для pdoTools на витрине

Activity

  1. Ibochkarev commented on Jul 29, 2026

    @Ibochkarev
    MemberAuthor

    Связанный отчёт по витрине (уже исправлен в ms3_products.php): #481

  2. added a commit that references this issue on Jul 29, 2026
    d5f11d6
  3. Ibochkarev commented on Jul 29, 2026

    @Ibochkarev
    MemberAuthor

    Закрывается в PR #482 (общий CategoryProductScopeService для грида и msProducts).

  4. added 2 commits that reference this issue on Jul 29, 2026
    edaeb0a
    620b1fa
  5. self-assigned this
    on Aug 2, 2026
  6. added 6 commits that reference this issue on Aug 2, 2026
    741c2a6
    6dedb79
    d2fe270
    b8d5265
    d20ee89
    b871024
  7. added a commit that references this issue on Aug 10, 2026
  8. added a commit that references this issue on Aug 21, 2026
    8e3fd16
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