it-swarm.com.de

So erhalten Sie die Eigenschaft eines Inhaltsobjekts in Drupal 8

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

(attached image

7
Benjen

Erstens einige Hintergrundinformationen.

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

Jetzt haben Sie ein FieldItemListInterface, das Sie über seine Werte iterieren können, oder im Fall eines Felds mit einem Wert nur über das erste. Selbst wenn Sie $node->title Verwenden, ist der Titel ein 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). Dies gibt Ihnen ein FieldItemInterface . Von hier aus können Sie auf die Eigenschaften des Feldelements zugreifen. Z.B. $node->title->get(0)->get('value'). Jedes davon ist eine Instanz von TypedDataInterface . Aber woher weißt du, was du für value verwenden kannst? Z.B. Für ein Entitätsreferenzfeld ist $node->some_er_field->target_id Gültig, $node->some_er_field->value Nicht. Nun, Sie können die FieldItemInterface wie so $node->title->get(0)->getProperties() fragen. Alternativ können Sie den Datentyp des Felds kennen und dessen Methode propertyDefinitions überprüfen. Z.B. Im Fall des Felds moderation_state wird ein Feld Entity Reference verwendet, um den Verweis auf die Konfigurationsentität moderation state zu verfolgen. Das bedeutet, dass jedes FieldItemInterface tatsächlich ein EntityReferenceItem ist und Sie seine :: propertyDefinitions () -Methode überprüfen können, um festzustellen, welche Eigenschaften es definiert.

Nun haben Sie ein TypedDataInterface Objekt. Wie erhalten Sie dessen Wert? Nun, Sie verwenden die Methode ::getValue().

Aber warte, warum funktioniert $node->title->value - ich muss nicht $node->title->get(0)->get('value')->getValue() schreiben - nun, das liegt daran, dass wir magische PHP-Methoden auf FieldItemListInterface verwenden und FieldItemInterface so, dass $node->title->value$node->title->get(0)->get('value')->getValue() für Sie aufruft.

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_id Und $node->moderation_state->entity Würden jeweils dasselbe erreichen.

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

13
larowlan

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. Weil es jetzt Änderungen innerhalb des Knotenobjekts gibt möglich, ohne die Schnittstelle nach außen zu reflektieren.

Bearbeiten: Im Kern nach moderation_state Gesucht, ist es nicht da, wahrscheinlich beitragen. Sie müssen nach verfügbaren Methoden suchen, welche öffentliche Funktion Ihnen die Informationen ähnlich wie $node->isPublished() gibt, was für status gilt.

1
4k4