ノードオブジェクトのプロパティを取得するにはどうすればよいですか?


7

Drupal8のノードオブジェクトからmoderation_stateプロパティを取得しようとしています(添付画像を参照)。しかし、私はこれを行う方法を見つけることができません。Drupal7では、それはかなり単純明快$node->moderation_stateでした。

$ nodeがDrupal \ node \ Entity \ NodeのインスタンスであるDrupal8でこの値を取得するにはどうすればよいですか?

私は試しました:$ node-> moderation_state $ node-> moderation_state-> value

添付画像


ダンプするときは常に$ node-> toArray()を使用し、アクセスする方法により近い構造を提供します。多分それはあなたに言うだろう値とは異なるプロパティを使用しています。
Berdir 2016年

回答:


14

まず、いくつかの背景。

入力すると$node->somethingFieldItemListInterfaceを取得します。どのように使用できる値をどのようにして知るのsomethingですか ええと、エンティティに質問できます。 $node->getFieldDefinitions()

これでFieldItemListInterface、値を反復処理できるようになりました。単一値フィールドの場合は、最初のフィールドのみを反復処理できます。したがって、を使用している場合でも$node->title、タイトルはFieldItemListInterfaceリスト内の1つのアイテムしか期待していない場合でも、

それでは、リストの最初の値を取得してみましょう。$node->something->get(0)。これにより、FieldItemInterfaceが提供されます。ここから、フィールドアイテムのプロパティにアクセスできます。例えば$node->title->get(0)->get('value')。これらはそれぞれTypedDataInterfaceのインスタンスです。しかし、どのように使用できるかをどうやって知るのでしょうvalue。たとえば、エンティティ参照フィールド$node->some_er_field->target_idは有効ですが無効です$node->some_er_field->value。まああなたはそのFieldItemInterfaceように尋ねることができます$node->title->get(0)->getProperties()。または、フィールドのデータ型を確認し、そのpropertyDefinitionsメソッドを調べることもできます。たとえば、moderation_stateフィールドの場合、エンティティ参照フィールドを使用して、モデレーション状態構成エンティティへの参照を追跡します。つまり、それぞれFieldItemInterfaceが実際にはEntityReferenceItemであり、それを確認できます:: propertyDefinitions()メソッドを使用して、定義するプロパティを確認します。

さて、これでTypedDataInterfaceオブジェクトができました。どのようにしてその値を取得しますか?まあその::getValue()方法を使用します。

しかし、ない、なぜ待つ$node->title->value仕事を-私は記述する必要はありません$node->title->get(0)->get('value')->getValue()私たちが使用しているので、井戸のthats - PHPのマジックメソッドをFieldItemListInterfaceFieldItemInterfaceするように、$node->title->valueコールの$node->title->get(0)->get('value')->getValue()あなたのために。

要約すると:

  • $node->moderation_state->get(0)->get('target_id')->getValue() モデレーション状態の構成エンティティのIDを提供します。
  • $node->moderation_state->get(0)->get('entity')->getValue()ModerationState構成エンティティが提供されるので、そのメソッドを::isPublished()やのように直接使用できます::label()
  • $node->moderation_state->target_idそして$node->moderation_state->entity、それぞれ同じことを達成するであろう。

私はこれについて私の同僚のために稲妻の話をしました、もしあなたが興味を持っているなら、スライドがここにあるのは残念ながら録音はうまくいきませんでした。


史上最高の説明!drupal.orgのドキュメントに含める必要があります。ラローランありがとうございます。
Prerit Mohan

1

これは保護された値です。kint()またはtoArray()を使用してアクセスすることはできません。ノードオブジェクトは、ステータスを読み取るためにノードインターフェースを使用する必要があるため、これを保護します。

$node->isPublished()

drupal 8で保護された値をこのように厳密に処理すると、コードがより長く、できればdrupal 9以降で存続できるようになります。なぜなら、外部へのインターフェースを反映することなく、ノードオブジェクトの内部で変更が可能だからです。

編集:のコアを調べましたmoderation_stateが、そこにはありません。おそらくcontribです。あなたは、公共の機能はあなたのような情報与える利用可能な方法で見ている$node->isPublished()ためです、status

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