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
Antworten:
Erstens einige Hintergrundinformationen.
Wenn Sie eingeben, erhalten
$node->something
Sie ein FieldItemListInterface . Woher wissen Sie, für welche Werte Sie verwenden könnensomething
? Nun, Sie können die Entität fragen.$node->getFieldDefinitions()
Jetzt haben Sie ein, das
FieldItemListInterface
Sie ü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 TitelFieldItemListInterface
, 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önnenvalue
. ZB Für eine Entität ist das Referenzfeld$node->some_er_field->target_id
gültig, aber$node->some_er_field->value
nicht. Nun können Sie die fragen ,FieldItemInterface
wie so$node->title->get(0)->getProperties()
. Alternativ können Sie den Datentyp des Felds kennen und dessenpropertyDefinitions
Methode ü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 jedesFieldItemInterface
tatsächlich ein EntityReferenceItem ist und Sie es überprüfen können:: propertyDefinitions () -Methode, um zu sehen, welche Eigenschaften definiert sind.Nun haben Sie ein
TypedDataInterface
Objekt. Wie erhalten Sie dessen Wert? Nun, Sie verwenden seine::getValue()
Methode.Aber warten Sie, warum tut
$node->title->value
Arbeit - ich habe nicht zu schreiben$node->title->get(0)->get('value')->getValue()
- auch das ist , weil wir mit PHP magische Methoden aufFieldItemListInterface
undFieldItemInterface
so , dass$node->title->value
Anrufe$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_id
und$node->moderation_state->entity
wü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.
quelle
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:
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 diestatus
.quelle