Проблема
Утилита импорта товаров не учитывает поля, добавленные через расширение модели. На стороне админ-карточки товара такие поля заполняются, но из CSV их значения не подхватываются — поле не появляется в списке маппинга, импорт молча пропускает столбец.
Какие способы расширения затронуты
В MS3 для расширения хранилища товара есть несколько механизмов, и все они не покрываются текущим импортом:
msExtraField (основное) — Утилиты MS3 → «Дополнительные поля». Через UI добавляются колонки к msProduct / msProductData (и другим моделям) с указанием dbtype, phptype, default, xtype. Поле сразу становится доступно в админ-карточке.
- Object Extension — отдельный механизм MS3 для расширения схемы. Используется реже, чем
msExtraField, но тоже добавляет колонки.
- Прямое редактирование xPDO-схемы (кастомизация на уровне разработчика) — экзотика, можно отложить.
Где в коде проблема
core/components/minishop3/config/import-fields.php — статический список:
return [
'resource' => [ /* fixed list: pagetitle, alias, parent, ... */ ],
'product_data' => [ /* fixed list: price, weight, stock, ... */ ],
'special' => [ /* gallery */ ],
'prefixes' => [
'tv' => [...],
'option' => [...],
],
];
Нигде в ImportCSV.php, Processors/Utilities/Import/ или vueManager/src/components/ImportProducts.vue нет упоминаний msExtraField или Object Extension. То есть динамические поля для импорта не предлагаются.
Воздействие
- Магазины, использующие
msExtraField для расширения товаров (типовой кейс), теряют значения этих полей при импорте из CSV.
- Workaround сейчас — заполнять кастомные поля руками после импорта. Для каталогов на десятки тысяч SKU это нереально.
Предлагаемое решение
1. Backend — динамически дополнять список полей
При формировании конфигурации импорта (вероятно в процессоре, который отдаёт данные для Vue):
- Загрузить
msExtraField через ExtraFieldsService::getFields(['class' => 'msProduct']) и class = 'msProductData'.
- Сформировать дополнительную группу
extra (или вписать в существующие resource / product_data в зависимости от того, какую модель расширяет каждое поле).
- Те же действия для Object Extension (если получится унифицировать API).
Структура import-fields.php остаётся базой, она объединяется с динамическим набором уже на этапе формирования ответа для Vue.
2. ImportCSV — сохранение значений
В ImportCSV::import() для каждого extra-field имени:
- Определять модель назначения (msProduct vs msProductData) по
class-полю extra-field.
- Кастовать значение по
phptype метаданных.
- Сохранять через
$product->set($field, $value) или $productData->set($field, $value) в соответствующий объект.
3. Vue — отрисовка и автомаппинг
В ImportProducts.vue:
- Расширить список целевых полей за счёт динамической группы.
- Расширить
autoMapFields — пробовать сопоставлять заголовки CSV (с lowercased/normalized сравнением) с именами extra-field.
4. Опционально — Vue-маппинг через префикс
Альтернатива #1: ввести префикс extra.fieldname (по аналогии с tv.* и option.*). Тогда пользователь видит группу «Дополнительные поля» сразу, без зависимости от того, какие extra-fields определены в системе. Простой автомаппинг по точному совпадению имени.
Этот подход проще для backend (один префикс vs пер-полевой список) и согласуется с существующим паттерном.
Открытые вопросы
Связанные
Проблема
Утилита импорта товаров не учитывает поля, добавленные через расширение модели. На стороне админ-карточки товара такие поля заполняются, но из CSV их значения не подхватываются — поле не появляется в списке маппинга, импорт молча пропускает столбец.
Какие способы расширения затронуты
В MS3 для расширения хранилища товара есть несколько механизмов, и все они не покрываются текущим импортом:
msExtraField(основное) — Утилиты MS3 → «Дополнительные поля». Через UI добавляются колонки кmsProduct/msProductData(и другим моделям) с указаниемdbtype,phptype,default,xtype. Поле сразу становится доступно в админ-карточке.msExtraField, но тоже добавляет колонки.Где в коде проблема
core/components/minishop3/config/import-fields.php— статический список:Нигде в
ImportCSV.php,Processors/Utilities/Import/илиvueManager/src/components/ImportProducts.vueнет упоминанийmsExtraFieldили Object Extension. То есть динамические поля для импорта не предлагаются.Воздействие
msExtraFieldдля расширения товаров (типовой кейс), теряют значения этих полей при импорте из CSV.Предлагаемое решение
1. Backend — динамически дополнять список полей
При формировании конфигурации импорта (вероятно в процессоре, который отдаёт данные для Vue):
msExtraFieldчерезExtraFieldsService::getFields(['class' => 'msProduct'])иclass = 'msProductData'.extra(или вписать в существующиеresource/product_dataв зависимости от того, какую модель расширяет каждое поле).Структура
import-fields.phpостаётся базой, она объединяется с динамическим набором уже на этапе формирования ответа для Vue.2.
ImportCSV— сохранение значенийВ
ImportCSV::import()для каждого extra-field имени:class-полю extra-field.phptypeметаданных.$product->set($field, $value)или$productData->set($field, $value)в соответствующий объект.3. Vue — отрисовка и автомаппинг
В
ImportProducts.vue:autoMapFields— пробовать сопоставлять заголовки CSV (с lowercased/normalized сравнением) с именами extra-field.4. Опционально — Vue-маппинг через префикс
Альтернатива #1: ввести префикс
extra.fieldname(по аналогии сtv.*иoption.*). Тогда пользователь видит группу «Дополнительные поля» сразу, без зависимости от того, какие extra-fields определены в системе. Простой автомаппинг по точному совпадению имени.Этот подход проще для backend (один префикс vs пер-полевой список) и согласуется с существующим паттерном.
Открытые вопросы
extra.*(опция Исправил ошибки в работе галереи в редактировании товара #4)? Опция Первые работы над контроллером Delivery и Utils/Services #1 даёт явный список с подписями, опция Исправил ошибки в работе галереи в редактировании товара #4 — более лаконичный UI, но требует от пользователя знания имён extra-field.ExtraFieldsServiceили нужна отдельная ветка для каждого механизма?updateрежиме (обновлять существующий товар) — должна ли extra-field затирать существующее значение при пустом значении в CSV или пропускать? Скорее всего пропускать (как сейчас работает для основных полей).Связанные
stock/remainsв статический список. Похожий по природе fix, но точечный для одного поля. Этот issue — более системная задача: динамика для произвольных кастомных полей.ExtraFieldsService, что и дляValidationRulesEditor(PR feat(vue): extend delivery validation rules field picker #247) — переиспользуем существующую инфраструктуру.