Importar y exportar contenidos en Drupal

Para construir una web en algún momento hay que entrar los contenidos que formarán el grueso de la información que el promotor de la web quiere exponer y los usuarios que navegan Internet desean encontrar. Este volumen de contenidos puede ser muy variable y es siempre una parte importante del esfuerzo de realización de cualquier proyecto.

A veces los contenidos a introducir están en otra web, a veces en varias, a veces en ficheros de texto, o una base de datos, a veces hay que redactarlos enteros, quizá estan en formato XML. Estos datos pueden ser textos breves o largos, números, o incluso montañas de números, fechas, nombres, direcciones postales o coordenadas geográficas, imágenes, o ficheros multimedia de diversos tipos. Traer contenidos a una web y después poder exportarlos y distribuirlos es todo un trabajo en sí mismo.

Para poder introducir estos datos en una web nueva disponemos en Drupal de muy diversos caminos y herramientas, todos adaptados a diversas ideosincrasias tanto del proyecto como de los datos. Cada proyecto es un mundo y generalmente introducir "datos planos" no es un problema, el problema viene si hay que refiltrar datos que se deben vincular entre ellos automáticamente a medida que los importamos (referencias cruzadas, tags).

A veces la cuestión no es importar datos, sinó todo lo contrario: exportarlos. Son muchas las situaciones en las que nos puede interesar "sacar" datos de nuestra web, tanto dando enlaces para que otros sistemas puedan agregar nuestros contenidos con formatos estandarizados como XML, JSON o RSS, como ofrecer la posibilidad en ciertas gestiones de nuestros datos de poder disponer de datos en formato Excel, CSV, PDF o Word. La comunidad de Drupal ofrece muchos módulos para todas estas tareas, algunos más extendidos, otros más específicos. Vamos a comentar los más notables y útiles.

Importaciones contenidos a nuestra web

Para construir muchas webs o para ampliarlas es imprescindible apoyarse en una herramienta de importación contrastada y extensible. De Drupal 4 a Drupal 6 la herramienta más sólida para este proceso era "Node import", posiblemente todavía una buena alternativa para webs que todavía funcionen en la versión 5 ó 6. Este módulo ayudaba a importar los datos en un proceso guiado por un formulario multipaso. Este formulario conducía por 7 pantallas al encargado de realizar una importación:

  • primero seleccionando un fichero en formato CSV (formato de hoja de cálculo guardado en texto),
  • en el siguiente paso pide seleccionar el tipo de contenido que acogerá ese cambio,
  • el siguiente identifica las columnas del fichero CSV y los campos del tipo de contenido para crear un mapa de correspondencia entre ambos,
  • el siguiente paso permite ajustar algunos datos propios de los nodos creados, como idioma, autor, estado de publicación y promoción, o fecha,
  • esto lleva a una funcionalidad muy interesante en la que se presentan los datos de un grupo seleccionable por el usuario (los primeros 10 registros de la tabla del fichero CSV, por ejemplo) que se presentan en pantalla y permiten ver si hay algún error en el proceso y si lo hay, corregirlo,
  • finalmente se valida y ser realiza el proceso que puede llevar un buen rato según el número de registros,
  • en un último momento se accede a los ficheros guardados en el disco duro por si se quiere repetir el proceso.

"Node import" es un módulo muy práctico pero llegó a tener sus límites a medida que aparecían nuevos tipos de campos CCK, o por ejemplo con el auge de Ubercart. Alguna extensión de código permitió plantearse la importación de productos para Ubercart, pero seguía siendo complejo. Mientras tanto aparecía un módulo que poco a poco evolucionaría hasta convertirse en una gran navaja suiza de la importación en Drupal: "Feed API". Este módulo nacía como una alternativa al módulo de agregación en el core de Drupal, pero con opciones mucho más flexibles y extensibles. Durante un tiempo se convirtió en una alternativa a la importación para Drupal 6.

Pero con el desarrollo de Drupal 7 y los planes para lo que sería en su momento la siguiente versión de Drupal el equipo de desarrollo de "Feed API" desarrolló aún más esa plataforma para convertirla en lo que seguramente es una buena herramienta para importar contenidos en Drupal 7: "Feeds". Este módulo está concebido no solo para importar contenidos desde un enlace RSS, sinó que una arquitectura modular de su código permite crear submódulos que abren entradas o salidas, desde ficheros o desde URLs y en diversos formatos. Es interesante observar la forma de construir un importador con los parámetros de las pestañas laterales y siguiendo un esquema claro:

  • los parámetros básicos definen si estamos construyendo un importador o un actualizador, si sigue un esquema temporal regular y dónde estará el importador,
  • el siguiente paso es indicar si tomamos los datos de un fichero o de una URL,
  • el siguiente paso requiere indicar en qué formato se encuentran los datos del importador, de forma estándar RSS, CSV, OPML o XML con algunas variantes,
  • a continuación indicamos si importamos nodos, taxonomías o usuarios y parámetros de la propiedad de los datos,
  • finalmente mapeamos los datos creando una correlación entre los datos de la fuente que estamos usando y los campos que pretendemos llenar en nuestra base de datos.

Feeds es muy completo pero además es extensible con módulos contribuidos que amplían algunas de sus características, formatos de entrada (como JSON, FileMaker o datos SQL) y procesado de datos. Entre estos módulos es muy práctico "Feeds tamper" que permite crear normas de filtrado y procesado de los datos a medida que son importados, permitiendo alteraciones y búsqueda y sustución en muy diversas maneras, y que resultan una ayuda imprescindible en muchos casos. La lista de extensiones para "Feeds" es realmente extensa, se puede importar cualquier cosa y en cualquier formato.

"Feeds" es una herramienta muy potente, que puede llegar a requerir mucho tiempo para configurar un importador pero que después puede actuar solo con miles de registros.

Exportar contenidos desde nuestra web

Hemos visto como importar contenidos, pero a veces, nuestra necesidad es la contraria: exportar nuestros contenidos. Esto suele ser común en webs en la que se ha creado algún tipo de gestión, como por ejemplo un sistema de creación de ofertas, o queremos exportar datos de perfiles de miembros. Hay muchas razones para tener esta necesidad y la herramienta más adecuada para esta tareas es el módulo "Views data export". Este módulo es una extensión para el popular "Views" y su función es añadirle a éste una nueva forma de visualizar los resultados, en este caso como un fichero Excel, como un fichero CSV, como un fichero de texto, como un fichero de Word (.doc) o como un fichero XML.

En el caso de que lo que queramos es completar los views de una gestión con la función de exportar es muy interesante crear el views al que le damos el formato de Excel, por ejemplo, como un adjunto a otro views. De este modo, el adjunto al pie de una views, normalmente mostrado como una tabla de resultados, contendrá un icono de exportación a Excel muy conveniente. Es decir, que podemos exponer un enlace para la exportación de los datos en la misma página donde se muestran los datos. Es tan flexible este formato de exportación que podemos añadir literalmente un enlace para exportación donde queramos: en la cabecera o al pie de una página, intercalado en cualquier punto de un nodo (con el módulo "EVA"), en un bloque o en una pestaña de menú secundario.

Configurar la salida y el nombre del fichero es muy sencillo en los cuadros de configuración al efecto, y generalmente lo más fácil es exportar todos los datos en una cierta selección pues en Excel podremos realizar más fácilmente las ordenaciones y listados. Hay que tener en cuenta que exportar muchos datos puede llevar mucho tiempo y es mejor configurarlo en modo de creación de datos en "batch" para que el proceso se divida en varias acciones y no en una sola que nos pueda bloquear el servidor, algo básico en según que sitios.

Atención a las URLs

Importar una web en nuestro site requiere prestar atención a un paso que suele descuidarse y es un proceso entretenido y delicado. Tanto si la web anterior tenía URLs semánticas, como si no las tenía, el contenido de la web anterior ya estaría indexado en Google. Si rehacemos el esquema de URLs en el nuevo site al importar el contenido y estructurarlo mejor, nos encontraremos que los anteriores contenidos quedarán desubicados en Google. Esto es así ya que cada vez que alguien haga una búsqueda que arroje como resultado una página de la web anterior, esa URL, todo y estar en el mismo dominio, arrojará un mensaje de "página no encontrada" (error 404). Lógicamente esa página no está en nuestra web actual y el mensaje es lógico y correcto.

Para solvertar este problema disponemos en Drupal de los módulos "Path redirect" y "Redirect". El primero es la versión de este módulo para Drupal 6, pero se ha reescrito en el segundo para Drupal 7 juntándolo con el módulo "Global redirect". Tanto "Path redirect" como "Redirect" tienen un interface muy parecido al módulo core de URLs semánticas, pero aquí emparejamos las URLs antiguas que nos darían mensajes de página no encontrada con las nuevas, las de la actual web. De esta forma cada vez que alguien nos pide esa página porque la ha encontrado en Google, el sistema es capaz de darle la nueva, pero además podemos programar la redirección en un formato (301 redirect) que le diga a Google que substituya la anterior por esta.

Recopilar todas las direcciones anteriores y mapearlas con las nuevas es una tarea que puede que no tenga un esquema automatizable sencillo. Además también vale la pena tener en cuenta que estos módulos se encargan de realizar de forma automática esta tarea en nuestro site si cambiamos las URLs de nuestras páginas inadvertidamente.

Migraciones desde otros sitios

Una arquitectura modular que está ganando fuerza con la llegada de Drupal 8 es la funcionalidad "migrar" una web en otra gracias al módulo "Migrate" que estará incorporado en la próxima versión 8 de este CMS. Esta incorporación dará mucha fuerza a la nueva plataforma ya que facilitará mucho la posibilidad de migrar cualquier web, Drupal o no, a un nuevo Drupal 8. Tanto es así que hasta ahora para actualizar una web de Drupal tenía que hacerse versión a versión. Esto quiere decir que para actualizar un Drupal 4 a la versión 7, había que actualizar primero a Drupal 5, luego a Drupal 6 y finalmente a Drupal 7. Con "Migrate" se podrá pasar de cualquier Drupal a la versión 8.

"Migrate" es un framework extensible de forma que es posible construir importadores específicos, de los que ahora hay disponibles para Drupal 5/6/7, Wordpress, Typo3 o phpBB y algunos extras para facilitar estas tareas. Por sí mismo "Migrate" puede tratar con todo tipo de entidades de Drupal (nodos, usuarios, taxonomías, comentarios,...), pero es esencia un framework para desarrolladores. Es decir, que el uso normal es crear una familia de módulos basados en "Migrate" para conectar con nuestra web antigua, detectar sus estructuras de datos y traerlas a nuestra nueva web.

Alguna solución no relacionada con el mencionado módulo "Migrate" que vale la pena mencionar es el módulo "Import HMLT". Este módulo rastrea una web de origen para recrear en un Drupal instalado en nuestro servidor una réplica de toda la estructura del site siguiendo el mismo árbol de menús. La configuración en este caso tampoco es nada sencilla, pues lo primero que hay que hacer es que el sistema pueda identificar qué zonas del código HTML de la web de origen contiene el título, el menú, el contenidos principal, los tags y la estructura de URL. La configuración puede ser costosa y lo único que hará es "traernos" las páginas a nuestro nuevo site, sin diferenciar campos o tipos de contenidos, pero puede ser una base sobre la que seguir trabajando. Este módulo es una forma interesante de romper la barrera de traspasar los contenidos de una web anterior a una más nueva, y a partir de ahí poder disfrutar de las ventajas de Drupal en muchos otros aspectos.

Web services

No es el objetivo de esta revisión extendernos en un campo que merece un artículo (o varios) por sí mismo como es la exportación y la importación por Web Services. Los servicios web son una tecnología que permite abrir puertos de la web que sirven datos en formatos acordados y más o menos estándares. Esta es una forma natural de extender hoy en día las webs, ya que estamos acostumbrados a una sola forma de servicio de datos en las webs... la propia web en formato HTML, pero como tenemos los datos almacenados en una base de datos, y como tenemos una forma de acceder a ellos a través de la web, podemos abrir otros puertos de entrada y salida de datos. Este camino es básico para facilitar el uso de nuestros datos web para una "app" desde una plataforma móvil, y Drupal 8 también lo incorporará de forma nativa.

Estos puertos pueden ser muy prácticos para conectar una web (que no solo sirve contenidos) con algún sistema de gestión. Un ejemplo muy óbvio podría ser conectar los datos que maneja nuestro sistema eCommerce (Ubercart, por ejemplo) con un entorno de gestión de contabilidad, o un ERP. Con una conexión de este estilo los pedidos creados en nuestra web se pueden enviar a un sistema de contabilidad y facturación centralizado. Conectar un CRM con nuestra web y sus formularios puede permitir a una gran empresa alimentar su sistema de gestión de clientes con datos provenientes de la interacción de estos clientes con la web. Existen algunos módulos específicos para realizar este traspaso de forma dinámica con CRMs como Salesforce y otros.

Para afrontar la creación de este tipo de puertos de entrada y salida de datos en Drupal se dispone del módulo "Services" que es una plataforma para construir puertos que son capaces de interactuar con la API de Drupal, tomando datos de sus entidades o introduciéndolos. La API de este módulo es muy flexible y es conectable con el módulo "Views" a través del complemento "Services Views".

En ciertas circunstancias puede ser un canal muy interesante para importar contenidos en una web, pero lo mejor es que es una forma excelente de mantener varios sites sincronizados, teniendo, por ejemplo en una sola web una central de noticias con un completo sistema editor que otras webs simplemente importan en intérvalos regulares (vía Cron). El sistema central puede permitir decidir a los editores en cuáles de los sites periféricos tiene que importarse cada noticia. Este es un tema muy interesante para ser abordado en un próximo artículo.

Conclusiones

Hemos visto diversos sistemas para traer datos nuevos a una web, cada uno con sus ventajas e inconvenientes. Lo que es evidente es que esta parte del desarrollo de cualquier web requiere mucho análisis y planificación, más cuanto más complejos sean los datos y más vinculaciones puedan tener entre ellos.

Esta es siempre una partida imposible de presupuestar a priori, pues de todas las tareas individuales que puede tener una web y que se pueden intentar acotar para presupuestar un proyecto, es generalmente imposible saber cuál es la complejidad en extraer los datos del cliente. A veces el cliente puede proporcionalos, pero a veces no sabe o no tiene equipo para realizarlo, y analizar sus sistemas para poder extraer la información es algo que puede implicar estudiar un sistema con características desconocidas. Las fuentes de esos datos pueden estar en formatos muy diversos y a veces distintos, y en según que ocasiones extraerlos y prepararlos puede requerir realizar varias veces esa tareas hasta encontrar la mejor fórmula.

El proceso de realizar el traspaso de datos de un sistema a otro puede estar lleno de tareas automatizadas y de otras manuales. Puede que incluso algún conjunto de datos no se pueda importar en un solo paso, sinó que requiera varios. La paciencia, la planificación y la perspicacia son las mejores consejeras para un trabajo que no suele ser lucido pero sí imprescindible en la construcción de muchas webs a partir de los datos de otra anterior. La experiencia del equipo de importación y la confianza del cliente en este equipo, también.