TL;DR: El módulo default_content permite la creación de contenido desde código.
Aviso: el módulo se encuentra en versión alfa, y aunque no parece que vaya a aparecer versión estable en un futuro cercano, es usable.
Posibles usos
La creación de contenido por defecto puede ser útil en los siguientes casos:
- Web multisitio con contenidos idénticos entre sitios. Ej: página de política de privacidad
- Inicios del desarrollo de una web, para que al instalar de 0 ya se tenga algo de contenido más "realista" de lo que podría generar, por ejemplo, devel
- Trasladar contenido entre entornos (por ejemplo, subir a producción un bloque personalizado directamente creado en local)
Instalación
Instalación normal con composer:
composer require 'drupal/default_content:^2.0@alpha'
Instalación desde la página de módulos "/admin/modules" o con drush "drush pm:enable default_content".
Funcionamiento del módulo
El módulo permite exportar los contenidos existentes (archivos, media, nodos, enlaces de menú, bloques, etc.) que se quieran para luego crearlos al instalar un módulo.
Exportar contenido
Default content provee varios comandos de drush para exportar el contenido desde la base de datos al código del proyecto en formato yml:
- "default-content:export" (alias dce) Exporta un contenido. Ej: "drush dce node 1 --file=modules/custom/example/content/node/node_title.yml"
- La ventaja de este comando es que permite poner nombre específico a cada contenido exportado en lugar de un inteligible UUID, pero habría que exportar las dependencias (ej: imágenes) manualmente
- "default-content:export-references" (alias dcer) Exporta un contenido y sus dependencias. Ej: "drush dcer node 1 --folder=modules/custom/example/content"
Nota: al exportar usuarios, para evitar que la contraseña sea cifrada de nuevo y por lo tanto sea distinta a la puesta actualmente, hay que cambiar el valor "pre_hashed" a "true".
Briconsejo: exportar solamente usuarios de prueba, no reales. No es seguro dejar credenciales, aunque estén cifradas en el repositorio.
---
pass:
-
value: XXXXXXXXXXXXXXXXXXXX
existing: ''
pre_hashed: true
Exportar el contenido definido en un módulo
Para exportar múltiples contenidos de una sola vez, pueden definirse los UUIDs dentro del archivo info del módulo:
---
default_content:
file:
- a61fa7ec-0042-4046-a111-57b729928784
media:
- b56d009d-4c04-4069-ae0d-237a8913aee0
menu_link_content:
- 3f5f8cb7-c6f3-476e-ad51-022037192f66
- 45bda6ee-cf9d-4b8f-93cc-6dc3ff72c9c8
node:
- d4de3ab9-590a-4c03-8639-64b35eac5d0f
- 7ed643cd-77b6-44a9-8d92-53e86e086bc8
taxonomy_term:
- 4bbaf48c-8ca7-4447-b30d-21da55a38eec
- 8160a8aa-d303-4208-b9bc-3e72705e98ed
user:
- 884dc358-2d6c-4611-b36e-1ee1b1420e64
- 4764185b-53bb-4d4b-b838-9341d3c5f568
Con el comando "drush default-content:export-module [NOMBRE MÓDULO]" (alias dcem), se exportará directamente todo el contenido definido a la carpeta "content" de dicho módulo.
Importar contenido
Se importa el contenido por defecto definido en un módulo al instalarse este (ej: al instalar el módulo "content_example" se crearía todo el contenido previamente exportado en "content_example/content". Es indiferente cualquiera de los comandos para exportar usados).
Arreglos y ampliación de funcionalidades
- Si se importa múltiples veces el contenido por defecto (por ejemplo reinstalando el sitio), los archivos se renombran al resubirse, por lo que se termina con archivos duplicados basura y si se vuelve a exportar el contenido se exportan con el nombre renombrado: https://www.drupal.org/project/default_content/issues/3200212
- Si se reinstala un módulo con contenido por defecto se intentan volver a crear con el mismo UUID y por lo tanto salta error de base de datos: https://www.drupal.org/project/default_content/issues/2698425
- Permitir importar contenido manualmente sin necesidad de reinstalar módulo: https://www.drupal.org/project/default_content/issues/2640734
Conclusión
Como muchas cosas en drupal, el módulo default_content puede ser una herramienta muy útil, siempre y cuando se tenga en cuenta que hay que saber dónde darle un par de martillazos para que funcione fino.
Imagen por Anja Bauermann de Unsplash.