Obtenga programáticamente todos los nombres de un campo de referencia de entidad

10

Ejemplo: quiero obtener todos los nombres de etiqueta que están dentro de field_tags del nodo 5.

Puedo obtener el target_id con $ node-> field_tags-> getValue () ;

ingrese la descripción de la imagen aquí

Pero el problema es que no sé a qué entidad pertenece el valor target_id. Podría ser una ID de nodo, ID de término, ID de usuario. Sin esa información, no puedo usar target_id para obtener el nombre de la etiqueta.

¿Cómo puedo obtener todos los nombres de un campo de referencia de entidad?

No Sssweat
fuente

Respuestas:

20

La forma más fácil de obtener lo que quieres es algo como esto:

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

->entityes una llamada propiedad calculada, no aparece en getValues(). Todos los campos de referencia lo tienen.

Y sí, olvídate print_r()de la entidad u otros objetos complejos. Contienen objetos que se refieren entre sí y print_r()no pueden manejar eso. Si tiene una entidad, use siempre print_r($entity->toArray()), solo obtendrá los valores de campo. Puede instalar el módulo de desarrollo o usar un depurador, pero eso le dará la estructura interna de una entidad, que realmente no quiere que quiera ver.

Berdir
fuente
2
$node->toArray();seguro se ve mucho más corto y limpio que usar\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');
No Sssweat
¿Dónde encuentras documentación sobre esto?
AlxVallejo
Puede encontrar información aquí, por ejemplo: drupal.org/docs/8/api/entity-api
Berdir
@ Berdir: print_r($entity->toArray())Resuelve este problema. Puedo obtener todos los detalles de los campos. Muchas gracias.
kalidasan
@ Berdir, ¿puede ser más específico acerca de la documentación? He estado revisando esa página pero no veo ningún ejemplo específico relacionado con los campos de referencia de términos.
Keven
6

Un campo de referencia de entidad, por definición, solo puede apuntar a un tipo de entidad para que pueda saber cuál es su tipo de destino llamando a getSetting()la definición de campo.

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

O mejor aún, use EntityReferenceFieldItemList::referencedEntities()para extraer las entidades referenciadas del nodo y los datos asociados que necesita.

// Return an array of Entity objects referenced in the field.
$node->field_tags->referencedEntities();
Shawn Conn
fuente
print_r($node->field_tag->referencedEntities());parece ser un gran recurso, tuve que actualizar mi instancia de AWS , solo para poder hacerlo, ya que seguía recibiendo WSOD.
No Sssweat
Avíseme si esta debería ser una pregunta separada. ¿Cómo puedo acceder al valor del nombre, cuando en la matriz dice valores: protegido, lo que significa que solo se puede acceder dentro de la clase?
No Sssweat
Me siento mal por no aceptar su respuesta, pero la respuesta de @Berdir no me dio más remedio que hacerlo. Nunca descubrí cómo obtener el valor utilizando su Or better yetmétodo. El primer método es bueno, pero requerirá si las declaraciones verifican el tipo de destino y luego obtienen el valor. La respuesta de Berdir es más eficiente ya que no hay necesidad de cheques.
No Sssweat
1
No te preocupes (... juego de palabras). La primera versión de su pregunta no era muy clara sobre su objetivo. Debe marcar la respuesta que mejor se ajuste.
Shawn Conn
Realmente desearía que esta respuesta no estuviera enterrada en esta publicación SO. Quería obtener el target_typevalor de un entity_referencecampo y busqué por todos lados ... hasta que respondiste mi pregunta aquí.
Keven