¿Cómo hacer una migración de csv file con imágenes?

Publicado por Ada Hernández el 25 de Octubre de 2016

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:

filecsv

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:

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
Email Email
Photo Image
Language Taxonomy term

Luego creamos el módulo personalizadocustom_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.