Drupal8のノードオブジェクトからmoderation_stateプロパティを取得しようとしています(添付画像を参照)。しかし、私はこれを行う方法を見つけることができません。 Drupal7では、それはかなり簡単でした$node->moderation_state
。
$ nodeがDrupal\node\Entity\NodeのインスタンスであるDrupal8でこの値を取得するにはどうすればよいですか?
私が試しました:$ node-> moderation_state $ node-> moderation_state-> value
まず、いくつかの背景。
_$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
_はそれぞれ同じことを実現します。私はこれについて私の同僚のために稲妻の話をしました、もし興味があればスライドは ここにあります 残念ながら録音はうまくいきませんでした。
これは保護された値です。 kint()またはtoArray()を使用してアクセスすることはできません。ノードオブジェクトは、ステータスを読み取るためにノードインターフェースを使用する必要があるため、これを保護します。
_$node->isPublished()
_
drupal 8で保護された値をこのように厳密に処理すると、コードがより長く存続できるようになります。できればdrupal 9以降で有効です。ノードオブジェクト内に変更があるため外部へのインターフェースを反映することなく可能。
編集:コアで_moderation_state
_を探しましたが、そこにないので、おそらくcontribです。公開されている関数が$node->isPublished()
に似た情報を提供する利用可能なメソッドを調べる必要があります。これはstatus
に対応しています。