Magento 2 como salvar o campo personalizado adicionado na forma de grupo de clientes?
-
13-12-2019 - |
Pergunta
Adicionei alguns campos personalizados ao formulário de grupo de clientes usando upgradeSchema.php
.
Depois disso, descobri que os campos originais, como código do grupo de clientes e identificação fiscal, são salvos usando métodos setter na API fornecida.É completamente diferente do Magento 1.X que apenas usa setXXX() para salvar.
Solução
O mecanismo de atributos de extensão deve ser usado neste caso.Ele permite a extensão de APIs principais por módulos de terceiros.Etapas genéricas para ativar o novo atributo de extensão:
- Declare o atributo de extensão conforme descrito no documentos oficiais.Depois de limpar
var
e correndo<project_root>/bin/magento setup:di:compile
, o setter e o getter correspondentes para este novo atributo devem aparecer em\Magento\Customer\Api\Data\GroupExtensionInterface
(esta interface é gerada automaticamente) - Escreva plug-ins para
\Magento\Customer\Api\GroupRepositoryInterface::save
,\Magento\Customer\Api\GroupRepositoryInterface::getById
(e quaisquer outros métodos de serviço conforme necessário) para salvar/carregar novo atributo.Como desenvolvedor de extensões, só você sabe onde esse atributo deve ser armazenado, pode ser qualquer tabela.Ver\Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSave
como um exemplo - Se você precisar tornar este atributo visível na coleção (para torná-lo pesquisável/filtrável), declare
join
nó.Se não, basta pular isso - Acesse seu atributo personalizado como:
$customerGroup->getExtensionAttributes()->getMyAttribute()
, ondecustomerGroup
implementos\Magento\Customer\Api\Data\GroupInterface
.setMyAttribute()
pode ser usado também
Abaixo está o exemplo de configuração que deve ser colocada em 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>
Outras dicas
Não se esqueça que um módulo precisa de um register.php
arquivo nele, e você deve usar bin/magento module:enable VendorName_ModuleName
antes que apareça!