-
Notifications
You must be signed in to change notification settings - Fork 8
Description
Feature description
Добавить возможность выводить опции товара как колонки в таблице товаров категории (category-products grid).
Сейчас таблица товаров отображает только поля из msProduct и msProductData (цена, артикул, вес и т.д.). Опции товара (ms3_product_options) в таблице недоступны — для просмотра значения нужно заходить в карточку каждого товара.
На практике одиночные опции (длина, ширина, материал и т.п.) часто нужны для быстрого просмотра и сравнения товаров прямо в списке.
Proposed solution
Добавить новый тип поля option в систему Grid Config, который делает LEFT JOIN на ms3_product_options по конкретному ключу опции.
Что нужно доработать:
1. GridConfigService — новый тип option:
- Конфигурация:
{ "type": "option", "option": { "key": "length" } } - JOIN:
LEFT JOIN ms3_product_options AS opt_{key} ON opt_{key}.product_id = msProduct.id AND opt_{key}.key = '{key}' - SELECT:
opt_{key}.value AS option_{key}
2. CategoryProductsController — поддержка динамических колонок:
- Загрузка grid config (как уже сделано в
OrdersControllerиCustomersController) - Извлечение
option-полей и построение JOIN'ов - Включение значений в ответ
formatProduct()
3. Vue (CategoryProductsGrid) — колонки option-типа уже будут работать как обычные model-колонки, дополнительных доработок на фронте не требуется.
Ограничения:
- Поддерживаются только одиночные опции (один
valueна товар). Мультизначные опции (ComboMultiple) потребуют агрегации и выходят за рамки этой задачи - Сортировка и фильтрация по опциям — в рамках этой же задачи через стандартные механизмы SQL
Alternatives considered
- Computed fields с пакетной загрузкой через
OptionService::loadOptionsForProducts()— проще в реализации, но менее эффективно (доп. запрос) и не поддерживает нативную сортировку/фильтрацию по опции - Расширение типа
relation— не ложится на составной JOIN (product_id + key), потребовались бы костыли