En esta ocasión, te voy a mostrar cómo migrar un archivo CSV que contiene nuestra foto como un ejemplo, y cómo lo hago utilizando el módulo Migrate Source CSV.
El módulo Migrate Source CSV nos ofrece un plugin llamado "csv" para utilizar archivos .csv como origen de datos.
Como el nombre de este blog dice, les mostraré como hacer una migración de csv que contenga archivos como por ejemplo la foto de nuestro perfil.
Para nuestra migración tenemos un archivo .csv con cualquier tipo de datos que tengamos que migrar de acuerdo a la necesidad que tengamos:
Drupal nos provee una gran gama de tipos de campos, tales como integer, date, image, file, string o email son proveídos por el CORE de drupal pero también existen tipos de campos como el que provee cuando instalamos el módulo contribuido media entity o paragraphs que crean sus propios campos de tipo referencia a entidad.
Necesitamos los siguientes módulos para nuestra migración:
- Migrate que ya es proveído por el core de drupal,
- Migrate Source CSV
- Migrate Plus
- Migrate Tools estos últimos son módulos contribuidos.
y tener drush o drupal console instalado.
Primeramente debemos crear el tipo de contenido que recibirá nuestra migración de datos con los campos que necesitamos y los tipos adecuados a la información que se provee en el archivo .csv
Content type: Profile
Fields:
First name | Text(Plain) |
Last name | Text(Plain) |
Birthday | Date |
Photo | Image |
Language | Taxonomy term |
Luego creamos el módulo personalizado: custom_migrate y en el archivo custom_migrate.info.yml agregamos :
name: My first migration
description: With this module I make a migration's csv file.
type: module
core: 8.x
package: Migration
dependencies:
- migrate
- migrate_plus
- migrate_source_csv
- migrate_tools
- node
Luego creamos una carpeta config/install y dentro agregamos nuestra plantilla de migración llamada: migrate_plus.migration.profile.yml
dependencies:
module:
- migrate_source_csv
id: profile
migration_tags:
- CSV
migration_group: null
label: Profile
source:
plugin: csv
path: modules/custom/custom_migrate/assets/csv/profile.csv
header_row_count: 1
keys:
- id
column_names:
-
id: ID
-
first_name: 'First Name'
-
last_name: 'Last Name'
-
birthday: Birthday
-
email: Email
-
photo: Photo
-
languages: Language
process:
type:
plugin: default_value
default_value: profile
title:
plugin: concat
source:
- first_name
- last_name
delimiter: ' '
field_first_name: first_name
field_last_name: last_name
field_birthday: birthday
field_email: email
field_language:
plugin: entity_generate
source: languages
field_photo:
-
plugin: explode
source: photo
delimiter: ;
-
plugin: callback
callable: trim
-
plugin: callback
callable: strtoupper
-
plugin: migration
migration: photo
no_stub: true
destination:
plugin: 'entity:node'
migration_dependencies:
optional:
- photo
Tenemos Id de la migración: debe ser único, migration_tags: una etiqueta para filtrar las migraciones, migration_group: grupo de la migración.
Source: En source especificamos el plugin de dónde la migración debe tomar los datos.
Process: Aquí es donde construye el destino a partir de los datos de origen.
Destination: Es el destino que tendrán los datos luego de procesarlos.
Podemos consultar con la documetación de la api de migración
A como vemos en nuestra plantilla de profile el campo field_photo necesita una migración de archivos de tipo imagen y para esto necesitamos la siguiente plantilla:
Archivo llamado: migrate_plus.migration.photo.yml
dependencies:
module:
- file
id: photo
migration_tags:
- CSV
migration_group: null
label: Photos
source:
constants:
source_base_path: modules/custom/custom_migrate/assets/photos
uri_file: 'public://photos'
plugin: csv
track_changes: true
path: modules/custom/custom_migrate/assets/csv/profile.csv
header_row_count: 1
keys:
- name
column_names:
5:
name: Photo
process:
source_full_path:
-
plugin: concat
delimiter: /
source:
- constants/source_base_path
- name
-
plugin: urlencode
uri_file:
-
plugin: concat
delimiter: /
source:
- constants/uri_file
- name
-
plugin: urlencode
filename: name
uri:
plugin: file_copy
source:
- '@source_full_path'
- '@uri_file'
destination:
plugin: 'entity:file'
migration_dependencies:
required: { }
optional: { }
Declaramos 2 constantes en el source con la ruta de origen y destino de nuestras fotos( Si tenemos nuestras fotos por ejemplo en public://photos debemos indicar de esta forma en el path de la variable constante).
Posteriormente habilitamos el módulo junto a los módulos contrib y se crearán nuestras configuraciones
y hacemos un drush cex para agregarlas a la carpeta de nuestras configuraciones.
De esta forma tendremos migrado un perfil básico para una persona con su foto.
Para ver el estado de nuestras migraciones usamos drush:
drush ms
Para importar una migración usamos drush mi y para borrar hacer drush mr
También podemos usar drupal console con facilidad si hacemos alguna modificación en nuestro archivo.
drupal config:import:single [arguments]
¿Está buscando ayuda para una migración o actualización de Drupal? Independientemente de la complejidad del sitio o de los datos, MTech puede ayudarle a pasar de un CMS privado o actualizarlo a la última versión: Drupal 8.
Escríbanos sobre su proyecto y nos pondremos en contacto con usted dentro de 48 horas.