Wie erhalte ich die Eigenschaft eines Knotenobjekts?

7

Ich versuche, die Eigenschaft moderation_state von einem Knotenobjekt in Drupal8 abzurufen (siehe beigefügtes Bild). Ich kann jedoch nicht herausfinden, wie das geht. In Drupal7 war es ziemlich einfach $node->moderation_state.

Wie kann ich diesen Wert in Drupal8 erhalten, wo $ node eine Instanz von Drupal \ node \ Entity \ Node ist?

Ich habe versucht: $ node-> moderation_state $ node-> moderation_state-> value

Angehängtes Bild

Benjen
quelle
Verwenden Sie immer $ node-> toArray (), wenn Sie es sichern, und erhalten Sie dann eine Struktur, die der Art und Weise, wie Sie darauf zugreifen können, viel näher kommt. Vielleicht verwendet es eine andere Eigenschaft als den Wert, die Ihnen sagen würde.
Berdir

Antworten:

14

Erstens einige Hintergrundinformationen.

Wenn Sie eingeben, erhalten$node->something Sie ein FieldItemListInterface . Woher wissen Sie, für welche Werte Sie verwenden können something? Nun, Sie können die Entität fragen. $node->getFieldDefinitions()

Jetzt haben Sie ein, das FieldItemListInterfaceSie über seine Werte iterieren können, oder im Fall eines Felds mit einem Wert nur das erste. Selbst wenn Sie verwenden $node->title, ist der Titel ein Titel FieldItemListInterface, obwohl Sie nur ein Element in der Liste erwarten würden.

Lassen Sie uns also den ersten Wert in der Liste erhalten. $node->something->get(0). Dadurch erhalten Sie ein FieldItemInterface . Von hier aus können Sie auf die Eigenschaften des Feldelements zugreifen. ZB $node->title->get(0)->get('value'). Jedes davon ist eine Instanz von TypedDataInterface . Aber wie Sie wissen, was Sie verwenden können value. ZB Für eine Entität ist das Referenzfeld $node->some_er_field->target_idgültig, aber $node->some_er_field->valuenicht. Nun können Sie die fragen , FieldItemInterfacewie so $node->title->get(0)->getProperties(). Alternativ können Sie den Datentyp des Felds kennen und dessen propertyDefinitionsMethode überprüfen . Im Fall des Felds moderation_state wird beispielsweise ein Entity Reference-Feld verwendet, um den Verweis auf die Konfigurationsentität moderation state zu verfolgen. Das bedeutet also, dass jedes FieldItemInterfacetatsächlich ein EntityReferenceItem ist und Sie es überprüfen können:: propertyDefinitions () -Methode, um zu sehen, welche Eigenschaften definiert sind.

Nun haben Sie ein TypedDataInterfaceObjekt. Wie erhalten Sie dessen Wert? Nun, Sie verwenden seine ::getValue()Methode.

Aber warten Sie, warum tut $node->title->valueArbeit - ich habe nicht zu schreiben $node->title->get(0)->get('value')->getValue()- auch das ist , weil wir mit PHP magische Methoden auf FieldItemListInterfaceund FieldItemInterfaceso , dass $node->title->valueAnrufe $node->title->get(0)->get('value')->getValue()für Sie.

Also zusammenfassend:

  • $node->moderation_state->get(0)->get('target_id')->getValue() gibt Ihnen die ID der Konfigurationsentität für den Moderationsstatus.
  • $node->moderation_state->get(0)->get('entity')->getValue()gibt Ihnen die Konfigurationsentität ModerationState, sodass Sie ihre Methoden direkt verwenden können - wie ::isPublished()und ::label().
  • $node->moderation_state->target_idund $node->moderation_state->entitywürde jeweils das gleiche erreichen.

Ich habe ein Blitzgespräch für meine Kollegen darüber geführt. Wenn Sie interessiert sind, dass die Folien hier sind, hat die Aufnahme leider nicht funktioniert.

Larowlan
quelle
Beste Erklärung aller Zeiten! Sollte in der Dokumentation zu drupal.org enthalten sein. Danke Larowlan.
Prerit Mohan
1

Dies ist ein geschützter Wert. Sie können nicht mit kint () oder toArray () darauf zugreifen. Das Knotenobjekt schützt dies, da Sie die Knotenschnittstelle zum Lesen des Status verwenden sollen:

$node->isPublished()

Diese strikte Behandlung geschützter Werte in Drupal 8 lässt Ihren Code länger überleben, hoffentlich in Drupal 9 und darüber hinaus. Denn jetzt sind Änderungen innerhalb des Knotenobjekts möglich, ohne die Schnittstelle nach außen zu reflektieren.

Bearbeiten: Im Kern gesucht moderation_state, es ist nicht da, wahrscheinlich beitragen. Sie müssen nach verfügbaren Methoden suchen, für welche öffentliche Funktion Sie ähnliche Informationen erhalten $node->isPublished(), für die status.

4k4
quelle