Skip to content

[Feature] Импорт товаров — поддержка полей из msExtraField и Object Extension #291

@biz87

Description

@biz87

Проблема

Утилита импорта товаров не учитывает поля, добавленные через расширение модели. На стороне админ-карточки товара такие поля заполняются, но из CSV их значения не подхватываются — поле не появляется в списке маппинга, импорт молча пропускает столбец.

Какие способы расширения затронуты

В MS3 для расширения хранилища товара есть несколько механизмов, и все они не покрываются текущим импортом:

  1. msExtraField (основное) — Утилиты MS3 → «Дополнительные поля». Через UI добавляются колонки к msProduct / msProductData (и другим моделям) с указанием dbtype, phptype, default, xtype. Поле сразу становится доступно в админ-карточке.
  2. Object Extension — отдельный механизм MS3 для расширения схемы. Используется реже, чем msExtraField, но тоже добавляет колонки.
  3. Прямое редактирование 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 пер-полевой список) и согласуется с существующим паттерном.

Открытые вопросы

Связанные

  • PR fix(import): add stock/remains field to product import (#283) #290 — добавление stock/remains в статический список. Похожий по природе fix, но точечный для одного поля. Этот issue — более системная задача: динамика для произвольных кастомных полей.
  • Если используется тот же ExtraFieldsService, что и для ValidationRulesEditor (PR feat(vue): extend delivery validation rules field picker #247) — переиспользуем существующую инфраструктуру.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions