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), потребовались бы костыли
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" } }LEFT JOIN ms3_product_options AS opt_{key} ON opt_{key}.product_id = msProduct.id AND opt_{key}.key = '{key}'opt_{key}.value AS option_{key}2. CategoryProductsController — поддержка динамических колонок:
OrdersControllerиCustomersController)option-полей и построение JOIN'овformatProduct()3. Vue (CategoryProductsGrid) — колонки option-типа уже будут работать как обычные
model-колонки, дополнительных доработок на фронте не требуется.Ограничения:
valueна товар). Мультизначные опции (ComboMultiple) потребуют агрегации и выходят за рамки этой задачиAlternatives considered
OptionService::loadOptionsForProducts()— проще в реализации, но менее эффективно (доп. запрос) и не поддерживает нативную сортировку/фильтрацию по опцииrelation— не ложится на составной JOIN (product_id + key), потребовались бы костыли