Obtenir par programme tous les noms d'un champ de référence d'entité

10

Exemple: je veux obtenir tous les noms de balises qui se trouvent dans les balises field_t du noeud 5.

Je peux obtenir le target_id avec $ node-> field_tags-> getValue () ;

entrez la description de l'image ici

Mais le problème est que je ne sais pas à quelle entité appartient la valeur target_id. Peut être un identifiant de nœud, un identifiant de terme, un identifiant d'utilisateur. Sans ces informations, je ne suis pas en mesure d'utiliser le target_id pour obtenir le nom de la balise.

Comment puis-je obtenir tous les noms d'un champ de référence d'entité?

Pas de sueur
la source

Réponses:

20

La façon la plus simple d'obtenir ce que vous voulez est quelque chose comme ceci:

$names = [];
foreach ($node->field_tags as $item) {
  if ($item->entity) {
    $names[$item->entity->id()] = $item->entity->label();
  }
}

->entityest une soi-disant propriété calculée, elle n'apparaît pas dans getValues(). Tous les champs de référence l'ont.

Et oui, oubliez l' print_r()entité ou d'autres objets complexes. Ils contiennent des objets qui se référencent et print_r()ne peuvent pas gérer cela. Si vous avez une entité, utilisez toujours print_r($entity->toArray()), alors vous obtenez uniquement les valeurs de champ. Vous pouvez installer le module devel ou utiliser un débogueur, mais cela vous donnera la structure interne d'une entité, ce que vous ne voulez pas vraiment voir.

Berdir
la source
2
$node->toArray();semble bien plus court et plus propre que l'utilisation\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');
No Sssweat
Où trouvez-vous de la documentation à ce sujet?
AlxVallejo
Vous pouvez trouver quelques informations ici par exemple: drupal.org/docs/8/api/entity-api
Berdir
@Berdir: print_r($entity->toArray())Cela résout ce problème. Je peux obtenir tous les détails des champs. Merci beaucoup.
kalidasan
@Berdir pouvez-vous être plus précis sur la documentation? J'ai parcouru cette page, mais je ne vois aucun exemple spécifique lié aux champs de référence de terme.
Keven
6

Un champ de référence d'entité, par définition, ne peut cibler qu'un seul type d'entité afin que vous puissiez connaître votre type de cible en appelant getSetting()sur la définition de champ.

// Print the targeted entity type field.
$field = \Drupal\field\Entity\FieldStorageConfig::loadByName('node','field_tags');
echo $field->getSetting('target_type');

Ou mieux encore, utilisez EntityReferenceFieldItemList::referencedEntities()pour extraire les entités référencées du nœud et les données associées dont vous avez besoin.

// Return an array of Entity objects referenced in the field.
$node->field_tags->referencedEntities();
Shawn Conn
la source
print_r($node->field_tag->referencedEntities());semble être un porc de ressources, j'avais mis à niveau mon instance AWS , juste pour pouvoir le faire, car je continuais à obtenir WSOD.
Pas de Sssweat
Dites-moi si cela devrait être une question distincte. Comment puis-je accéder à la valeur du nom, lorsque dans le tableau, il indique values: protected, ce qui signifie qu'il est uniquement accessible à l'intérieur de la classe.
Pas de Sssweat
Je me sens mal de ne pas accepter votre réponse, mais la réponse de @Berdir ne m'a donné d'autre choix que de. Je n'ai jamais compris comment obtenir la valeur en utilisant votre Or better yetméthode. La première méthode est bonne, mais elle nécessitera des instructions if pour vérifier le type cible, puis obtenir la valeur. La réponse de Berdir est plus efficace car il n'y a pas besoin de contrôles.
Pas de Sssweat
1
Ne le transpirez pas (... jeu de mots voulu). La première version de votre question n'était pas trop claire sur votre objectif. Vous devez cocher la réponse qui convient le mieux.
Shawn Conn
Je souhaite vraiment que cette réponse ne soit pas enterrée dans ce message SO. Je voulais obtenir la target_typevaleur d'un entity_referencechamp et j'ai cherché haut et bas ... jusqu'à ce que vous répondiez à ma question ici.
Keven