Imágenes por defecto en Drupal 7 en integración continua
En ese post vamos a hablar de cómo solucionar una de las problemáticas de Drupal 7 cuando desarrollamos para poder hacer integración continua. Desde la salida de Features y Strongarm la integración continua en Drupal 7 dejó de ser una utopía para ser una realidad compleja. Por suerte en Drupal 8 cada vez va a ser menos complejo realizar integración continua, pero aún hay que trabajar en Drupal 7 para algunos proyectos que dependen de código contribuido. Drupal es de los primeros CMS en separar configuración de contenido en la base de datos. Su esquema de datos permite gracias al trabajo de Features desagregar en la base de datos la configuración del contenido. Además exportando la configuración de la base de datos a código podemos hacer control de versiones sobre el Site building sin tener que hacer dumps de la base de datos. Aún así hay alguna configuración que depende del contenido que no esta todavía del todo bien resuelta, como el caso que vamos a ver: gestión de imágenes por defecto.
La problemática.
Cuando configuramos un campo tipo imagen tenemos la posibilidad de configurar una “imagen por defecto”. Esa imagen es la que se va a mostrar si el editor no sube ninguna imagen al editar el campo en la edición del nodo. Cuando en el site building de desarrollo subimos una imagen por defecto esa imagen se almacena en 'public://' y en la base de datos con su correspondiente fid. El campo queda configurado por defecto con el fid que corresponda a la imagen que hemos subido en desarrollo. Los problemas para la integración continua son dos:
- Los archivos subidos a 'public://' son contenido y por tanto no se mueven entre entornos y versiones.
- Si incorporamos el archivo en cada deploy no podemos controlar el fid asignado cada vez y habrá un problema de concordancia entre la configuración del campo exportado en features y el fid del archivo real en cada entorno.
La solución.
Como casi siempre la solución en la Drupal Way of Life es un hook, en ese caso el hook_field_create_instance(). Para contextualizar la solución hay que decir que usamos como controlador de deploys un modulo propio y su hook_enable(). Para integrar imágenes por defecto en nuestro flujo de integración continua debemos primero crear el archivo en el sistema de archivos de Drupal 7 y luego configurar ese nuevo elemento que hemos creado en el campo. Para eso el campo ya debe existir, por eso usamos hook_field_create_instance cuando la configuración es en el base field. Primero definimos la ubicación de la imagen por defecto dentro de nuestro modulo de deploy: [gist id="36902c675316beeebebf"] Luego definimos el objeto para crear el nuevo archivo dentro de Drupal: [gist id="95d4b11647eab51164e9"] Guardamos el archivo y almacenamos el fid que se le ha asignado: [gist id="b94c1489bc51e92724bf"] A continuación cargamos el campo y definimos como valor por defecto nuestra imagen que acabamos de crear y que referenciamos por su fid que nos ha devuelto la función file_copy: [gist id="2c27b611d5265e8f21bc"] Finalmente actualizamos el campo con la nueva configuración: [gist id="6740ce32aab86a0a03bf"] Visto todo junto dentro del hook: [gist id="b5c287a1a1d2593d9373"] Espero que os sea útil a los drupaleros mientras sigamos desarrollando con Drupal 7. ¡Cuéntanos si te ha servido y comparte tus mejoras!