J'ai un objet nœud avec un champ d'image nommé field_image
. Quand je fais
$node
->get('field_image')
->first()
->getValue()
Je reçois un tableau avec des propriétés au lieu d'objet entité. Le tableau ressemble à ceci:
'target_id' => string '8' (length=1)
'alt' => string '' (length=0)
'title' => string '' (length=0)
'width' => string '587' (length=3)
'height' => string '458' (length=3)
'_loaded' => boolean true
'_accessCacheability' =>
object(Drupal\Core\Cache\CacheableMetadata)[1092]
protected 'cacheContexts' =>
array (size=0)
...
protected 'cacheTags' =>
array (size=0)
...
protected 'cacheMaxAge' => int -1
Dois-je toujours charger l'entité de fichier en utilisant target_id
ou existe-t-il un moyen d'obtenir automatiquement un objet d'entité référencé à partir d'une instance de Drupal\image\Plugin\Field\FieldType\ImageItem
?
Pourquoi l'entité référencée n'est pas accessible via getter? Il pourrait être chargé paresseux s'il n'est pas disponible immédiatement.
PHP Fatal error: Call to undefined method Drupal\image\Plugin\Field\FieldType\ImageItem::getTarget()
. Cependant$node->get('imagefield')->referencedEntities()
fonctionne grâce au fait$node->get('imagefield')
retourne instance deEntityReferenceFieldItemList
qui implémente lareferencedEntities()
méthode. Votre solution n’est donc que partielle: elle fonctionne pour les listes mais pas pour les champs uniques.Réponses:
Le chemin d'accès à l'entité référencée est très long:
Bien sûr, on peut toujours l'obtenir via un seul appel au titre, mais cela reste quand même encombrant et je me demande pourquoi on
EntityReferenceItem
ne fournit pas de méthode permettant de renvoyer l'objet d'entité de référence.Il est également intéressant de noter qu'il est assez facile d'obtenir un tableau de toutes les entités référencées:
Cela fonctionne car pour les champs de référence d'entité, une
$node->get($field)
instance deEntityReferenceFieldItemList
laquelle implémente lareferencedEntities()
méthode est renvoyée.la source
Vous pouvez utiliser:
$node->field_image->entity
si vous voulez la première valeur
la source
$node->get('field_image')->entity
renvoie l'File
entité. Cependant$node->get('field_image')->getEntity()
retourne mèreNode
entité! Je comprends que les méthodes magiques puissent être utilisables, mais ce sont des PITA dans des projets plus importants. Pourquoi s'embêter à écrire des interfaces et du code oo si on nous encourage de toute façon à utiliser la magie? Vous avez écrit qu'il est assez facile de vous rappeler une fois que vous l'avez fait - je ne suis pas d'accord. Une fois que vous aurez commencé à le faire, vous développerez une très mauvaise habitude qui rendra votre code moins lisible et moins gérable.Ce qui a fonctionné pour moi a été:
Les autres réponses ne produisaient pas le tableau de champs d'entité que j'attendais
la source
Pour obtenir une entité à partir d'un champ référencé. Je suis d’accord avec @SiliconMind à propos de referenceEntities, il renvoie un tableau d’objets d’entité associé à des deltas d’éléments de champ.
Juste simple:
$node->get('field_name')->referencedEntities();
EntityReferenceFieldItemList :: référencéesEntities
la source