Описание проблемы
Товары, добавленные в категорию через вкладку «Категории» (галочки / дополнительные категории), не имеют отдельного menuindex в контексте этой категории.
У товара один глобальный menuindex в ресурсе (site_content / msProduct). Связь с доп. категориями хранится в ms3_product_categories (msCategoryMember) только как пара product_id + category_id — поля порядка нет.
Из-за этого нельзя независимо выстроить выкладку одного и того же товара в разных категориях.
Шаги воспроизведения
- Создать категорию A (основную) и категории B, C.
- Создать товары в категории A.
- На вкладке «Категории» у товаров отметить галочками категории B и/или C.
- Открыть категорию B (или C) в менеджере → грид товаров.
- Попытаться задать порядок выкладки (DnD /
menuindex) отдельно от категории A и от других категорий.
- На витрине вывести товары категории B через
ms3_products с сортировкой по menuindex.
Ожидаемое поведение
- Для каждой пары «товар ↔ категория» (включая дополнительные категории) можно задать свой порядок.
- DnD / изменение порядка в категории B не ломает порядок в категории A (и наоборот).
- На витрине при
&sortby=menuindex`` порядок в категории учитывает контекст этой категории, а не только основной parent товара.
Фактическое поведение
ms3_product_categories хранит только product_id и category_id — без menuindex.
ProductDataService::saveCategories() сохраняет список id категорий ([3,4,27]), без порядка.
CategoryProductsController::sort пишет в глобальный msProduct.menuindex ресурса.
- Грид категории (
CategoryProductsListService) показывает только товары с parent в этой категории; товары, попавшие только через msCategoryMember, в гриде не видны — настроить их выкладку в этой категории нельзя.
ms3_products подтягивает товары из доп. категорий через msCategoryMember, но сортирует по обычному menuindex/id товара, без порядка на категорию.
Скриншоты
Не применимо (проблема модели данных / API, воспроизводится по шагам выше).
Окружение
- MiniShop3: текущая
beta (ветка modx-pro/MiniShop3)
- MODX: 3.x
- PHP: 8.x
- MySQL: 8.x
- Браузер: не зависит от браузера
Логи ошибок
Логи из core/cache/logs/error.log
Ошибок в логе нет — это ограничение модели данных, а не runtime-exception.
Дополнительный контекст
Затронутые места в коде (актуально на beta):
- Модель:
core/components/minishop3/src/Model/mysql/msCategoryMember.php — поля только product_id, category_id
- Сохранение категорий:
ProductDataService::saveCategories()
- Сортировка в админке:
CategoryProductsController::sort → msProduct.menuindex
- Список в гриде категории:
CategoryProductsListService (фильтр по parent, без join к msCategoryMember)
- Витрина:
elements/snippets/ms3_products.php (OR по member ids, sort без per-category index)
Возможное направление фикса (для обсуждения):
- Добавить
menuindex в ms3_product_categories (или отдельную таблицу (product_id, category_id, menuindex)).
- Учитывать его в DnD/API грида категории и в
ms3_products при сортировке по menuindex в контексте категории.
- Для «родных» товаров (
parent = категория) можно оставить текущий msProduct.menuindex; для «чужих» — значение из связи.
Наследие MS2: у товара один menuindex на ресурс при множественных категориях; в MS3 схема связи не расширена.
Описание проблемы
Товары, добавленные в категорию через вкладку «Категории» (галочки / дополнительные категории), не имеют отдельного
menuindexв контексте этой категории.У товара один глобальный
menuindexв ресурсе (site_content/msProduct). Связь с доп. категориями хранится вms3_product_categories(msCategoryMember) только как параproduct_id+category_id— поля порядка нет.Из-за этого нельзя независимо выстроить выкладку одного и того же товара в разных категориях.
Шаги воспроизведения
menuindex) отдельно от категории A и от других категорий.ms3_productsс сортировкой поmenuindex.Ожидаемое поведение
&sortby=menuindex`` порядок в категории учитывает контекст этой категории, а не только основнойparentтовара.Фактическое поведение
ms3_product_categoriesхранит толькоproduct_idиcategory_id— безmenuindex.ProductDataService::saveCategories()сохраняет список id категорий ([3,4,27]), без порядка.CategoryProductsController::sortпишет в глобальныйmsProduct.menuindexресурса.CategoryProductsListService) показывает только товары сparentв этой категории; товары, попавшие только черезmsCategoryMember, в гриде не видны — настроить их выкладку в этой категории нельзя.ms3_productsподтягивает товары из доп. категорий черезmsCategoryMember, но сортирует по обычномуmenuindex/idтовара, без порядка на категорию.Скриншоты
Не применимо (проблема модели данных / API, воспроизводится по шагам выше).
Окружение
beta(веткаmodx-pro/MiniShop3)Логи ошибок
Логи из core/cache/logs/error.log
Дополнительный контекст
Затронутые места в коде (актуально на
beta):core/components/minishop3/src/Model/mysql/msCategoryMember.php— поля толькоproduct_id,category_idProductDataService::saveCategories()CategoryProductsController::sort→msProduct.menuindexCategoryProductsListService(фильтр поparent, без join кmsCategoryMember)elements/snippets/ms3_products.php(OR по member ids, sort без per-category index)Возможное направление фикса (для обсуждения):
menuindexвms3_product_categories(или отдельную таблицу(product_id, category_id, menuindex)).ms3_productsпри сортировке поmenuindexв контексте категории.parent = категория) можно оставить текущийmsProduct.menuindex; для «чужих» — значение из связи.Наследие MS2: у товара один
menuindexна ресурс при множественных категориях; в MS3 схема связи не расширена.