Comment accéder à une valeur de champ pour un objet d'entité (par exemple, un nœud)?


63

node_load((int) $nid)charge une entité de noeud entièrement remplie. $node->title->valueobtient le titre, mais comment puis-je accéder aux valeurs de champ dans Drupal 8?

Réponses:


89

Je suppose que vous n'avez pas besoin de convertir $entityen tableau, cela fonctionnerait simplement.

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

FYI: L'utilisation kint()de ce devel_kintmodule vous permettra de connaître toutes les méthodes disponibles pouvant être utilisées pour accéder aux éléments de l'objet. Par conséquent, cette méthode var_dump()est moins utile.


14
En réalité, il devrait s'agir de: $ entity-> get ('nom_zone') -> valeur;
— Ed Hollinghurst

1
Savez-vous pourquoi c'est @EdHollinghurst? getValue fait certes une erreur pour moi, mais (en utilisant dpm), il est répertorié dans les méthodes disponibles, alors que 'value' ne l'est pas.
— Autopoietic

2
getValue()fonctionne pour moi (tous les deux sur 8.1.x et 8.2.x) voir la référence api
— leon.nk

16
->getValue()est générique et fonctionnera quel que soit le type de champ. Si vous utilisez ->value, cela ne fonctionne que si la valeur du champ est stockée dans une valuepropriété. Cela ne fonctionnera pas pour des types plus complexes (par exemple, date ou référence à une entité).
— Pierre Buyle le

4
Ce code seul générera une erreur si l'entité ne possède pas de champ nommé "nom_zone". Assurez-vous que ce code n'est exécuté que sur les entités où ce champ existe, vous pouvez utiliser $ entity-> hasField ('nom_zone') pour tester ou si (! Empty ($ entity-> nom_zone))
— oknate le

56

dans drupal 8, $ node étant un noeud de classe

 $node->field_machine_name->getValue();

ou

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

retournera un tableau de valeurs.

Si vous n’en attendez qu’un seul, vous pouvez aussi bien hiérarchiser le tableau avec

$node->field_machine_name->getString();

ou

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

Je ne "reçois" pas (chaîne et valeur) "il". Pouvez-vous ajouter quelques détails supplémentaires pour expliquer cette réponse? Pour votre information: si vous ne le faites pas, votre réponse risque d'être supprimée par modération (désolé ...)
— Pierre.Vriens

34

Pour les champs, vous devriez pouvoir utiliser $node->body->valuepar exemple. Si vous ne connaissez pas les noms de champs, je vous recommande d'installer le module Devel pour Drupal 8 et d'inspecter le nœud via like dsm($node).


1
comment rendez-vous ce champ alors?
— Alex

1
cela semble être obsolète
— Alex

1
@ Alex, je vous suggère de poser une nouvelle question avec le problème que vous rencontrez. À l’époque, la réponse était bonne, il semble désengagé de modifier la réponse. C’est une réponse sur cette page qui contient plus de points que celle-ci.
— mardi

5
Consultez cet article pour une bonne explication. Vous pouvez soit utiliser $ node-> nom_zone-> valeur pour obtenir une valeur unique (ou la première clé d'un champ à valeurs multiples). Ou vous pouvez utiliser $ node-> nom_zone-> getValue () pour obtenir toutes les valeurs d'un champ sous forme de tableau.
— Mirsoft

2
@tenken: En fait, la mise à jour d'une réponse existante est préférable à l'ajout d'une question redondante avec de nouvelles réponses.
— Pierre Buyle le

17

Vous pouvez toujours $entity->toArray()voir ce qu'il y a dans une entité. Même en utilisant xdebug (par exemple avec phpstorm), donner un sens à un objet entité est très difficile. Je doute que dsm($node)Drupal 8 ait un sens. Si vous insistez sur le débogage dans le navigateur (mais vous ne devriez pas, Drupal 8 est trop complexe pour déboguer sans xdebug) dsm($node->toArray())est ce que vous voulez.


$ node-> toArray () ne fonctionne pas pour moi sur Drupal 8.
— Axel Briche

S'il vous plaît ajouter une nouvelle question détaillant cela. Drupal\Core\Entity\EntityInterfacea toArray.

1
Cette réponse ne fournit pas la solution. vote négatif.
— Colan

Bien que cette réponse ne soit pas nécessairement une réponse directe à cette question, c'est une fonction sacrément grande. Merci.
— Stef Van Looveren

14

Utilisez l'extrait de code suivant pour obtenir les valeurs de champ de nœud

Ceci est utilisé pour obtenir l'identifiant du noeud à partir de l'URL

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

Pour charger les données de nœud à l'aide de nid

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

Ceci est utilisé pour obtenir la valeur du champ.

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

Ceci est utilisé pour obtenir le titre du noeud.

$product_name = $node->getTitle();

2
Chargez le noeud comme ceci: $ nid = \ Drupal :: routeMatch () -> getRawParameter ('node'); $ node = \ Drupal :: entityTypeManager () -> getStorage ('node') -> load ($ nid);
— Rémy

8

Pour moi, avoir un $entity(un noeud) cela a fonctionné:

$entity->field_name->getValue();

en utilisant 8.1.


2
Celui-ci récupère toutes les valeurs d'un champ à valeurs multiples dans un tableau. Bien sûr, il peut également être utilisé pour obtenir la valeur du champ à valeur unique, mais la sortie contiendra alors un tableau avec une valeur unique. Pour obtenir une valeur unique d'un champ (ou la première valeur d'un champ à valeurs multiples), utilisez $ entity-> nom_zone-> valeur
— Mirsoft

7

En utilisant (de manière correcte):

$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

C'est simplement:

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

Si le champ est un champ de référence d'entité, il existe des moyens spéciaux pour obtenir les entités référencées.

Pour obtenir l'id cible (premier élément):

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

Pour obtenir l'entité chargée (premier élément):

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

Lors de l'utilisation ->entitysur le terrain, il charge automatiquement l'entité.

Si le champ peut contenir plusieurs références, vous pouvez toutes les récupérer comme ceci:

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

Cela vous donnera un tableau d'entités.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.