9.9.1. Gestión de la configuración en Drupal. Importación de contenido y configuración.
Cuando importas una configuración de un sitio a otro, algunas configuraciones son necesarias para mostrar contenido, pero el contenido en sí no se incluye en la configuración. En este tutorial, explicaremos cómo transferir bloques, nodos y términos de taxonomía de un sitio a otro.
Creemos un bloque en un sitio y transfiramos la configuración al otro. Puedes ver cómo transferir configuraciones de un sitio a otro en el artículo anterior 9.9. Trabajar con configuraciones en Drupal. Configuraciones activas, sincronizadas y transferencia de configuraciones de DEV a LIVE.
Verás un error como: "Este bloque está dañado o falta. Puede que falte contenido o que necesites habilitar el módulo original.":
El bloque requiere una entidad block con un UUID específico. UUID es un identificador único de la entidad; incluso si creamos el mismo bloque con el mismo contenido en el nuevo sitio, no se reconocerá porque tendrá un UUID diferente. Puedes ver el UUID requerido en la configuración del bloque:
No confundas el UUID del bloque con el UUID de la configuración. Las configuraciones también son entidades en Drupal, pero a diferencia de los bloques y nodos que son entidades de contenido, las configuraciones son entidades de configuración. En una de las próximas lecciones veremos las clases ContentEntity y ConfigEntity.
Ahora que sabes qué UUID necesitas para el bloque, puedes crear este bloque a través del código, de modo que cuando hagas el despliegue, se cree con el UUID correcto. Para ello, usamos hook_update_n()
:
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%
Debes agregar hook_update_n()
al archivo .install
de tu módulo personalizado. Para que la actualización se detecte, el módulo debe estar habilitado. Cada nuevo hook_update_n()
se ejecuta cuando se accede a update.php
o se actualiza la base de datos con Drush o Drupal Console. Usa números como 8000 y más para Drupal 8.x (7000 para Drupal 7.x):
/modules/custom/drupalbook/drupalbook.install:
/**
* Añadir bloque simple con texto e imagen.
*/
function drupalbook_update_8001(&$sandbox) {
$uuid = 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142';
$block = \Drupal::entityTypeManager()->getStorage('block_content')->loadByProperties(['uuid' => $uuid]);
if (empty($block)) {
$block = \Drupal\block_content\Entity\BlockContent::create([
'info' => 'Bloque de texto simple con imagen',
'type' => 'basic',
'uuid' => $uuid
]);
$block->body->value = '¡Hola, Mundo!';
$block->save();
}
}
Ahora mueve este código al segundo sitio y accede a update.php
:
Drupal encontrará esta actualización y verás tu bloque después de ejecutarla.
Antes de crear el bloque, verificamos si ya existe, para evitar errores si ya está presente en el sitio original. Solo el texto del bloque se transfiere, las imágenes cargadas en línea a través del navegador de imágenes de CKEditor no se incluirán. Debes transferir estos archivos por separado (drush, ssh, ftp, git, etc.).
Lo mismo aplica a términos de taxonomía. Las configuraciones solo incluyen ajustes y campos de términos, pero no los términos en sí. Para crear un término:
\taxonomy\Entity\Term;
/**
* Crear término de taxonomía.
*/
function drupalbook_update_8002(&$sandbox) {
$term = Term::create([
'name' => 'Drupal 8',
'vid' => 'tags',
])->save();
}
En el campo vid
coloca el nombre de la taxonomía.
Para crear nodos:
/**
* Crear nodo programáticamente.
*/
function drupalbook_update_8003(&$sandbox) {
$node = Node::create(['type' => 'page']);
$node->set('title', 'Sobre nosotros');
$body = [
'value' => 'Texto sobre nosotros',
'format' => 'basic_html',
];
$node->set('body', $body);
$node->status = 1;
$node->enforceIsNew();
$node->save();
}
También puedes usar esta forma alternativa:
$node->body->format = 'basic_html';
$node->body->value = 'Texto sobre nosotros';
Cada vez que agregues un nuevo hook_update_n()
, debes ejecutar update.php
. Si usas Acquia u otro hosting con auto-despliegue, este proceso puede estar automatizado.
Ejemplos de código disponibles en GitHub:
https://github.com/levmyshkin/drupalbook8