Wie funktionieren die Erweiterungsattribute in Magento 2?

7

Ich bin mir nicht sicher, was die Dokumente sagen.

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

Nehmen wir zum Beispiel einige Schnittstellen: Github-Link 1 und Github-Link 2 . Wie kann ich Erweiterungsattribute verwenden, um bestimmte Attribute in einer dieser Schnittstellen hinzuzufügen? Ich bin nicht an komplexen Verknüpfungen interessiert. Fügen Sie einfach ein skalares Attribut hinzu, sagen Sie "attr1" vom Typ string.

Die DataSchnittstellen sind das Gateway zu den erm ... -Daten des Modells. Daher muss ich verstehen, wie die Erweiterung dieser Schnittstellen funktioniert, um das System ordnungsgemäß zu verwenden. Ich bekomme häufig eine DataSchnittstelle als Parameter anstelle eines tatsächlichen Modells, und das ist eigentlich in Ordnung. Aber ich bin ein wenig verwirrt darüber, wie die Erweiterungen funktionieren.

nieverstand
quelle

Antworten:

14

Das 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 die Methoden ansehen, werden Sie feststellen, dass diese Methode vorhanden ist

/**
 * 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 sie 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 von der Instanz der Schnittstelle aus 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 ein Standard-Szenario, das je nach Implementierung von ExtensionInterface und übergeordneter Schnittstelle vereinfacht werden kann.

[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 Administrator-Benutzeroberfläche bereitgestellt wurde. Aus diesem Grund können Sie keine automatische Code-Vervollständigung für EAV-Attribute erhalten: Sie kennen nicht alle im Voraus.

Als Erweiterungsentwickler kennen Sie jedoch einige Attribute, 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 des Codes für sie erhalten.

Eugene Tulika
quelle
Viel klarer jetzt, vielen Dank. Jetzt stellen sich alle möglichen anderen Fragen, aber ich werde andere Beiträge für sie erstellen.
Nevvermind
Eigentlich noch eine Frage hier, wenn es Ihnen nichts ausmacht. Wenn Sie ein Produkt mit einem benutzerdefinierten EAV-Attribut speichern, können wir es verwenden setCustomAttribute(), aber ich mag die automatische Vervollständigung, die ich von den automatisch generierten Erweiterungsschnittstellen erhalte. Aber wenn ich das nutzen möchte, muss ich die Erweiterung selbst einstellen . Erweiterungen sind also eher eine manuelle Sache? Vielleicht sagt dies besser, was ich zu sagen versuche: gist.github.com/nevvermind/155952b0b01773f4b42f
nevvermind
Ich habe meine Hauptantwort aktualisiert, um diese Frage zu beantworten. Bitte lassen Sie mich wissen, macht es klarer
Eugene Tulika
Ich denke, "benutzerdefinierte Attribute" und "Erweiterungsattribute" überschneiden sich etwas, da Sie die automatische Vervollständigung für Attribute, die mit der GUI erstellt wurden, oder auch programmgesteuert haben können. Ich denke, sie dienen alle dem gleichen Zweck (Erweiterung der API einer Entität), verhalten sich aber anders (einige haben eine Benutzeroberfläche, andere nicht, andere sind nicht einmal EAV oder bestehen sogar, sondern werden berechnet usw.) - und extension_attributes.xmlkönnen sie alle fangen - wenn du wolltest, das ist. Alles in allem bin ich jetzt zuversichtlich genug, Erweiterungsattrs in Angriff zu nehmen. Herzlichen Dank.
Nevvermind
Ich wollte damit sagen, dass Sie die automatische Vervollständigung für Attribute, die mit der GUI erstellt wurden, oder programmgesteuert haben können, wenn Sie sie in der Datei extension_attributes.xml zuordnen .
Nevvermind
1

Um die @ EugeneTulika-Antwort zu vervollständigen, müssen wir /etc/extension_attributes.xml erstellen:

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

Anschließend 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 :)

Wille

William Rossier
quelle