Magento 2, как сохранить настраиваемое поле, добавленное в форме группы клиентов?
-
13-12-2019 - |
Вопрос
Я добавил несколько настраиваемых полей в форму группы клиентов, используя upgradeSchema.php
.
После этого я обнаружил, что исходные поля, такие как код группы клиентов и идентификатор налога, сохраняются с помощью методов установки в предоставленном API.Он полностью отличается от Magento 1.X, в котором для сохранения используется только setXXX().
Решение
В этом случае следует использовать механизм атрибутов расширения.Это позволяет расширять основные API с помощью сторонних модулей.Общие шаги для включения нового атрибута расширения:
- Объявите атрибут расширения, как описано в разделе официальные документы.После очистки
var
и бег<project_root>/bin/magento setup:di:compile
, соответствующие установщик и геттер для этого нового атрибута должны появиться в\Magento\Customer\Api\Data\GroupExtensionInterface
(этот интерфейс генерируется автоматически) - Пишите плагины для
\Magento\Customer\Api\GroupRepositoryInterface::save
,\Magento\Customer\Api\GroupRepositoryInterface::getById
(и любые другие методы обслуживания, если необходимо) для сохранения/загрузки нового атрибута.Как разработчик расширения, только вы знаете, где должен храниться этот атрибут, это может быть любая таблица.Видеть\Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSave
В качестве примера - Если вам нужно сделать этот атрибут видимым в коллекции (чтобы сделать его доступным для поиска/фильтрации), объявите
join
узел.Если нет, то просто пропустите это - Получите доступ к своему пользовательскому атрибуту как:
$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>
Другие советы
Не забывайте, что модуль нуждается в register.php
файл в нем, и вы должны использовать bin/magento module:enable VendorName_ModuleName
прежде чем оно появится!