Qué son los Process plugins en Drupal 8

Author Top
langelhc

En la entrada Qué son y cómo funcionan los plugins de migración describimos algunos puntos a tomar en cuenta para entender los plugins de migración, hablamos del archivo YAML que contiene la configuración de una migración, entre ellas la clave 'process' (linea 8) describe propiedad por propiedad, como el contenido destino se va a construir a partir de los datos del origen.

En el siguiente script vemos parte del archivo d7_node.yml en la clave process, define que propiedades se usaran para construir el nodo en D8, el nid, vid, title y otros:

id: d7_node
label: Nodes
migration_tags:
  - Drupal 7
deriver: Drupal\node\Plugin\migrate\D7NodeDeriver
source:
  plugin: d7_node
process:
  nid: nid
  vid: vid
  langcode:
    plugin: default_value
    source: language
    default_value: "und"
  title: title
  uid: node_uid
  status: status
  created: created
  changed: changed
  promote: promote
  sticky: sticky

Ruta del archivo: core/modules/node/migration_templates/d7_node.yml


En esta entrada hablaremos de los Process plugins: Get y Static map y plantearemos un caso práctico para este último.

Process Plugin Get:

Es usado para copiar un valor de una propiedad origen (source), en este ejemplo copia el valor de foo a la propiedad destino bar:

process:
  bar:
    plugin: get
    source: foo

Get es el Process plugins por defecto, de modo que puede ser usado así:

process:
  bar: foo

Process Plugin Static Map:

Este process plugin permite buscar un valor basado en un mapeo que se especa en la configuración, por ejemplo:

process:
  bar:
    plugin: static_map
    source: foo
    map:
      from: to
      this: that

Si el valor de foo era from, el valor de la propiedad destino bar será to; lo mismo pasa cuando el valor es this para foo, el valor final que se le asigna a la propiedad bar será that.

Caso práctico:

En D7 tenemos el tipo de contenido page que tiene un campo de tipo taxonomía con los siguientes términos:

- Event (Id término: 1)

- Update (Id término: 2)

- News (Id término: 3)

El requerimiento es que dependiendo del término que se tenga seleccionado en el campo taxonomía se debe migrar ese contenido a un tipo de contenido (event, update, news) en D8.

Para esto en el archivo yml definiremos lo siguiente:

Migration template:

process:
  nid: nid
  vid: vid
  type:
    plugin: static_map
    source: taxonomy_term_id
    map:
      1: event
      2: update
      3: news
  title: title
  uid: node_uid
  status: status

En la línea 4, la propiedad type es el tipo de "content type" al cual se migrará el contenido.

Plugin de migración:

La función query quedaria de la siguiente manera:

const JOIN = 'n.vid = nr.vid';
  public function query() {
  // Select node in its last revision.
  $query = $this->select('node_revision', 'nr')
    ->fields('n', array(
      'nid',
      'type',
      'language',
      'status',
      'created',
      'changed',
      'comment',
      'promote',
      'sticky',
      'tnid',
      'translate',
    ))
    ->fields('nr', array(
      'vid',
      'title',
      'log',
      'timestamp',
    ));
    $query->orderBy('n.nid', 'DESC');
    $query->addField('n', 'uid', 'node_uid');
    $query->addField('nr', 'uid', 'revision_uid');
    $query->addField('fnt', 'field_news_type_tid', 'taxonomy_term_id');
    $query->innerJoin('node', 'n', static::JOIN);
    $query->innerJoin('field_data_field_news_type', 'fnt', 'fnt.entity_id = n.nid');
    $query->condition('n.type', 'page');
    // $inTheNews_tid = 161;
    return $query;
  }

En la consulta SQL obtenemos el id del término del campo tipo taxonomía para que pueda ser evaluado con el process plugin Static Map.

Y asi al ejecutar la migración los nodos tipo page, con el termino event (tid: 1) son migrados al tipo de contenido Event en D8, lo mismo para los demás términos.

Para ver otros process plugins pueden ver la documentación en éste enlace.

Happy coding.