Magento 2 como salvar o campo personalizado adicionado na forma de grupo de clientes?


9

Adicionei alguns campos personalizados ao formulário do grupo de clientes usando upgradeSchema.php.

Depois disso, descobri que os campos originais, como código do grupo de clientes e ID do imposto, são salvos usando métodos setter na API fornecida. É completamente diferente do Magento 1.X que apenas usa setXXX () para salvar.


Eu tentei usar \ Magento \ Customer \ Api \ Data \ GroupInterface $ customerGroup-> setData ('program_type', $ programType); program_type corresponde à coluna da tabela 'program_type' para salvar no banco de dados, mas falhou.
Ricky.C

Devo escrever uma API personalizada com getter e setter para salvar os campos?
Ricky.C

Respostas:


23

O mecanismo de atributos de extensão deve ser usado neste caso. Ele permite a extensão das principais APIs 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 nos documentos oficiais . Após a limpeza vare execução <project_root>/bin/magento setup:di:compile, o setter e o getter correspondentes para esse novo atributo devem aparecer em \Magento\Customer\Api\Data\GroupExtensionInterface(essa interface é gerada automaticamente)
  2. Escrever plugins para \Magento\Customer\Api\GroupRepositoryInterface::save, \Magento\Customer\Api\GroupRepositoryInterface::getById(e quaisquer outros métodos de serviço, conforme necessário) para salvar / novo atributo de carga. Como desenvolvedor de extensões, somente você sabe onde esse atributo deve ser armazenado; pode haver qualquer tabela. Veja \Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSavecomo um exemplo
  3. Se você precisar tornar esse atributo visível na coleção (para torná-lo pesquisável / filtrável), declare o joinnó. Caso contrário, basta pular esta
  4. Acesse seu atributo personalizado como:, $customerGroup->getExtensionAttributes()->getMyAttribute()onde customerGroupimplementa \Magento\Customer\Api\Data\GroupInterface. setMyAttribute()também pode ser usado

Abaixo está o exemplo de configuração que deve ser colocado 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>

Tentei adicionar o extension_attributes.xml, mas nenhuma nova interface é gerada. ps eu excluiu a pasta de geração e invocou alguma operação .....
Ricky.C

My extension_attribute.xml: <? Xml version = "1.0"?> <config> <extension_attributes for = "Magento \ Customer \ Api \ Data \ GroupInterface"> <código do atributo = "group_domain" type = "string" /> </ extension_attributes> </config>
Ricky.C

O arquivo deve ser chamado extension_attributes.xml (plural). Tente invocar a geração de todas as entidades geradas automaticamente usando a CLI.
Alex Paliarush

desculpe pelo erro de digitação no comentário acima, o arquivo Eu tenho realmente é extension_attributes.xml
Ricky.C

Pesquisei no Google, mas não encontrei nada. Você pode me informar qual comando deve ser usado? Eu sou um novato que não é familiar para o CLI. Obrigado.
precisa saber é o seguinte

2

Não esqueça que um módulo precisa de um register.phparquivo e você deve usá- bin/magento module:enable VendorName_ModuleNamelo antes que ele apareça!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.