Una necesidad que aparece cada cierto tiempo consiste en la migración de nodos de un tipo de contenido a otro. Las razones para ello pueden ser varias: fusión de varios tipos de contenido en uno, apertura de un tipo de contenido en varios, etc.

Drupal provee varias formas de realizar este trabajo. De eso se puede inferir que no existe una forma categórica de hacerlo y por eso emergen varias posibilidades.

Hace poco tiempo tuvimos que realizar, una vez más, este tipo de trabajo. Por razones desconocidas a esta altura, el cliente había definido una docena de tipos de contenido. Con el correr de los años, quedó en evidencia que en verdad se trataba de un único tipo de contenido y que a lo sumo ameritaba contar con un campo de referencia hacia un término de vocabulario para categorizar el contenido.

Además, cada tipo de contenido tenía sus propios campos, aunque en realidad eran el mismo. Es decir, se había desaprovechado la capacidad de Drupal de utilizar el mismo campo en diferentes tipos de contenido. Esto implicaba enorme dificultad al diseñar vistas con diferentes tipos de contenido.

El objetivo era fusionar todos esos tipos de contenido y sus campos en un único tipo de contenidos.

Luego de analizar las opciones disponibles, nos inclinamos por el combo Views + Feeds.

Views se utilizó para exportar la información, mediante un display de tipo REST. En nuestro caso, elegimos el formato CSV, por lo cual tuvimos que instalar además los módulos Serialization + Serialization (CSV) + RESTful Web Services. El display se referencia luego con una URL específica. Creando una vista que listara todos los campos del tipo de contenido a exportar, contábamos con toda la información en un archivo CSV.

Como paso intermedio, fue necesario procesar ese archivo CSV mediante un sencillo script PHP que mapeara los desajustes que había entre los campos de origen y los campos de destino. Además, fue necesario mapear los ID de archivos para los casos en que los archivos adjuntos eran múltiples (para este caso, fue necesario generar otro CSV que mapear URL de archivo y ID de archivo).

Con el archivo ya procesado, se utilizó la interfaz del módulo Feeds para importar el archivo CSV en el nuevo tipo de contenido. Para gestionar los campos de valor múltiple, fue necesario instalar también el módulo Feeds Tamper.

Un desafío importante fue la migración de los campos de referencia a nodos que también se estaba migrando. Es decir, los nodos migrados referenciaban en algunos de sus campos a otros nodos que se estaba migrando. En el resultado final, las referencias debían apuntar a esos nuevos nodos recién migrados. La solución consistió en configurar el módulo Feeds para actualizar el contenido existente. Entonces, luego de la primera ejecución de la importación mediante Feeds, se borraron los nodos viejos. Luego, se volvió a ejecutar la misma importación mediante Feeds. Dado que la referencia de los nodos se configuró por títulos, los campos de referencia se actualizaron apuntando a los nodos recién creados. Esto suena a trabalenguas, pero estoy seguro de que quien se enfrente a este desafío lo comprenderá rápidamente.

Algo bueno del módulo Feeds es que ofrece un informe luego de realizada la migración. A partir del mismo es posible conocer los problemas que hubo y, en función de ese conocimiento, corregirlos y rehacer la importación.

Una vez terminado el proceso para un tipo de contenido, fue necesario hacer lo mismo para cada uno de los tipos de contenido viejos.