Migración de ficheros a entidades media

17/03/2022
Migración de ficheros a entidades media

Es bastante habitual que en los desarrollos de drupal nos tengamos que enfrentar a una migración de ficheros a entidades media para la reutilización de estos. Como primera solución podemos abordar esta migración mediante el módulo migrate de Drupal, en la cual es necesaria la implementación de la lógica para conseguirla. Pero ¿por qué hacer un trabajo desde cero si ya existe el módulo contribuido Migrate File Entities to Media Entities el cual nos simplifica bastante dicha implementación?.

En este post veremos cómo llevar a cabo una migración de ficheros a entidades media utilizando el módulo Migrate File Entities to Media Entities.

Características principales del módulo:

  • Detección de archivos duplicados.
  • Migración de las traducciones de los ficheros.
  • Utilización de comandos drush para la gestión de la migración.

Pasos para realizar una migración:

Instalación del módulo

Es necesario la instalación del módulo Migrate File Entities to Media Entities. Para ello en la consola ejecutaremos el comando:

composer require drupal/migrate_file_to_media

Y una vez que composer haya descargado el módulo con sus dependencias, habilitaremos el módulo en nuestro sistema drupal.

drush en migrate_file_to_media

Creación de campos media de destino.

En todas las migraciones de datos siempre existe un origen y un destino. Para el caso de este módulo, el origen es el campo del tipo fichero que será la referencia en la migración y el destino el campo media que hay que crear para que sea migrado.

Este módulo ya nos provee un comando drush “migrate:file-media-fields” para la creación de estos campos, es decir, no es necesario crearlos en drupal manualmente. Para ello ejecutamos el siguiente comando:

drush migrate:file-media-fields <entity_type> <bundle> <source_field_type> <target_media_bundle>
  • <entity_type>: Tipo de entidad, puede ser nodo, párrafos o cualquier otros tipos de paquetes.
  • <bundle>: Tipo de paquete o nombre máquina de la entidad.
  • <source_field_type>: Tipo de campo de origen a migrar (image, file, etc).
  • <target_media_bundle>: Tipo de paquete de entidades media del campo de destino (image, video, file o audio).

Dicho comando nos reconoce automáticamente los campos existentes (source_field_type) dentro de un tipo de contenido y crea su campo media de destino en este.  El nombre del campo de destino será igual que el de origen con el sufijo _media.

Ejemplo:

Si necesitamos migrar un campo imagen a una entidad media del tipo imagen en el tipo de contenido article:

drush migrate:file-media-fields node article image image

El resultado de ese comando será la creación de un nuevo campo en el tipo de contenido article.

Creación de un módulo personalizado.

Para la realización de la migración se necesita crear un módulo personalizado que contenga como dependencias el módulo migrate_file_to_media. Una vez creado podemos empezar a crear los ymls de configuración para las migraciones a realizar.

Creación de los ymls de configuración.

Para la creación de un yml de configuración existen dos opciones:

Comando drush:

Desde la consola ejecutamos lo siguiente:

drush generate yml-migrate_file_to_media_migration_media

Al ejecutar dicho comandos se nos solicitará una serie de variables de entrada para la creación de los ymls dentro de nuestro módulo:

Module machine name:
 ➤ basic_migration_example

 Module name:
 ➤ Basic Migration Example 101

 Plugin label [Example]:
 ➤ article_media_basic_migration

 Plugin ID [example]:
 ➤ article_media_basic_migration

 Migration Group [media]:
 ➤ ( Press Enter Button to use suggested "media" )

 Entity Type [node]:
 ➤ ( Press Enter Button to use suggested "node")

 Source Bundle:
 ➤ article

 Source Field Names (comma separated) [field_image]:
 ➤ ( Press Enter Button to use suggested "field_image" )

 Target Media Type [image]:
 ➤ ( Press Enter Button to use suggested "image" )

 Target Field [field_media_image]:
 ➤ ( Press Enter Button to use suggested "field_media_image" )

 Language Code [en]:
 ➤ ( Press Enter Button to use suggested "en" )

 Translation languages (comma separated) [none]:
 ➤ ( Press Enter Button "none" )

Una vez que hayamos rellenado dichas variables creará dentro de nuestro módulo los ymls de configuración que necesitamos para la migración.

Creación los ymls manualmente:

Dentro del módulo Migrate File Entities to Media Entities podemos encontrar un submódulo llamado Migrate File To Media Example el cual dentro del directorio config/install contiene ejemplos de ymls para la realización de las migraciones. Estos ficheros son:

  • migrate_plus.migration.migrate_file_to_media_example_article_images_step1.yml: El cuál crea una entidad multimedia única en base a las referencias de los campos en la entrada de configuración “field_names” del source plugin. Esta será la migración de las que dependen las posteriores.
  • migrate_plus.migration.migrate_file_to_media_example_article_images_step1_de.yml
    Si necesitamos migrar las traducciones de los files, es necesario crear un archivo yml como este. En el cual también se añade la lista de campos a migrar (field_names) y se utiliza el yml anterior como dependencia para que sea una traducción.
  • migrate_plus.migration.migrate_file_to_media_example_article_images_step2.yml
    Este yml es el encargado de recuperar de un tipo de contenido los ficheros de origen a migrar y mapearlos a su destino.

Notas: Cuando se necesitan realizar migraciones con traducciones, es necesario añadir en el yml del step2 el atributo “include_translations: true” dentro del source plugin.

Ejecutando las migraciones:

Estado de las migraciones.

Con el siguiente comando podemos ver el estado de las migraciones:

drush migrate:status

Si necesitas más información acerca de estos comandos puedes consultar el siguiente enlace Migración de contenidos - Administrando migraciones (Migrate tools)

Preparar la detección de archivos duplicados.

Para detectar los archivos duplicados, simplemente basta con ejecutar el siguiente comando, que calcula el hash binario para todos los archivos dentro de la tabla migrate_file_to_media_mapping.

drush migrate:duplicate-file-detection <migration_name>

En caso de que en nuestro proyecto ya tengamos archivos de medias creados o que hayamos implementado varias migraciones, será necesario detectar las entidades multimedia duplicadas.

Para ello habría que ejecutar el comando:

drush migrate:duplicate-media-detection image --all

Lanzando la migración.

Con el siguiente comando lanzaremos la importación de una migración por el grupo referenciado:

drush migrate:import --group=media

Si necesitas más información acerca de estos comandos puedes consultar el siguiente enlace Migración de contenidos - Administrando migraciones (Migrate tools).

Conclusiones.

Una tarea que es bastante habitual, como la migración de ficheros a entidades de media, el módulo Migrate File Entities to Media Entities nos simplifica bastante la implementación de la migración.