Cómo obtener valores de campos de un nodo en Drupal moderno

Client
  • Omitsis
Technologies
Services
Date
  • 16/08/2024

Ya vimos en otro artículo cómo cargar un nodo por su ID, pero ahora necesitamos saber cómo obtener los valores de sus campos.

Es muy sencillo — solo necesitas saber que el objeto node tiene el método get, que nos permite obtener estos campos (atributos).

Es importante notar que estos campos también son objetos en sí mismos, cada uno con sus propios atributos, dependiendo del tipo de campo. Puedes averiguar qué atributos están disponibles depurando con Xdebug (recomendado) o imprimiendo la variable usando Kint o dump().

Usando el método get()

echo $node->get('title')->value; // "Lorem Ipsum..."
echo $node->get('created')->value; // 1510948801
echo $node->get('body')->value; // "El body completo, <strong>con HTML</strong>"
echo $node->get('body')->summary; // "El resumen"

// Un campo de texto
echo $node->get('field_foo')->value; // "Lo que sea que tenga tu campo personalizado"

// Un campo de archivo
echo $node->get('field_image')->target_id; // 432 (El File ID)

Usando métodos mágicos (forma abreviada)

Con los métodos mágicos de PHP, ni siquiera necesitas escribir get. Así que el equivalente de lo anterior sería:

echo $node->title->value; // "Lorem Ipsum..."
echo $node->created->value; // 1510948801
echo $node->body->value; // "El body completo, <strong>con HTML</strong>"
echo $node->body->summary; // "El resumen"
echo $node->field_foo->value; // "Lo que sea que tenga tu campo personalizado"
echo $node->field_image->target_id; // 432

Ambos enfoques funcionan exactamente igual. Usa el que prefieras.

Tipos de campo comunes y sus propiedades

Tipo de campoCómo obtener el valor
Text / String->value
Text with summary->value, ->summary, ->format
Integer / Float->value
Boolean->value (devuelve 0 o 1)
Date->value (string en formato ISO)
Entity reference->target_id, ->entity
Link->uri, ->title
File / Image->target_id, ->alt, ->title, ->entity

Trabajando con referencias a entidades

Cuando tienes un campo de referencia (como Media, Term o User), puedes obtener el ID o la entidad completa:

// Obtener solo el ID
$media_id = $node->get('field_image')->target_id;

// Obtener la entidad referenciada completa
$media = $node->get('field_image')->entity;
$file_url = $media->get('field_media_image')->entity->getFileUri();

Comprobar si un campo tiene valor

Siempre comprueba antes de acceder para evitar errores:

if (!$node->get('field_foo')->isEmpty()) {
  $value = $node->get('field_foo')->value;
}

Campos multivalor

Para campos que pueden tener múltiples valores:

// Obtener todos los valores
foreach ($node->get('field_tags') as $item) {
  echo $item->target_id;
}

// Obtener solo el primer valor
$first = $node->get('field_tags')->first();

// Obtener como array
$values = $node->get('field_tags')->getValue();

getValue() y getString()

Dos métodos muy útiles que funcionan en cualquier campo:

// getValue() - Devuelve la estructura de array cruda
$node->get('field_foo')->getValue();
// Devuelve: [['value' => 'mi texto']]

// Para un campo multivalor:
// Devuelve: [['value' => 'primero'], ['value' => 'segundo']]

// getString() - Devuelve una representación en string plano
$node->get('field_foo')->getString();
// Devuelve: "mi texto"

// Para referencias a entidades, getString() devuelve el ID
$node->get('field_tags')->getString();
// Devuelve: "15" (o "15, 23, 42" para multivalor)

getValue() es útil cuando necesitas la estructura de datos completa, especialmente para campos complejos o cuando pasas datos a una API.

getString() es práctico para depuración rápida o cuando solo necesitas una salida de string simple.

Métodos helper para campos comunes

Algunos campos base tienen métodos getter dedicados:

$node->getTitle();        // Igual que $node->title->value
$node->getCreatedTime();  // Igual que $node->created->value
$node->getOwnerId();      // Igual que $node->uid->target_id
$node->isPublished();     // Devuelve boolean
$node->bundle();          // Devuelve el machine name del tipo de contenido

Estos métodos son más limpios y recomendados cuando están disponibles.

¿Qué es Drupal moderno?

Cuando decimos «Drupal moderno» nos referimos a Drupal 10, 11 y versiones futuras. Estas versiones comparten la misma API de entidades y sistema de campos, así que todo lo explicado en este artículo aplica a todas ellas.

Drupal 7 y anteriores usaban un enfoque completamente diferente. Drupal 8 y 9 introdujeron el sistema actual, pero ya no tienen soporte. Por eso nos enfocamos en Drupal 10+ como "Drupal moderno".

CA

Carlos Rincón

developer

Recent Posts