web-dev-qa-db-ja.com

Drupal 8でコンテンツオブジェクトのプロパティを取得する方法

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

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

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

attached image

7
Benjen

まず、いくつかの背景。

_$node->something_と入力すると、 FieldItemListInterface になります。 somethingに使用できる値はどのようにしてわかりますか?実体を尋ねることができます。 $node->getFieldDefinitions()

これで、FieldItemListInterfaceを取得できました。その値を反復処理できます。単一値フィールドの場合は、最初のフィールドのみを反復処理できます。したがって、_$node->title_を使用している場合でも、リスト内のアイテムが1つだけであると想定しても、タイトルはFieldItemListInterfaceになります。

それでは、リストの最初の値を取得してみましょう。 $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()を記述する必要はありません-これは、 PHPマジックメソッドFieldItemListInterfaceおよびFieldItemInterfaceに対して、_$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_はそれぞれ同じことを実現します。

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

13
larowlan

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

_$node->isPublished()
_

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

編集:コアで_moderation_state_を探しましたが、そこにないので、おそらくcontribです。公開されている関数が$node->isPublished()に似た情報を提供する利用可能なメソッドを調べる必要があります。これはstatusに対応しています。

1
4k4