Question

Je ne suis pas sûr de ce que documents disent.

Je sais qu'ils sont utilisés pour ajouter des attributs (complexes ou non) via etc/extension_attributes.xml et j'ai réussi à faire en sorte que le processus de compilation crée une interface avec des méthodes personnalisées de génération automatique, mais c'est tout.

Prenons par exemple quelques interfaces : lien github 1 et lien github 2.Comment puis-je utiliser les attributs d'extension pour ajouter certains attributs dans l'une de ces interfaces ?Je ne suis pas intéressé par les jointures complexes.Il suffit d'ajouter un attribut scalaire, disons "attr1" de type string.

Le Data les interfaces sont la porte d'entrée vers l'erm du modèle...données, j'ai donc besoin de comprendre comment fonctionne l'extension de ces interfaces afin d'utiliser correctement le système.Je reçois fréquemment un Data interface en tant que paramètre au lieu d'un modèle réel, et c'est ok en fait.Mais je suis un peu confus quant au fonctionnement des extensions.

Était-ce utile?

La solution

L'attribut d'extension est un moyen d'étendre l'interface.Prenons comme exemple le premier lien que vous avez fourni vers ProductAttributeMediaGalleryEntryInterface.Si vous regardez les méthodes là-bas, vous verrez qu'il y a cette méthode

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

Notez le type @return de la méthode ProductAttributeMediaGalleryEntryExtensionInterface -- il s'agit d'une interface qui serait régénérée si vous définissez l'attribut d'extension pour ProductAttributeMediaGalleryEntryInterface (par défaut, elle est générée vide sans méthode).Le nom de l'attribut que vous avez enregistré sera utilisé pour créer des méthodes d'interface.

Supposons que vous ayez ajouté attr1 de type chaîne.Ce que vous pouvez faire une fois l'interface régénérée, c'est y accéder à partir de l'instance de l'interface.

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

Pour définir l'attribut, vous devez instancier l'interface des attributs d'extension

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

Ce dernier est le scénario par défaut disponible, il peut être simplifié en fonction de la manière dont ExtensionInterface et l'interface parent sont implémentées.

[Mis à jour]

Les attributs personnalisés et les attributs d'extension servent à des fins différentes.

Des attributs personnalisés sont nécessaires pour représenter les attributs EAV de l'entité.La plupart des attributs EAV sont dynamiques :ils peuvent être ajoutés après le déploiement de Magento via l'interface utilisateur d'administration.C'est pourquoi vous ne pouvez pas obtenir la saisie semi-automatique du code pour les attributs EAV :vous ne les connaissez pas tous à l'avance.

Cependant, en tant que développeur d'extensions, vous connaissez certainement certains attributs : ceux que vous avez créés au moment du développement.Il peut s'agir d'un nouveau champ dans la base de données, d'un champ dans la base de données associée ou d'un attribut EAV.Vous pouvez les enregistrer en tant qu'attribut d'extension car ils ne changent jamais à moins que la base de code ne soit modifiée.Vous pouvez obtenir la saisie semi-automatique du code pour eux.

Autres conseils

Afin de compléter la réponse @EugeneTulika, nous devons créer /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>

Ensuite, vous pouvez définir votre nouvel attribut avec la méthode setAttr1(), comme ci-dessous :

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

J'espère que cela pourra aider quelqu'un aussi :)

Volonté

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top