Wie greife ich auf einen Feldwert für ein Objekt einer Entität (z. B. eines Knotens) zu?


63

node_load((int) $nid)Lädt eine vollständig ausgefüllte Knotenentität. $node->title->valueRuft den Titel ab, aber wie greife ich in Drupal 8 auf Feldwerte zu?

Antworten:


89

Ich denke, Sie müssen nicht $entityin ein Array konvertieren , dies würde einfach funktionieren.

$entity->get('field_name')->getValue();

Zu Ihrer Information: Wenn Sie kint()vom devel_kintModul aus verwenden, werden Sie über alle verfügbaren Methoden informiert, die für den Zugriff auf die Objektelemente verwendet werden können. Dies var_dump()ist vergleichsweise weniger hilfreich.


14
Eigentlich sollte es sein: $ entity> get ( 'field_name') -> Wert;
Ed Hollinghurst

1
Wissen Sie, warum das @EdHollinghurst ist? getValue ist in der Tat ein Fehler für mich, aber (mit dpm) ist es in den verfügbaren Methoden aufgeführt, während 'value' dies nicht ist.
Autopoietic

2
getValue()funktioniert für mich (beide auf 8.1.x und 8.2.x) siehe api reference
leon.nk

16
->getValue()ist generisch und funktioniert unabhängig vom Feldtyp. Wenn Sie verwenden ->value, funktioniert dies nur, wenn der Feldwert in einer valueEigenschaft gespeichert ist . Bei komplexeren Typen (z. B. Datum oder Entitätsreferenz) funktioniert dies nicht.
Pierre Buyle

4
Dieser Code allein löst einen Fehler aus, wenn die Entität kein Feld mit dem Namen "field_name" hat. Stellen Sie sicher, dass dieser Code nur für Entitäten ausgeführt wird, bei denen Sie wissen, dass dieses Feld vorhanden ist. Verwenden Sie zum Testen $ entity-> hasField ('field_name') oder if (! Empty ($ entity-> field_name))
oknate

56

In Drupal 8 ist $ node ein Klassenknoten

 $node->field_machine_name->getValue();

oder

$node->get('field_machine_name')->getValue();

Gibt ein Array von Werten zurück.

Wenn Sie nur einen erwarten, können Sie das Array auch mit stringifizieren

$node->field_machine_name->getString();

oder

 $node->get('field_machine_name')->getString();

Ich "verstehe" (String und Wert) nicht "es". Können Sie bitte weitere Details hinzufügen, um diese Antwort zu erklären? Zu Ihrer
Information

34

Für Felder sollten Sie $node->body->valuebeispielsweise verwenden können. Wenn Sie die Feldnamen nicht kennen, empfehle ich, das Devel- Modul für Drupal 8 zu installieren und den Knoten über like zu überprüfendsm($node) .


1
Wie rendern Sie dieses Feld dann?
Alex

1
Dies scheint veraltet zu sein
Alex

1
@Alex Ich schlage vor, Sie stellen eine neue Frage mit dem Problem, das Sie haben. Zu der Zeit, als diese Antwort in Ordnung war, scheint es nicht einleuchtend zu sein, die Antwort jetzt zu bearbeiten, da es sich um eine Antwort auf dieser Seite handelt, die mehr Punkte enthält als diese.
Tenken

5
In diesem Artikel finden Sie eine schöne Erklärung. Sie können entweder $ node-> field_name-> value verwenden, um einen einzelnen Wert (oder den ersten Schlüssel eines mehrwertigen Felds) abzurufen. Oder Sie können $ node-> field_name-> getValue () verwenden, um alle Werte eines Felds als Array abzurufen.
Mirsoft

2
@tenken: Das Aktualisieren einer vorhandenen Antwort ist dem Hinzufügen einer redundanten Frage mit neuen Antworten vorzuziehen.
Pierre Buyle

17

Sie können jederzeit $entity->toArray()sehen, was sich in einer Entität befindet. Selbst wenn Sie xdebug verwenden (zum Beispiel mit phpstorm), ist es sehr schwierig, ein Entity-Objekt für sich zu erfassen. Ich bezweifle, dass dsm($node)Drupal 8 irgendeinen Sinn ergibt. Wenn Sie auf dem Debuggen in Ihrem Browser bestehen (sollten Sie aber nicht, Drupal 8 ist zu komplex, um ohne xdebug zu debuggen), dsm($node->toArray())ist das genau das, was Sie wollen.


$ node-> toArray () funktioniert auf Drupal 8 nicht.
Axel Briche

Bitte fügen Sie eine neue Frage hinzu. Drupal\Core\Entity\EntityInterfacehat toArray.

1
Diese Antwort bietet keine Lösung. Abstimmungen.
Colan

Während diese Antwort nicht unbedingt eine direkte Antwort auf diese Frage ist, ist sie eine verdammt gute Funktion. Vielen Dank.
Stef Van Looveren

14

Verwenden Sie den folgenden Codeausschnitt, um die Werte der Knotenfelder abzurufen

Dies wird verwendet, um die Node-ID von der URL abzurufen

$nid = \Drupal::routeMatch()->getRawParameter($node_id);

Um Knotendaten mit nid zu laden

$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

Dies wird verwendet, um den Feldwert abzurufen.

$terms = $node->get('field_Name')->getValue();  

Dies wird verwendet, um den Knotentitel zu erhalten.

$product_name = $node->getTitle();

2
Laden Sie den Knoten wie folgt: $ nid = \ Drupal :: routeMatch () -> getRawParameter ('node'); $ node = \ Drupal :: entityTypeManager () -> getStorage ('node') -> load ($ nid);
Rémy

8

Für mich hat das mit einem $entity(einem Knoten) funktioniert:

$entity->field_name->getValue();

unter Verwendung von 8.1.


2
Dieser bringt alle Werte eines mehrwertigen Feldes in ein Array. Es kann natürlich auch verwendet werden, um den Wert eines einwertigen Feldes abzurufen. Die Ausgabe enthält dann jedoch ein Array mit einem einzelnen Wert. Verwenden Sie $ entity-> field_name-> value
Mirsoft

7

Während der Benutzung (auf die richtige Art und Weise):

$node = \Drupal\node\Entity\Node::load($nid);
$node->get('nid')->value; // returns a raw value - Node ID

// Following both returns array structure containing value/target id nested value.
$node->get('nid')->value(); 
$node->nid->getValue();


4

Es ist einfach:

$node->get('field_name')->getValue()

Wenn das Feld ein Entitätsreferenzfeld ist, gibt es einige spezielle Möglichkeiten, um die referenzierten Entitäten abzurufen.

So erhalten Sie die Ziel-ID (erstes Element):

$entity->get('field_entity_reference')->target_id

So rufen Sie die geladene Entität (erstes Element) ab:

$entity->get('field_entity_reference')->entity

Bei Verwendung ->entityauf dem Feld wird die Entität automatisch geladen.

Wenn das Feld mehrere Referenzen enthalten kann, können Sie alle wie folgt abrufen:

$entities = $entity->get('field_entity_reference')->referencedEntities();

Das gibt Ihnen eine Reihe von Entitäten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.