Feeds es un módulo disponible en Drupal para importación de contenido en nuestro Drupal. Contenido en un sentido amplio, pues usando Feeds se pueden crear no solo nodos, también usuarios, términos de taxonomía y otras entidades.
En comparación a otros módulos como Migrate, incluido en el core de Drupal 8, Feeds ofrece las siguientes características que lo diferencian:
- Todas las importaciones se crean desde la interfaz de Drupal.
- Permite ejecutar las importaciones mediante subida manual de fichero, una URL o un directorio local.
- Se pueden realizar todas las importaciones desde la web sin tener que hacer ningún cambio de configuración.
- Permite establecer importaciones periódicas.
- No está restringido a un solo origen de datos.
Es decir, es un módulo más sencillo que Migrate, o al menos más sencillo de manejar, ya que todo se realiza vía interfaz sin necesidad de tirar código. Esto hace que generalmente sea recomendable usar Feeds cuando:
- Las importaciones se van a realizar por personal no técnico.
- Se necesitan hacer varias importaciones desde diferentes archivos/URL.
- Todo el contenido está listo para añadir en Drupal sin procesados adicionales.
- Se requiera actualizar el contenido periódicamente desde fuentes externas que van cambiando.
Por ejemplo, imaginemos que nuestra web muestra información sobre resultados de una competición de un deporte, por ejemplo petanca en todos los parques de una ciudad. Digamos que alguien recolecta el resultado de las partidas y lo guarda en un fichero CSV. Feeds procesaría periódicamente ese CSV, añadiendo a nuestra web las nuevas partidas que se hayan producido, pero también podría actualizar partidas anteriores que se hubiese modificado (por un error de transcripción inicial, porque se ha atendido a una reclamación de un jugador, etc).
También podría ser útil si necesitamos importar datos públicos de varias webs a una web nueva. Con Feeds podríamos configurar la importación de datos de estas diferentes fuentes a nuestra web, con la ventaja de que si se modifican los datos en la webs originales esos cambios se trasladarán a nuestra web.
Vamos a ver cómo hacerlo.
Importar datos con Feeds
Instalación
Lo primero, lógicamente, es instalar el módulo. Feeds se instala, al igual que el resto de módulos, mediante composer:
cd /ruta/del/proyecto
composer require drupal/feeds
No exige ninguna acción especial adicional, simplemente que el código esté presente.
Visión general
La idea de Feeds es la siguiente: primero debemos crear una configuración de importación, Feed Type, que es la configuración general de cómo importar los datos, de qué tipo de fuente, y donde volcarlos. Una vez tengamos nuestra configuración de importación se debe crear un Feed propiamente dicho (o canal de noticias, como lo traduce el interfaz al español), que es lo que realmente realiza la importación, usando una configuración o Feed Type que previamente hayamos creado.
Este esquema nos permite usar la misma configuración para diferentes fuentes, de forma que lo configuramos una vez y lo usamos en varias importaciones. En el ejemplo anterior de la petanca, imaginemos que la liga de petanca se extiende a más ciudades. Una persona por ciudad se encargaría de crear el CSV y guardarlo en una carpeta diferente, de forma que cada persona trabaja en su propio fichero sin interferirse. Podríamos reutilizar la misma configuración en diferentes importaciones, una por cada carpeta con los datos de cada ciudad. Al final todos los datos se importarían en un mismo contenido (por ejemplo, un contenido partidas).
Para reflejar esta división podemos ver dónde muestra Feeds los Feed Types y los Feeds: los Feed Types están bajo la sección de estructura, junto a los tipos de contenido, las taxonomías, vistas o tipos de comentarios. Los Feeds están bajo la sección de contenido, ya que a fin y al cabo son un contenido en potencia
Crear una "configuración de importación"
Esto es crear un FeedType, en la jerga de Feeds. Es la configuración general de una importación. Aquí podemos especificar el origen de los datos (si es una URL, un fichero, etc), el contenido al que se van a importar (p. ej.: contenido de tipo noticia) y otras configuraciones.
Las importaciones se crean en Estructura > Feeds Types > Add Feed Type (/admin/structure/feeds/add). En esta página podremos ver lo siguiente:
Lo primero que nos pedirá es un nombre y una descripción del importador, datos que son simplemente una forma de poder luego saber fácilmente el uso del importador: un dato para humanos, no tiene ningún impacto en la ejecución del importador.
Después vienen las opciones del importador que configuran su comportamiento. Vamos a repasarlas:
Fetcher
Esta opción nos permite seleccionar cuál será la forma de obtener los datos a la hora de realizar la importación. Entre las opciones posibles tenemos:
- Download: permite importar mediante una URL.
- Upload: se importará mediante una subida de fichero manual. Es decir, los datos a importar provendrán de un fichero que se subirá a Drupal desde nuestro equipo local.
- Directory: en este caso los ficheros de importación se encontrarán en una carpeta de nuestro sistema de ficheros public, private, o cualquiera disponible.
Tras elegir el fetcher tendremos la pestaña "Fetcher settings" donde podremos elegir más opciones relacionadas con la opción seleccionada
Parser
Es el parseador del origen de datos. Indica el formato del archivo con los datos a importar. Entre los formatos disponibles tenemos RSS/ATOM, CSV y XML.
Tras haber elegido un formato de origen podemos configurarlo en la pestaña "Parser settings". Por ejemplo, para archivos CSV podemos indicar sobre qué carácter se han separado los valores (coma, punto y coma, dos puntos, etc).
Processor
El procesador es el que se encarga de crear el contenido adecuado en Drupal con los datos recibidos. Entre ellos tenemos nodos (lo más común), usuarios, términos de taxonomía y un largo etcétera. Es decir, un processor de tipo nodo creará nodos con los datos a importar.
El procesador se configura en "Processor settings". De esta configuración las opciones más importantes son:
- Update existing contents: Permite escoger el comportamiento a la hora de importar un contenido que se ha importado previamente. Podemos elegir entre no hacer nada, reemplazar el contenido (es decir, borrar el contenido actual y crear uno nuevo), o actualizar el contenido ya existente (el contenido no se borra y recrea, solo se edita). Normalmente la última opción será la elegida, de forma que mantenemos el contenido 'vivo', actualizándose en caso de que cambie en el origen de datos. Al ser la misma entidad interna en Drupal cualquier relación que exista de otros contenidos a este se mantiene. En el caso de borrar y crear un contenido nuevo, por ejemplo, sí perderíamos las relaciones que hubiese.
- Previously imported items: Permite elegir qué acción tomar si en importaciones anteriores se creó un contenido que no está presente en posteriores importaciones. Aquí hay multitud de opciones, desde conservar el contenido hasta borrarlo, despublicarlo, etc. Mediante esta opción controlamos por tanto las situaciones en el que un contenido ya importado desaparece del origen de datos. ¿Debemos borrarlo? ¿Solo despublicarlo? ¿Dejarlo disponible? También se pueden realizar acciones aparentemente extrañas, como publicarlo en caso de que el contenido no esté en el feed de la última importación. ¿Extraño? Sí, pero puede ser una forma de manejar la publicación de contenidos. Es solo una muestra más de la flexibilidad de Feeds.
- Author: Permite elegir el autor del contenido creado, entre los diferentes usuarios de Drupal.
Settings
Tenemos una pestaña de configuración que de momento solo nos permite seleccionar cada cuánto se realizará una importación. Esto nos es útil si nuestra importación se basa en URL o directorios ya que estos pueden ir cambiando. De esta forma podemos establecer una importación periódica, que es lo más habitual en Feeds, aunque no es obligatorio.
Una vez creadas las importaciones todas serán accesibles en Estructura > Feeds Types (/admin/structure/feeds).
Añadir campos a la configuración de la importación
Una vez tenemos creada nuestra importación podemos empezar a asociar los campos de nuestra fuente de datos a los campos del contenido que se va a importar en Drupal. A continuación mostramos un ejemplo de añadir campos provenientes de un CSV.
Para ello tenemos que ir a la pestaña "Mappings" de la importación (en realidad es la pestaña que se nos muestra cuando guardamos una configuración de importación pro primera vez). Aquí podremos comenzar a añadir campos.
Lo primero que tendremos que hacer será seleccionar el primer campo que queremos añadir (por ejemplo, el "Title") mediante el selector "Select a target". Es decir, configuramos de dónde sacar el dato que irá en el campo del contenido en Drupal que se llama "Title".
Seleccionamos de donde provienen estos campos, mediante el selector "Select a source". Al desplegar el selector de fuentes veremos varias opciones. La mayoría son fijas y no obtienen el dato del fichero de entrada. Esto hace que en esa importación todos los contenidos creados tengan el mismo valor para ese campo. Pero esto no es lo normal, lo normal es seleccionar un campo de nuestro fichero de entrada.
Los nombres de los campos de fichero origen de los datos (por ejemplo, la columna de un archivo CSV) no estará en este listado, así que no podemos seleccionarlos directamente. Esto al principio parece confuso, porque quizá esperariamos ver en este selector los campos del fichero de origen. Sin embargo, no es así (quizá porque Feeds tendrá que preprocesar el fichero en cuestión, lo que lo haría menos flexible). Por ello, para añadir un campo de nuestro origen de datos tenemos que elegir "New CSV source" (en caso de ser otro origen será "New XML source", por ejemplo). Esto nos mostará una nueva caja de texto donde añadiremos el nombre del campo relativo a nuestra fuente de datos. Por ejemplo para archivos CSV será el nombre de la columna (según sus cabeceras).
Al final nos quedaría algo así:
A la derecha podemos ver algunas opciones adicionales para cada mapeo:
- Unique: Indica si el valor de ese campo es único para cada contenido. Esto hará que la siguiente vez que se trate de importar un contenido con dicho valor en ese campo se considere que es el mismo contenido importado anteriormente. Eso llevará a tomar la decisión elegida en la configuración de la importación vista anteriormente, en el campo "Update existing contents". Por tanto, normalmente, esto se aplicará a un campo que identifique unívocamente un contenido a importar. Si ningún campo se marca como único Feeds no podrá detectar que un contenido importado por segunda ya está importado por lo que se crearán duplicados.
- Configure: Según el tipo de campo dónde se van a insertar los datos podremos tener diferentes opciones. Por ejemplo, cuando el campo es un término de taxonomía nos permite la opción de crearlo automáticamente si no existe, o incluso obtenerlo a través del nombre. Si es un campo de tipo resumen y cuerpo de texto podremos elegir el formato de texto. Y así según las opciones de cada campo.
- Summary: Muestra las opciones elegidas en la configuración del campo. Es simplemente informativo, para no tener que abrir el formulario de configuración del campo para ver cómo lo tenemos configurado.
- Delete: Borra el mapeo.
Crear una importación
Ya tenemos la configuración de la importación, ahora lo que tenemos que hacer es crear la importación propiamente dicha usando el Feed type que hemos creado. Para ello tendremos que ir a Contenido > feeds (admin/content/feeds). Aquí deberemos de pulsar "Add feed" (Ojo, en español pone "Agregar canal de noticias").
En esta pantalla tenemos que darle un título a la importación y seleccionar el origen de datos.
En la imagen de arriba podemos ver que hay que subir un archivo, ya que se decidió que la forma de hacer la importación sería mediante subida de ficheros. Si hemos escogido otra forma de obetner el fichero veremos otras opciones (por ejemplo, una URL cuadno el método es "descarga").
Ahora podremos pulsar el botón "Save and import". Dependiendo de nuestra configuración de importación (Feed Type) esta comenzará en el momento o se realizará periódicamente.
Una vez creada la importación podremos editarla, lanzar la importación, borrarla, borrar los items creados mediante la importación, etc.
Notas para desarrolladores
Cuando realizamos una importación podemos bastarnos con todas las herramientas que nos trae feeds pero en ocasiones podemos necesitar funcionalidad extra.
Como solución Feeds permite extender la funcionalidad mediante la creación de módulos, donde podemos crear los siguientes tipos de plugin:
- FeedsTarget: permite crear un target de un campo, pudiendo poner su valor donde sea que lo necesites. Feeds inlcuye targets para todos los campos del core, por lo que si usas un campo provisto por un módulo o un campo propio tendrás que crear un un plugin de est tipo para que Feeds sepa manejar el campo.
- FeedsProcessor: permite crear un procesador de Feeds para poder crear el contenido que se necesite. Es decir, si necesitas que se creen entidades no provistas por el core necesitarás crear un procesador específico.
- FeedsSource: permite crear campos origen de datos. Por ejemplo, podríamos crear un origen de datos para campo que sea la hora actual, de forma que Feeds insertaría la hora actual en el campo al que estuviese mapeado este origen de datos.
Como puede verse Feeds es una buena herramienta para importar contenido a nuestro Drupal, especialmente cuando viene de diferentes fuentes y se importa periódicamente. Es sencillo de configurar y lo suficiente flexible como para no necesitar código adicional.