9.11.1. Trabajar con campos de entidad mediante programación
Recuperar valores de campos en entidades es bastante simple, pero existen varias formas de hacerlo. Veamos cuál es la mejor manera de trabajar con valores de campos en código personalizado. Siempre puedes consultar la información más reciente en el sitio oficial:
https://www.drupal.org/docs/8/api/entity-api/working-with-the-entity-api
En este artículo veremos ejemplos de trabajo con valores de campos. Puedes volver a esta página en cualquier momento como una guía rápida.
Trabajando con nodos
Cargar un nodo por su nid:
$nid = 234;
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $node_storage->load($nid);
Obtener el ID del nodo:
$node->id();
Obtener el bundle del nodo/entidad:
$node->bundle();
$entity->getType();
Obtener valores de campos:
$node->get('title')->value;
$node->get('created')->value;
$node->get('body')->value;
$node->get('body')->summary;
$node->get('field_foo')->value;
$node->get('field_image')->target_id;
También puedes usar una sintaxis corta:
$node->title->value;
$node->created->value;
$node->body->value;
$node->body->summary;
$node->field_foo->value;
$node->field_image->target_id;
Cargar nodos específicos por valor de campo:
$query = \Drupal::entityQuery('node')
->condition('type', 'article')
->condition('field_terms', 42);
$nids = $query->execute();
$nodes = $node_storage->loadMultiple($nids);
foreach ($nodes as $node) {
print $node->title->value;
$node->set('title', "Nuevo título para el nodo");
$node->save();
}
Modificar valores de campos:
$node->set('title', "Nuevo título");
$node->set('body', array(
'summary' => "Resumen",
'value' => "Texto largo",
'format' => 'basic_html',
));
$node->save();
También puedes usar una sintaxis corta para campos de valor único:
$node->title = 'Nuevo título';
$node->field_text = 'texto';
Obtener valores de campos múltiples:
$nids = \Drupal::entityQuery('node')->condition('type', 'album')->execute();
$nodes = Node::loadMultiple($nids);
$data = array();
foreach($nodes as $node) {
$photo = array();
foreach($node->get('field_image')->getValue() as $file){
$fid = $file['target_id'];
$photo[] = \Drupal\file\Entity\File::load($fid)->getFileUri();
}
$data[] = array(
'album_name' => $node->get('field_album_name')->getValue(),
'place' => $node->get('field_place')->getValue(),
'author' => $node->get('field_author')->getValue(),
'photo' => $photo,
);
}
Trabajando con campos de archivo
Los archivos se agregan mediante campos de referencia. Para acceder al archivo, primero obtenemos el ID y luego la entidad de archivo.
Obtener archivo por ID:
$fid = 42;
$file_storage = \Drupal::entityTypeManager()->getStorage('file');
$file = $file_storage->load($fid);
Obtener archivo desde campo de nodo:
$file = $node->field_image->entity;
Obtener propiedades del archivo:
$file->getFileUri();
file_url_transform_relative(file_create_url($file->getFileUri()));
$file->filename->value;
$file->filemime->value;
$file->filesize->value;
$file->created->value;
$file->changed->value;
$file->id();
También puedes consultar propiedades de la entidad de usuario que subió el archivo:
echo $file->uid->target_id;
echo $file->uid->entity->name->value;
echo $file->uid->entity->timezone->value;
Trabajando con campos de referencia a entidades
Recorrer valores múltiples de referencia:
foreach ($node->field_my_entity_reference as $reference) {
print $reference->target_id;
print $reference->entity->title->value;
}
Modificar campo de referencia múltiple:
$nids = [3,4,5,6];
$node->set('field_my_entity_reference', $nids);
$node->save();
Añadir valores adicionales al campo:
$nids = [3,4,5,6];
foreach ($nids as $nid) {
$node->field_my_entity_reference[] = [
'target_id' => $nid
];
}
$node->save();
Trabajando con párrafos
$my_paragraph = null;
foreach ($node->get('field_paragraph_reference') as $paragraph) {
if ($paragraph->entity->getType() == 'your_paragraph_type') {
$my_paragraph = $paragraph->entity;
}
}
if (!empty($my_paragraph)) {
print $my_paragraph->field_somefield->value;
}
else {
print "El nodo no tiene este tipo de párrafo.";
}
Obtener el tipo de párrafo:
$my_paragraph->getType();
Utilizaremos estos ejemplos más adelante al escribir módulos personalizados que trabajen con hooks y objetos de entidad.