Como usar extension_attributes no Magento2

Respostas:

18

Suponhamos que criamos uma data de entrega do pedido, quando o cliente selecionar a remessa, o cliente poderá selecionar uma data de entrega. Para criar um atributo de extensão para \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface da seguinte maneira


<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
    <extension_attributes for="Magento\Checkout\Api\Data\ShippingInformationInterface">
        <attribute code="delivery_date" type="string"/>
    </extension_attributes>
</config>

Portanto, agora você pode acessar esse valor ao usar \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface como di.

Portanto, nesse caso, Magento \ Checkout \ Model \ ShippingInformationManagement, esta classe usa \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface como parâmetros para o método saveAddressInformation. Para que você possa acessar da seguinte maneira:


$extAttributes = $addressInformation->getExtensionAttributes();
$deliveryDate = $extAttributes->getDeliveryDate();

Para mais detalhes (Magento 2 Official Documentation)

Aqui está um exemplo:

extension_attributes

Escolher valor dos atributos de extensão

[Atualizar]

Você pode definir extension_attributes pelo método setExtensionAttributes . A seguir, a classe é um exemplo: Clique aqui

Sohel Rana
fonte
Então, para que serve setExtensionAttributes?
Phoenix128_RiccardoT
Eu atualizei com exemplo real
Sohel Rana
Ótimo, mas falta uma coisa aqui: onde exatamente são armazenados os atributos de extensão? Preciso fornecer código para salvar e recuperar atributos sozinho ou o Magento pode lidar com isso (como nos atributos personalizados)?
Martin Wickman
Entendo corretamente que os plugins são obrigatórios extension_attributespara funcionar? Por exemplo, eu sempre tenho que adicionar um plug-in afterLoadpara os clientes se quiser ter um atributo personalizado para os clientes? Parece um pouco em cima de mim ...
Giel Berkers
1
@MartinWickman sim, é de responsabilidade do desenvolvedor implementar a lógica para recuperar e persistir os dados dos atributos de extensão. O conceito é que você possui alguns dados possivelmente complexos introduzidos pelo Módulo para Entidades do Produto e esses dados podem vir de uma ou mais tabelas do banco de dados ou de alguma outra fonte de dados, isso não deve importar. Usando o sistema Plugin, direcione os métodos de carregamento do ProductRepository (por exemplo, afterGet, afterGetList). Aqui, você recupera seus dados (de qualquer lugar) e os adiciona aos ExtensionAttributes da entidade. Isso parece árduo, mas é muito flexível e poderoso.
1911 John Hall