entity_metadata_wrapper()関数の目的は何ですか?なぜ使用する必要がありますか?


23

現時点では、Entity APIを使用する多くのモジュールのアドオンを開発しているようですが、entity_metadata_wrapper()関数は引き続きポップアップします。

ドキュメントのページには、それについて、これを言います:

指定されたデータのプロパティラッパーを返します。

エンティティがラップされている場合、ラッパーを使用して、エンティティプロパティのラッパーをさらに取得できます。

そこにある「実体」という言葉の素晴らしくフロイト的な綴りを無視すると、私はこれらのラッパーの目的が何であるか本当に理解していません。

関数は本質的にEntityDrupalWrapperクラスを返すことを理解しています:

ラッパーは、エンティティプロパティのgetterおよびsetterコールバックの適用を容易にします

しかし、私が理解できないのはそれが物事を簡単にする方法です。

たとえば、ノードのステータスプロパティを更新するには、次のコードを使用できます。

$node = node_load($nid);
$node->status = 1;
node_save($node);

それはとてもきれいです。私が理解しているように(しかし間違っているかもしれませんが)使用entity_metadata_wrapper()する同等のコードはそれより冗長です。

ここで私をつまずかせているのは単に「ラッパー」という用語の使用であるかどうかはわかりませんが、Entityモジュールのコードも調べましたが、実際にはそれを理解するのに少しも近づいていません。

誰でもこの関数を使用する利点を説明でき、おそらく一般的なユースケースの簡単なコード例を提供できますか?


これにより、エンティティAPIとラッパーの理解が深まる可能性があります。エンティティーのファゴによる講演です。wolfgangziegler.net/drupalcon-denver-
ケン

おかげで、それはオープニングギャンビットから本当に便利に聞こえます。時間があれば、それを見てみましょう
クライブ

その「ビデオはblipから削除されました」が、スライドはまだダウンロードされています。
-artfulrobot

回答:


23

はい、ノードのステータスを変更するのは簡単です。これは、ハードコードされたプロパティです。

一方、フィールドははるかに複雑です。これらは3レベルの深さにネストされていますが、正しい言語で取得するfield_get_items()がありますが、フィールド値を設定するためのそのような関数はありません。そのため、フィールドが翻訳可能であるかどうかを常に確認する必要があり、どのプロパティに探している/設定したい値が正確に含まれているかを知る必要があります。

エンティティラッパーができることを示す2つの例:

  • 次の行は、次の回答/drupal//a/23513/31から取得した言語と参照IDを保持する実際のプロパティを考慮して、コマース広告申込情報を注文に追加します

    $order_wrapper->commerce_line_items[] = $line_item;
  • 同様に、言語やデルタをチェックすることなく、フィールドの値に直接アクセスでき、https://drupal.stackexchange.com/a/から取得した参照エンティティに直接アクセスすることもできます。 33010/31

    $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
    $default = $subnode->title;

エンティティラッパーは、検索APIルールなどの柔軟で強力なモジュールの原動力であり、複数のレベルの参照を処理できるため、ユーザーが何かで注文した商品のフィールドにアクセスできます。以下のような[commerce-order:commerce-line-items:0:commerce-product:some-field](実際に正しいことが、そのようなことではないかもしれません)、またはあなたの検索インデックスを基準ノードの体の概要を追加します。

ただし、ラッパーの実際のAPIは必ずしも好きではなく、巨大な内部配列であり、単純なプロパティでさえラッパークラスです。Drupal 8の改良されたエンティティ(およびできればフィールド)システムが、クラス化されたエンティティのおかげでそのようなラッパーの必要性を取り除くことを願っています。


素晴らしい、私はこれで何かを逃しただけだと知っていました。EntityDrupalWrapper混乱を引き起こしたのはそれの説明だったと思う。「プロパティ」に言及したとき、フィールドがまったく関与していないことに気付いていませんでしたが、文字通り、クラスがプロパティ(nid、ステータスなど)を処理することを意味すると思いました。それをクリアしてくれてありがとう、Rulesモジュールがデータセレクターにそれを使用することを知っていることは、それがもっと理にかなっている
クライブ

@Berdir「私は必ずしもラッパーの実際のAPIが好きではありません...」私はあなたと同じ気持ちを持っています。これと戦うために何かしますか?field_view_value()を使用して値を表示しますか?カスタムワークフローまたはダッシュボードのカスタムコールバックで値を設定することをどのようにお勧めしますか?
チャーリーシュリーザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.