Magento 2で拡張属性はどのように機能しますか?


7

ドキュメントが何を言っているのかわかりません。

それらを使用して属性を(複雑であるかどうかに関係なく)追加するために使用されていることを知ってetc/extension_attributes.xmlおり、コンパイルプロセスで自動生成のカスタムメソッドを使用してインターフェイスを作成できましたが、それはそれだけです。

いくつかのインターフェースを例にとってみましょう:github link 1github link 2。拡張属性を使用して、これらのインターフェースの1つに特定の属性を追加するにはどうすればよいですか?複雑な結合には興味がありません。スカラー属性を追加するだけで、タイプの「attr1」と言いますstring

Data私はこれらのインタフェースの拡張が適切にシステムを利用するためにはどのように機能するかを理解する必要があるので、インタフェースは、モデルのERM ...データへのゲートウェイです。私は頻繁Dataに、実際のモデルの代わりにパラメーターとしてインターフェースを取得しますが、それは実際には問題ありません。しかし、私は拡張機能がどのように機能するかについて少し混乱しています。

回答:


14

拡張属性は、インターフェースを拡張する方法です。例として、ProductAttributeMediaGalleryEntryInterfaceに提供した最初のリンクを見てみましょう。そこにメソッドを見ると、このメソッドがあることがわかります

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

メソッドProductAttributeMediaGalleryEntryExtensionInterfaceの@returnタイプに注意してください。これは、ProductAttributeMediaGalleryEntryInterfaceの拡張属性を定義すると再生成されるインターフェースです(デフォルトでは、メソッドなしで空に生成されます)。登録した属性の名前は、インターフェースのメソッドを作成するために使用されます。

タイプstringのattr1を追加したとしましょう。インターフェースが再生成された後にできることは、インターフェースのインスタンスからそれにアクセスすることです。

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

属性を設定するには、拡張属性インターフェイスをインスタンス化する必要があります

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

後者は使用可能なデフォルトのシナリオであり、ExtensionInterfaceおよび親インターフェースの実装方法によっては簡略化される場合があります。

[更新しました]

カスタム属性と拡張属性は目的が異なります。

エンティティのEAV属性を表すには、カスタム属性が必要です。ほとんどのEAV属性は動的です。これらは、Magentoが管理UIを介してデプロイされた後に追加できます。そのため、EAV属性のコードのオートコンプリートを取得できません。すべての属性について事前に把握しているわけではありません。

ただし、拡張機能の開発者は、開発時に作成した属性など、確かにいくつかの属性を知っています。データベースの新しいフィールド、関連データベースのフィールド、またはEAV属性を指定できます。それらは、コードベースが変更されない限り変更されないため、拡張属性として登録できます。それらのコードのオートコンプリートを取得できます。


とても明確になりました。ありがとうございました。今、他のあらゆる種類の質問が発生しますが、私はそれらのために他の投稿を作成します。
nevvermind 2015年

よろしければ、もう1つ質問があります。カスタムEAV属性を持つ製品を保存する場合、を使用できますsetCustomAttribute()が、自動生成された拡張インターフェイスから取得する自動補完が好きです。しかし、それを使用したい場合は、拡張機能を自分で設定する必要があります。それで、拡張機能はより手作業のものですか?多分これは私が言おうとしていることをよりよく言います:gist.github.com/nevvermind/155952b0b01773f4b42f
nevvermind

この質問に対処するために主な回答を更新しました。それがより明確になるかどうか教えてください
ユージーントゥリカ

「カスタム属性」と「拡張属性」は多少重複していると思います。これは、GUIまたはプログラムで作成された属性のオートコンプリートも使用できるためです。私は、彼らが考えるすべてと- (エンティティのAPIを拡張する)同じ目的を果たすが、(いくつかは、いくつかは、いくつかのUIも、EAVではありませんかさえ持続しますが、計算されたなどありませんしている)異なる挙動を示すextension_attributes.xmlEMは、すべての「キャッチすることができます-あなたが望むなら、それはそうです。全体として、私は拡張属性に取り組むのに十分な自信を持っています。とても感謝しております。
nevvermind 2015年

私は、extension_attributes.xmlファイルにマップすると、GUIまたはプログラムで作成されたattrsのオートコンプリートを使用できることを意味します
nevvermind 2015年

1

@EugeneTulikaの回答を完了するには、/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>

次に、以下のようにsetAttr1()メソッドを使用して新しい属性を設定できます。

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

これが誰かにも役立つことを願っています:)

意志

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.