Pregunta

No estoy seguro de cuál es docs están diciendo.

Sé que se usan para agregar atributos (complejos o no) a través de etc/extension_attributes.xml y yo logré hacer que el proceso de compilación cree una interfaz con métodos personalizados de generación automática, pero eso es aproximadamente.

Tomemos por ejemplo un par de interfaces: github link 1 y github link 2 . ¿Cómo puedo usar los atributos de extensión para agregar ciertos atributos en una de esas interfaces? No estoy interesado en uniones complejas. Sólo agregar un atributo escalar, digamos "attr1" de tipo string.

Las interfaces de Data son la puerta de enlace a los datos de ERM ..., por lo que necesito entender cómo funcionan la extensión de esas interfaces para usar correctamente el sistema. Con frecuencia recibo una interfaz Data como un parámetro en lugar de un modelo real, y eso está bien en realidad. Pero estoy un poco confundido sobre cómo funcionan las extensiones.

¿Fue útil?

Solución

El atributo de extensión es una forma de extender la interfaz. Tomemos como ejemplo el primer enlace que proporcionó al ProductATtributeMediaGalleryEntryInterface. Si observa los métodos allí, verá que tiene este método

/**
 * Retrieve existing extension attributes object or create a new one.
 *
 * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryExtensionInterface|null
 */
public function getExtensionAttributes();

Nota del tipo @Return del método ProductAtTrigaMediaGalleryEntryextensionInterface: esta es una interfaz que se volvería a generar si define el atributo de extensión para productAtributeMediaGalleryEntryinterface (por defecto se genera vacío sin métodos). El nombre del atributo que registró se utilizará para crear métodos de interfaz.

Asumamos que agregó ATTR1 de tipo de cadena. Lo que puede hacer después de que la interfaz se regenera es acceder a ella desde la instancia de la interfaz.

$entity = $objectManager->get('..\ProductAttributeMediaGalleryEntryInterface')
$entity->getExtensionAttributes()->getAttr1();

Para establecer el atributo, debería instantizar la interfaz de atributos de extensión

$extension = $objectManager->get('..\ProductAttributeMediaGalleryEntryExtensionInterface')
$extension->setAttr1('value');
$entity->setExtensionAttributes($extension)

Este último es un escenario predeterminado disponible, podría simplificarse dependiendo de cómo se implementan la interfaz de la extensión y la interfaz de los padres.

[Actualizado]

Los atributos personalizados y los atributos de extensión sirven propósitos diferentes.

Se necesitan atributos personalizados para representar los atributos de EAV de la entidad. La mayoría de los atributos de EAV son dinámicos: se pueden agregar después de que Magento se despliegue a través de la UI de administración. Es por eso que no puede obtener la finalización automática de código para los atributos de EAV: no sabe acerca de todos ellos con anticipación.

Sin embargo, como desarrollador de extensión, usted sabe acerca de algunos atributos con seguridad: los que creó en el tiempo de desarrollo. Puede ser un nuevo campo en la base de datos, el campo en la base de datos relacionada o un atributo de EAV. Puede registrarlos como atributo de extensión porque nunca cambian a menos que se cambie la base de código. Puede obtener la finalización automática de código para ellos.

Otros consejos

Para completar la respuesta de @eugenetulika, necesitamos crear /etc/extension_attributes.xml:

<?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\Catalog\Api\Data\ProductInterface">
        <attribute code="attr1" type="string" />
    </extension_attributes>
</config>

Luego, puede configurar su nuevo atributo con el método SetATTR1 (), como a continuación:

/** @var ProductExtension $extensionAttributes */
$extensionAttributes = $product->getExtensionAttributes();
$extensionAttributes->setAttr1('super data');
$product->setExtensionAttributes($extensionAttributes);

Espero que esto también pueda ayudar a alguien :)

will

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top