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.

Foi útil?

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:

  1. 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)
  2. 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
  3. 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
  4. Acesse seu atributo personalizado como: $customerGroup->getExtensionAttributes()->getMyAttribute(), onde customerGroup 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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top