Comment utiliser extension_attributes dans Magento2

Réponses:

18

Supposons que nous créons une date de livraison de la commande, lorsque le client sélectionne l'expédition, le client peut sélectionner une date de livraison. Vous pouvez donc créer un attribut d'extension pour \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface de la manière suivante


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

Alors maintenant, vous pouvez accéder à cette valeur lorsque vous utilisez \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface en tant que di.

Donc, dans ce cas, Magento \ Checkout \ Model \ ShippingInformationManagement cette classe utilise \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface comme paramètres pour la méthode saveAddressInformation. Vous pouvez donc accéder de la manière suivante:


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

Pour plus de détails (documentation officielle de Magento 2)

Voici un exemple:

extension_attributes

Choisir la valeur des attributs d'extension

[Mise à jour]

Vous pouvez définir extension_attributes par la méthode setExtensionAttributes . La classe suivante est un exemple: Cliquez ici

Sohel Rana
la source
Alors, à quoi sert setExtensionAttributes?
Phoenix128_RiccardoT
J'ai mis à jour avec un exemple réel
Sohel Rana
Très bien, mais une chose manque ici: où sont exactement stockés les attributs d'extension? Dois-je fournir du code pour enregistrer et récupérer les attributs moi-même ou Magento peut-il gérer cela (comme avec les attributs personnalisés)?
Martin Wickman
Dois-je comprendre correctement que les plugins sont obligatoires pour extension_attributesfonctionner? Par exemple, dois-je toujours ajouter un plugin afterLoadpour les clients si je veux avoir un attribut personnalisé pour les clients? Cela me semble un peu
trop lourd
1
@MartinWickman oui, il est de la responsabilité du développeur d'implémenter une logique de récupération et de conservation des données d'attribut d'extension. Le concept est que vous avez des données potentiellement complexes introduites par votre module pour les entités produit et que ces données peuvent provenir d'une ou plusieurs tables de base de données ou d'une autre source de données, cela ne devrait pas avoir d'importance. À l'aide du système de plug-in, ciblez les méthodes de chargement du ProductRepository (par exemple, afterGet, afterGetList). Ici, vous récupérez vos données (de n'importe où) et les ajoutez aux ExtensionAttributes de l'entité. Cela semble ardu mais est très flexible et puissant.
John Hall