Newsletter para devsEntra

Tutorial de migración a Drupal 8 con Migrate

¿Cómo migramos el contenido desde otra web a Drupal 8? Parece una tarea difícil pero, como ya hablamos en este artículo, es en gran medida una cuestión de planificación.

Migrar de Wordpress a Drupal, de Joomla a Drupal, de cualquier gestor a Drupal. ¡Será por opciones!

Puedes necesitar varias fuentes de origen de migración porque el proyecto unifique varias webs o esa pequeña web que tenías con tus propias tablas de base de datos o ficheros Excel con información de productos. Por citar algunos ejemplos, seguro que el tuyo es muy parecido, pero no igual. Si, lo sé, nunca es igual :|

¡Pero aquí está explicado todo paso a paso!

Vamos a ver punto a punto como ejecutar este proceso con una migración de un fichero CSV y convertirlo en contenido útil y estructurado en Drupal 8.

Aquí tienes el vídeo:

Descarga el código del módulo

Origen de los datos

Lo primero, estudiar el origen de datos

Lo contaba en la primera parte de este tema, es el punto de partida inicial y probablemente el más importante.

En este ejemplo tenemos una fuente de datos que es una lista de críticas de libros que queremos importar desde una tabla separada por comas usando OpenOffice. Puedes usar Excel o Google Spreadsheets para este cometido.

Para generar un fichero CSV desde un programa de hoja de cálculo basta con utilizar el comando de “Guardar como” y elegir este formato tabulado CSV. Guárdalo a buen recaudo, que luego lo utilizaremos.

Tutorial de migración a Drupal 8 con Migrate

El fichero de ejemplo está en el código que puedes descargarte aquí.

Crear el destino de la importación

Tipo de contenido

¿Es como empezar la casa por el tejado? Aunque lo parezca no es así. Con esto tendremos esta parte del proceso hecha y relacionamos más fácilmente nuestro origen y destino. La migración a Drupal empieza por aquí.

Estos pasos son necesarios y no están incluidos en el fichero de descarga.

Partimos de un Drupal 8 instalado en un servidor o en local con el perfil de instalación Estándar. En el vídeo lo verás en inglés, pero funciona igualmente si tienes Drupal en español o cualquier otro idioma.

Vista la estructura del CSV vamos a crear el tipo de contenido en Drupal 8. Es esencial utilizar los mismos nombres de campo que tenemos en el vídeo y este tutorial, para que nos funcione el enganche.

En Estructura > Tipos de contenido > Agregar tipo de contenido (Structure > Content types > Add content type en inglés) utilizamos el nombre legible de “Book review” y en el nombre de máquina “book_review”.

Añadir tipo de contenido para migrar a Drupal 8

Utilizo siempre que puedo nomenclatura en inglés para cuestiones de coherencia de programación, como en este caso. Es una forma correcta de darle sentido a todo lo que hagáis.

Si no te apañas con el inglés, no te preocupes, porque son palabras cortas y la traducción es muy sencilla de conseguir. No hay ningún problema en usar el castellano, pero recuerda que nos salvamos de problemas no utilizando tildes y la eñe.

Añadir campos

Observamos ahora los campos que queremos para contenido de este tipo. El título está creado por defecto y no se puede eliminar, aquí importaremos el título del libro comentado. Aprovecharemos también lo que Drupal llama “Body” o “Cuerpo del texto” para añadir el contenido de la crítica del libro.

Vamos a añadir dos campos más. Identificador del libro (isbn), Nombre y apellidos del autor del comentario (author_name). Ambos se crean de la misma manera.

Añadir campo migracion a Drupal 8

Dentro de nuestro tipo de contenido, click en ‘Administrar campos’ (Administer fields) y elegimos en ‘Añadir campo’ (Add field).
Una vez dentro seleccionamos en el selector de “Añadir un campo nuevo” (Add a new field) la opción casi última “Texto (sin formato)”. Escribimos el nombre legible del campo “ISBN” y esperamos unos segundos.

Vemos que junto a este campo aparece otro autocompletado con el valor “field_isbn”. Si utilizas otra etiqueta para el campo recuerda cambiar el nombre máquina.

Pulsamos en aceptar en las siguientes pantallas y repetimos el proceso para “Author Name”, nombre de máquina “field_author_name”.

Tendremos una configuración de campos final como esta:

Configuración final, tipo de contenido para migración a Drupal 8

Si vamos a Agregar contenido > Crítica de libro veremos los campos tal y como quedarían en el formulario de creación si fuéramos a usar un manejo manual.

¿Te perdiste? No te preocupes, échale un vistazo al vídeo donde explico todo paso a paso.

Creando el módulo para el proceso de migración

Si leíste el primer artículo de esta serie (te recomiendo ver el vídeo que lo acompaña) estarás esperando el paso intermedio de los tres que tenía toda migración. Recordemos, 1) origen, 2) proceso y 3) destino. Vamos a atacar ahora a lo más divertido, lo que tiene que ver con el proceso.

Necesitamos generar un módulo o descargar la versión terminada del que estamos usando en este tutorial. Puedes descargar el código aquí.

Si optas por la primera opción que sepas que hay varios métodos: con la terminal a través del comando drupal si tienes instalado drupalconsole, con otro script similar que se llama DCG, todo a mano, con plugins de los editores de código… En este ejemplo vamos a generarlo con DCG (Drupal Code Generator)

Descargamos desde este enlace el ejecutable para línea de comandos desde su página en github y lo colocamos en la raíz de nuestro Drupal 8. Es el fichero ‘dcg.phar’ que ves en esa página de descarga.

En esta creación vamos a darle un nombre al módulo, me he inventado uno, porque esto es un “fiestón”, pero tu puedes escoger el que más te guste o estimule ;)

A continuación lanzamos este comando, que nos ayudará a generar el nuevo módulo

php dcg.phar d8:module:standard

Te irá haciendo preguntas, aquí tienes un reflejo del proceso al completo.

$ php dcg.phar d8:module:standard
Module name [Drupal migrate]: Drupal Migrate Party
Module machine name [drupal_migrate_party]:
Module description [The description.]: Test Migration
Package [Custom]:
Dependencies (comma separated): migrate,migrate_plus,migrate_tools,migrate_source_csv,config_devel
Would you like to create install file? [Yes]:
Would you like to create libraries.yml file? [Yes]: No
Would you like to create permissions.yml file? [Yes]: No
Would you like to create event subscriber? [Yes]: No
Would you like to create block plugin? [Yes]: No
Would you like to create a controller? [Yes]: No
Would you like to create settings form? [Yes]: No
The following directories and files have been created or updated:
- drupal_migrate_party/drupal_migrate_party.info.yml
- drupal_migrate_party/drupal_migrate_party.install
- drupal_migrate_party/drupal_migrate_party.module

Las dependencias de otros módulos son a migrate, migrate_plus, migrate_source_csv, migrate_tools y config_devel. Los dos últimos no los utilizaremos aquí, pero serán útiles si avanzas y vas complicando el proceso. Todos los módulos, excepto el primero, puedes descargarlos de la web de drupal.org.

Te ha creado la carpeta “drupal_migrate_party” en la raíz de tu instalación de Drupal. Lo primero es colocar esta carpeta en “modules” o “modules/custom”. Así Drupal 8 la identificará como un módulo y podremos instalarlo.

Estructura módulo de migración a Drupal 8

Para tenerlo todo junto colocamos nuestro fichero CSV (si, el que guardamos antes a buen recaudo) en la carpeta “data” de nuestro módulo.

Fichero CSV para migración a Drupal 8

Por comodidad ten abierto este fichero en tu programa de hoja de cálculo, ya que utilizaremos los nombres de la primera fila para utilizarlos en la migración.

Proceso de migración a Drupal 8

¡Al fin! :)

Y ahora que ya lo tenemos, vamos al fin al crear el proceso de migración. No existe en este momento una forma de crear el proceso visualmente, o al menos yo no lo conozco.

Esto supone una barrera de entrada, porque tenemos que acumular más conceptos. Pero no desesperes, todo lo que aprendas aquí te vendrá muy bien para tus capacitaciones con Drupal 8, dado que son conocimientos que seguro que aprovechas. Ánimo, ¡no hay pérdida!

Vamos a la carpeta config y creamos la carpeta install. Dentro creamos el fichero con un nombre como este:

migrate_plus.migration.drupal_migrate_party.books_review.yml

¿Y por qué tienes un nombre tan largo? Porque soy raro :)

Realmente es porque me gusta describir las cosas de la forma más específica posible para evitar confusiones. Al fichero también lo puedes llamar importar_libros.yml, pero, ya es casi una cuestión de gustos.

Volvamos al tema. En este fichero YML crearemos el perfil de migración sin tener que programar nada. Claro, debemos de ajustarnos a un formato concreto, que es lo que veremos a continuación

Podemos dividir este fichero como en 4 partes:

  1. Configuración
  2. Origen
  3. Destino
  4. Proceso

¿Te suena? Si no es así, lee primero el artículo sobre planificación.

Configuración

Configuracuión perfil migración migrate plus

La configuración es un nombre y un identificador. Podríamos añadir un grupo de migración, pero no nos vamos a complicar más, eso y otras cosas si quieres las vemos en futuros tutoriales, ¿te animas a contarme en qué puedo ayudarte? Usa este formulario.

Ahora ya vamos a esa división que vimos en el anterior tutorial, el origen, proceso y carga. Léelo si no lo hiciste, entenderás mejor todo el proceso.

Origen

El origen bajo el epígrafe “source”. Si te das cuenta en este formato de fichero YAML tiene un orden jerárquico, como si fuera un índice. Los datos aparecen anidados con el sangrado de las líneas a la izquierda.

Es realmente sencillo, solo hay que tener algunas particularidades en cuenta. Por ejemplo si quieres utilizar un carácter especial, unas comillas dobles, rodealo de comillas simples. Y si quieres hacer una lista de elementos, con un guión, como harías en un texto normal.

Como ves en nuestro módulo definimos el plugin de origen “csv” y la ruta del fichero de datos relativa al root o base de drupal a través de “path”. En el vídeo explico con más detalle cada elemento.

Destino y proceso

Destino y proceso de la migración a Drupal 8

Pasamos al destino, esto lo resolvemos en dos líneas que definen que importamos a un tipo de contenido concreto: book_review, el que creamos al comienzo del tutorial. Vamos a crear contenido en forma de nodos.

Por último, como ya te he ido contando, vamos a la chicha, que es el proceso. Aquí es donde le damos la pauta de qué hacer con los datos fuente y convertirlos en campos de Drupal. Un esfuerzo casi titánico, que se va a resolver en muy pocas líneas a pesar de su complejidad y flexibilidad.

En “type” definimos el tipo de contenido donde importamos los contenidos. Es el que creamos antes.

Luego definimos para cada campo relevante de este tipo de contenido “book review” que hacemos con las columnas de origen, una por una.

El “title” es el título de la crítica del libro. Quedamos en utilizar el mismo título del libro, que tenemos en la columna “book”. Bien sencillo este.

Concatenar cadenas de texto

Un caso algo más complejo, el del autor de la crítica. En el CSV de origen teníamos el nombre y los apellidos por separado, pero aquí queremos juntar esa información en el campo con nombre interno “field_author_name”.

Así usaremos unos de los plugins de proceso de migrate de Drupal, el que concatena cadenas de texto. Fíjate en este código del proceso, sabiendo lo que quieres hacer, que sencillo es de definir:

- plugin: concatenar
- source: el origen de los datos de este proceso para este campo. Son los nombres de la tabla de origen para el nombre y los apellidos
- delimiter: el delimitador entre los dos campos de texto. Claro, un espacio aquí es lo más lógico, encerrado entre comillas. Esto es como tener aire, que inflas un globo para contenerlo dentro.

En la descripción meteremos el texto de la revisión y por último el autor interno del contenido será el usuario con el identificador 1, el superadmin de Drupal que se crea cuando instalas drupal.

Lanzar el proceso de migración

Nos queda lo más fácil, ejecutar el proceso de migración.

Usaremos la línea de comandos para este procedimiento. Es el más rápido de todos y, además, en el tiempo de hacer este tutorial, no conozco otro. Un interfaz gráfico para todo esto sería de gran ayuda, en cuanto lo tengamos, monto otro manual.

Drush. El comando para terminal de drupal se llama así, aunque no es el único. ¿No lo has instalado nunca? Aquí te doy instrucciones básicas para instalarlo en el terminal. Ver instrucciones.

También puedes acudir a su documentación oficial.

Si ya tienes instalado drush, verás que esto es coser y cantar. Antes de proseguir recuerda activar el módulo sobre el que estamos trabajando. Bien por la interfaz de drupal o con nuestro primer comando:

drush en drupal_migrate_party -y

Este comando instalará y descargará todos los módulos dependientes del nuestro. Al hacerlo por línea de comandos nos despreocupamos de tener que descargar todos ellos uno por uno.

¿Qué migraciones tenemos disponibles? Con este comando migrate-status (ms), sacamos el listado y el número de elementos involucrados

drush ms

Esto ya tiene mejor pinta, ya escuchamos los últimos acordes de esta primera obertura de la sinfonía de migración.

drush ms para migrar a Drupal 8

Con migrate-import (mi) lanzamos la migración definida. Del comando anterior tenemos el identificador del proceso, que es el que vamos a usar.

drush mi books_reviews

Repetimos un estado de la migración y ¡ya lo tenemos!

Entra en tu instalación de drupal y repasa el contenido, aparecerán casi por arte de magia, los contenidos importados y listos para trabajar con ellos. ¡Bien!

Contenido importado en la migración a Drupal 8

Y a partir de aquí…

Pues has hecho lo más difícil, que es empezar. Cuestiones sobre las que podemos trabajar en próximas guías y que te encontrarás:

  • Importación de ficheros (imágenes, archivos)
  • Importación de otros tipos de campos (numéricos, enlaces, alias de url, listados…)
  • Formatos no compatibles que hay que transformar con procedimientos propios (fechas, por supuesto)
  • Relaciones entre importaciones (artículos, categorías de los artículos y usuarios autores de los artículos)
  • Deshacer la importación (drush mr y algunos trucos más)

Por citar algunos, nos enfrentaremos a más.

Descarga el código del módulo

¿Te ha parecido interesante este tutorial? Espero que sí, que te haya resultado útil, he aprendido mucho preparándolo todo y seguro que podemos entre todos seguir mejorándolo. Si te interesa, sigue leyendo contenidos en danielprimo.io, ¡gracias!

Escrito por:

Imagen de Daniel Primo

Daniel Primo

CEO en pantuflas de Web Reactiva. Programador y formador en tecnologías que cambian el mundo y a las personas. @delineas en twitter y canal @webreactiva en telegram

12 recursos para developers cada domingo en tu bandeja de entrada

Además de una skill práctica bien explicada, trucos para mejorar tu futuro profesional y una pizquita de humor útil para el resto de la semana. Gratis.