Domanda

Non sono sicuro di cosa sia il Docs stanno dicendo.

So che sono utilizzati per aggiungere attributi (complessi o meno) tramite etc/extension_attributes.xml e sono riuscito a rendere il processo di compilazione creare un'interfaccia con metodi personalizzati generati automaticamente, ma questo è al riguardo.

Prendiamo un paio di interfacce: GitHub Link 1 e GitHub Link 2 . Come posso utilizzare gli attributi di estensione per aggiungere determinati attributi in una di quelle interfacce? Non sono interessato a Joins complessi. Solo aggiungendo un attributo scalare, dire "attr1" di tipo string.

Le interfacce Data sono il gateway per i dati del modello ERM ..., quindi devo capire come funziona l'estensione di tali interfacce per utilizzare correttamente il sistema. Ottengo frequentemente un'interfaccia Data come parametro invece di un modello effettivo, e va bene in realtà. Ma sono un po 'confuso su come funzionano le estensioni.

È stato utile?

Soluzione

L'attributo di estensione è un modo per estendere l'interfaccia. Prendiamo come esempio il primo link che hai fornito al producttributemediaGalleryentryInterface. Se guardi i metodi lì vedrai che ha questo metodo

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

Nota il tipo @return del metodo ProducttributeMediaGalleryenryExtInterface - Questa è un'interfaccia che verrà nuovamente generata se si definisce l'attributo di estensione per ProductAtTraibiMediaGalleryentryInterface (per impostazione predefinita viene generato vuoto senza metodi). Il nome dell'attributo che hai registrato verrà utilizzato per creare metodi di interfaccia.

Supponiamo che tu abbia aggiunto ATR1 della stringa di tipo. Cosa puoi fare dopo che l'interfaccia viene rigenerata è di accedervi dall'istanza dell'interfaccia.

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

Per impostare l'attributo, è necessario istanziare l'interfaccia degli attributi di estensione

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

Quest'ultimo è disponibile lo scenario predefinito, potrebbe essere semplificato a seconda di come vengono implementate l'interfaccia di estensione e dell'interfaccia genitore.

[Aggiornato]

Attributi personalizzati e attributi di estensione Servono scopi diversi.

Attributi personalizzati sono necessari per rappresentare gli attributi EAV dell'entità. La maggior parte degli attributi EAV sono dinamici: possono essere aggiunti dopo che Magento viene schierato tramite l'UI admin. Ecco perché non è possibile ottenere il codice automatico del codice per gli attributi EAV: non sai tutti in anticipo.

Tuttavia, come sviluppatore di estensione, sai di alcuni attributi di sicuro - quelli che hai creato in tempo di sviluppo. Può essere un nuovo campo nel database, campo nel database correlato o in un attributo EAV. Puoi registrarli come attributo di estensione perché non cambiano mai a meno che il codice di codice non venga modificato. È possibile ottenere il codice automatico del codice per loro.

Altri suggerimenti

Per completare la risposta @eugenetulika, dobbiamo creare /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>
.

Quindi è possibile impostare il tuo nuovo attributo con il metodo SetaArttr1 (), come di seguito:

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

Spero che questo possa aiutare anche qualcuno :)

sarà

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top