Com obtenir valors de camps d’un node a Drupal modern

Client
  • Omitsis
Technologies
Date
  • 16/08/2024

Ja vam veure en un altre article com carregar un node pel seu ID, però ara necessitem saber com obtenir els valors dels seus camps.

És molt senzill — només necessites saber que l’objecte node té el mètode get, que ens permet obtenir aquests camps (atributs).

És important notar que aquests camps també són objectes en si mateixos, cadascun amb els seus propis atributs, depenent del tipus de camp. Pots esbrinar quins atributs estan disponibles depurant amb Xdebug (recomanat) o imprimint la variable usant Kint o dump().

Usant el mètode get()

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

// Un camp de text
echo $node->get('field_foo')->value; // "El que sigui que tingui el teu camp personalitzat"

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

Usant mètodes màgics (forma abreujada)

Amb els mètodes màgics de PHP, ni tan sols necessites escriure get. Així que l’equivalent de l’anterior seria:

echo $node->title->value; // "Lorem Ipsum..."
echo $node->created->value; // 1510948801
echo $node->body->value; // "El body complet, <strong>amb HTML</strong>"
echo $node->body->summary; // "El resum"
echo $node->field_foo->value; // "El que sigui que tingui el teu camp personalitzat"
echo $node->field_image->target_id; // 432

Tots dos enfocaments funcionen exactament igual. Usa el que prefereixis.

Tipus de camp comuns i les seves propietats

Tipus de campCom obtenir el valor
Text / String->value
Text with summary->value, ->summary, ->format
Integer / Float->value
Boolean->value (retorna 0 o 1)
Date->value (string en format ISO)
Entity reference->target_id, ->entity
Link->uri, ->title
File / Image->target_id, ->alt, ->title, ->entity

Treballant amb referències a entitats

Quan tens un camp de referència (com Media, Term o User), pots obtenir l’ID o l’entitat completa:

// Obtenir només l'ID
$media_id = $node->get('field_image')->target_id;

// Obtenir l'entitat referenciada completa
$media = $node->get('field_image')->entity;
$file_url = $media->get('field_media_image')->entity->getFileUri();

Comprovar si un camp té valor

Sempre comprova abans d’accedir per evitar errors:

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

Camps multivalor

Per a camps que poden tenir múltiples valors:

// Obtenir tots els valors
foreach ($node->get('field_tags') as $item) {
  echo $item->target_id;
}

// Obtenir només el primer valor
$first = $node->get('field_tags')->first();

// Obtenir com a array
$values = $node->get('field_tags')->getValue();

getValue() i getString()

Dos mètodes molt útils que funcionen en qualsevol camp:

// getValue() - Retorna l'estructura d'array crua
$node->get('field_foo')->getValue();
// Retorna: [['value' => 'el meu text']]

// Per a un camp multivalor:
// Retorna: [['value' => 'primer'], ['value' => 'segon']]

// getString() - Retorna una representació en string pla
$node->get('field_foo')->getString();
// Retorna: "el meu text"

// Per a referències a entitats, getString() retorna l'ID
$node->get('field_tags')->getString();
// Retorna: "15" (o "15, 23, 42" per a multivalor)

getValue() és útil quan necessites l’estructura de dades completa, especialment per a camps complexos o quan passes dades a una API.

getString() és pràctic per a depuració ràpida o quan només necessites una sortida de string simple.

Mètodes helper per a camps comuns

Alguns camps base tenen mètodes getter dedicats:

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

Aquests mètodes són més nets i recomanats quan estan disponibles.

Què és Drupal modern?

Quan diem “Drupal modern” ens referim a Drupal 10, 11 i versions futures. Aquestes versions comparteixen la mateixa API d’entitats i sistema de camps, així que tot el que s’explica en aquest article aplica a totes elles.

Drupal 7 i anteriors usaven un enfocament completament diferent. Drupal 8 i 9 van introduir el sistema actual, però ja no tenen suport. Per això ens centrem en Drupal 10+ com a "Drupal modern".

CA

Carlos Rincón

developer

Recent Posts