Skip to content

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

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
    No fields configured for Feature.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions