Cómo usar extension_attributes en Magento2

Respuestas:

18

Supongamos que creamos una fecha de entrega del pedido, cuando el cliente selecciona el envío, el cliente puede seleccionar una fecha de entrega. Por lo tanto, puede crear un atributo de extensión para \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface de la siguiente manera


<?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>

Entonces ahora puede acceder a este valor cuando usa \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface como di.

Entonces, en ese caso, Magento \ Checkout \ Model \ ShippingInformationManagement esta clase usa \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface como parámetros para el método saveAddressInformation. Para que pueda acceder de la siguiente manera:


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

Para más detalles (Documentación oficial de Magento 2)

Aquí hay un ejemplo:

atributos_extensión

Seleccionar el valor de los atributos de extensión

[Actualizar]

Puede establecer extension_attributes mediante el método setExtensionAttributes . La siguiente clase es un ejemplo: haga clic aquí

Sohel Rana
fuente
Entonces, ¿para qué sirve setExtensionAttributes?
Phoenix128_RiccardoT
Actualicé con un ejemplo real
Sohel Rana
Genial, pero falta una cosa aquí: ¿dónde se almacenan exactamente los atributos de extensión? ¿Tengo que proporcionar el código para guardar y recuperar atributos yo mismo o Magento puede manejar eso (como con los atributos personalizados)?
Martin Wickman
¿Entiendo correctamente que los complementos son obligatorios para extension_attributesque funcionen? Por ejemplo, ¿siempre tengo que agregar un complemento afterLoadpara clientes si quiero tener un atributo personalizado para clientes? Me parece un poco sobrecargado ...
Giel Berkers
1
@MartinWickman sí, es responsabilidad del desarrollador implementar la lógica para recuperar y conservar los datos de los atributos de extensión. El concepto es que tiene algunos datos posiblemente complejos introducidos por su Módulo para Entidades de Producto y estos datos pueden provenir de una o más tablas de base de datos, o alguna otra fuente de datos, no debería importar. Usando el sistema Plugin, diríjase a los métodos de carga del ProductRepository (por ejemplo, afterGet, afterGetList). Aquí, recupera sus datos (de donde sea) y los agrega a los atributos de extensión de la entidad. Esto parece arduo pero es muy flexible y poderoso.
John Hall