Noviembre 18, 2016
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.