Frage

Ich bin mir nicht sicher, was die Dok sagen.

Ich weiß, dass sie verwendet werden, um Attribute (komplex oder nicht) über hinzuzufügen etc/extension_attributes.xml und ich habe es geschafft, dass der Kompilierungsprozess eine Schnittstelle mit automatisch generierten benutzerdefinierten Methoden erstellt, aber das war's auch schon.

Nehmen wir zum Beispiel ein paar Schnittstellen: github Verknüpfung 1 und github Verknüpfung 2.Wie kann ich Erweiterungsattribute verwenden, um bestimmte Attribute in einer dieser Schnittstellen hinzuzufügen?Ich interessiere mich nicht für komplexe Verknüpfungen.Fügen Sie einfach ein skalares Attribut hinzu, sagen Sie "attr1" vom Typ string.

Der Data schnittstellen sind das Tor zum ERM des Modells...daten, also muss ich verstehen, wie die Erweiterung dieser Schnittstellen funktioniert, um das System richtig zu nutzen.Ich bekomme häufig eine Data schnittstelle als Parameter anstelle eines tatsächlichen Modells, und das ist eigentlich in Ordnung.Aber ich bin etwas verwirrt darüber, wie die Erweiterungen funktionieren.

War es hilfreich?

Lösung

Erweiterungsattribut ist eine Möglichkeit, die Schnittstelle zu erweitern.Nehmen wir als Beispiel den ersten Link, den Sie zum ProductAttributeMediaGalleryEntryInterface bereitgestellt haben.Wenn Sie sich dort Methoden ansehen, werden Sie sehen, dass es diese Methode hat

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

Beachten Sie den @return-Typ der Methode ProductAttributeMediaGalleryEntryExtensionInterface - dies ist eine Schnittstelle, die neu generiert wird, wenn Sie das Erweiterungsattribut für ProductAttributeMediaGalleryEntryInterface definieren (standardmäßig wird es ohne Methoden leer generiert).Der Name des von Ihnen registrierten Attributs wird zum Erstellen von Schnittstellenmethoden verwendet.

Nehmen wir an, Sie haben attr1 vom Typ string hinzugefügt.Nachdem die Schnittstelle neu generiert wurde, können Sie über die Instanz der Schnittstelle darauf zugreifen.

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

Um das Attribut festzulegen, müssten Sie die Schnittstelle für Erweiterungsattribute instanziieren

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

Letzteres ist als Standardszenario verfügbar und kann je nach Implementierung von ExtensionInterface und übergeordneter Schnittstelle vereinfacht werden.

[Aktualisiert]

Benutzerdefinierte Attribute und Erweiterungsattribute dienen unterschiedlichen Zwecken.

Benutzerdefinierte Attribute werden benötigt, um die EAV-Attribute der Entität darzustellen.Die meisten EAV-Attribute sind dynamisch:sie können hinzugefügt werden, nachdem Magento über die Admin-Benutzeroberfläche bereitgestellt wurde.Aus diesem Grund können Sie keine automatische Code-Vervollständigung für EAV-Attribute erhalten:sie wissen nicht alles im Voraus.

Als Erweiterungsentwickler kennen Sie jedoch einige Attribute mit Sicherheit - die, die Sie zur Entwicklungszeit erstellt haben.Dies kann ein neues Feld in der Datenbank, ein Feld in der zugehörigen Datenbank oder ein EAV-Attribut sein.Sie können sie als Erweiterungsattribut registrieren, da sie sich nur ändern, wenn die Codebasis geändert wird.Sie können die automatische Vervollständigung von Code für sie erhalten.

Andere Tipps

Um die Antwort von @EugeneTulika zu vervollständigen, müssen wir /etc/extension_attributes erstellen.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>

Dann können Sie Ihr neues Attribut mit der Methode setAttr1 () wie folgt festlegen:

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

Hoffe, das kann auch jemandem helfen :)

Werden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top