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?

24ma13wg
la source

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.

DropDragon
la source
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();
Matoeil
la source
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).

Tenken
la source
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.


la source
$ 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();
Swapnil Bijwe
la source
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.

Alex
la source
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();
Francis
la source
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.

Jdrupal
la source