Magento 2, как сохранить добавленное поле в виде группы клиентов?

9

Я добавил несколько пользовательских полей в форму группы клиентов, используя upgradeSchema.php.

После этого я обнаружил, что исходные поля, такие как код группы клиентов и налоговый идентификатор, сохраняются с помощью методов установки в предоставленном API. Он полностью отличается от Magento 1.X, который просто использует setXXX () для сохранения.

Ricky.C
источник
Я пытался использовать \ Magento \ Customer \ Api \ Data \ GroupInterface $ customerGroup-> setData ('program_type', $ programType); Тип_программы соответствует столбцу таблицы «тип_программы» для сохранения в базе данных, но не удалось.
Ricky.C
Должен ли я написать собственный API с getter и setter для сохранения полей?
Ricky.C

Ответы:

23

В этом случае следует использовать механизм атрибутов расширения. Это позволяет расширять основные API сторонними модулями. Общие шаги для включения нового атрибута расширения:

  1. Объявите атрибут расширения, как описано в официальных документах . После очистки varи запуска <project_root>/bin/magento setup:di:compileсоответствующие установщик и получатель для этого нового атрибута должны появиться в \Magento\Customer\Api\Data\GroupExtensionInterface(этот интерфейс генерируется автоматически)
  2. Писать плагин для \Magento\Customer\Api\GroupRepositoryInterface::save, \Magento\Customer\Api\GroupRepositoryInterface::getById(и любых других методов обслуживания по мере необходимости) , чтобы сохранить / новый атрибут нагрузки. Как разработчик расширения, только вы знаете, где этот атрибут должен храниться, может быть любая таблица. Смотри \Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSaveкак пример
  3. Если вам нужно сделать этот атрибут видимым в коллекции (чтобы сделать его доступным для поиска / фильтрации), объявите joinузел. Если нет, то просто пропустите
  4. Получите доступ к своему пользовательскому атрибуту как:, $customerGroup->getExtensionAttributes()->getMyAttribute()где customerGroupреализует \Magento\Customer\Api\Data\GroupInterface. setMyAttribute()также может быть использован

Ниже приведен пример конфигурации, которая должна быть VendorName/ModuleName/etc/extension_attributes.xml

<?xml version="1.0"?>
<config>
    <extension_attributes for="Magento\Customer\Api\Data\GroupInterface">
        <!--Data interface can be used as a type of attribute, see example in CatalogInventory module-->
        <attribute code="name_of_attribute" type="string">
            <resources>
                <resource ref="VendorName_ModuleName::someAclNode"/>
            </resources>
            <!--Join is optional, only if you need to have added attribute visible in groups list-->
            <join reference_table="table_where_attribute_is_stored" reference_field="group_id_field_in_that_table" join_on_field="group_id">
                <field>name_of_added_attribute_field_in_that_table</field>
            </join>
        </attribute>
    </extension_attributes>
</config>
Алекс Палиаруш
источник
Я пытался добавить extension_attributes.xml, но новый интерфейс не создавался. ps Я удалил папку генерации и вызвал некоторую операцию .....
Ricky.C
Мой extension_attribute.xml: <? Xml version = "1.0"?> <Config> <extension_attributes for = "Magento \ Customer \ Api \ Data \ GroupInterface"> <attribute code = "group_domain" type = "string" /> </ extension_attributes> </ config>
Ricky.C
Файл должен называться extension_attributes.xml (множественное число). Попробуйте вызвать генерацию всех автоматически сгенерированных объектов, используя CLI.
Алекс Палиаруш
извините за опечатку в приведенном выше комментарии, файл, который у меня есть на самом деле, является extension_attributes.xml
Ricky.C
Я погуглил, но ничего не нашел. Можете ли вы дать мне знать, какую команду следует использовать? Я новичок, который не знаком с Кли. Спасибо.
Ricky.C
2

Не забывайте, что модулю нужен register.phpфайл, и вы должны использовать bin/magento module:enable VendorName_ModuleNameего до того, как он появится!

GuruBob
источник