Migrar con el módulo de migración

8

Estoy usando Drupal 7 y el último módulo Migrate. Estoy tratando de crear una clase para migrar productos de una base de datos OpenCart a mi nuevo sitio D7. Descubrí todo el SQL que necesito y programé la mayor parte de eso. Pero tengo algunos problemas para entender cómo voy a hacer las categorías.

Mi objetivo de migración es Ubercart.

Lo que estoy tratando de entender se encuentra en el módulo migrate_example, que es un submódulo de Migrate. Específicamente, estoy mirando el archivo wine.inc en la clase WineWineMigration. Estoy tratando de entender el término migración.

Tengo dos listas que se convertirán en términos de taxonomía en los productos Ubercart. Primero están las categorías. He configurado las categorías manualmente, por lo que cuando llevo la lista de ellas (usando la función GROUP_CONCAT SQL) tendré un grupo de ID que asignaré usando una matriz que contendrá todas las conversiones de ID. Eso está bien, pero cuando miro su información de BestWith que están migrando, muestra que está usando la clase WineBestWith anterior para importar el término.

Esto me confunde porque parece una especie de migración secundaria de términos. ¿Es éso lo que está pasando? Además, ¿es aquí donde pondría mi matriz de mapeo, en este término clase de migración?

Lo siguiente que debo hacer es lidiar con las etiquetas. En OpenCart tenemos un montón de etiquetas de forma libre. Y cuando creo manualmente un producto en Ubercart, tengo un campo de autocompletar para etiquetas. En ese campo, solo puedo poner una lista de términos separados por comas y se crean varios términos. ¿Puedo hacer lo mismo en el módulo Migrate? ¿Puedo asignar el campo a la lista de términos separados por comas? ¿Eso agregará las etiquetas allí para cada producto?

Patricio
fuente

Respuestas:

14

Estoy trabajando en el mismo problema ahora, así que entiendo tu confusión. Tienes muchas preguntas, pero creo que se pueden resumir en una pregunta singular:

¿Cómo maneja el módulo Migrate la migración de una base de datos normalizada a una instalación de Drupal?

Definitivamente no es sencillo, pero aquí está mi comprensión de cómo funciona. Comenzaremos desde arriba (WineWineMigration) bajando y haremos preguntas a medida que avanzamos.

Comenzamos mirando el código en la parte superior de la WineWineMigrationclase.

...
$this->dependencies = array('WineVariety', 'WineRegion',
  'WineBestWith', 'WineUser', 'WineProducer');
...

Esto le dice al módulo Migrate que para migrar su contenido de Wine, las migraciones dependientes - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - deben completarse primero.

Entonces, lo que hemos aprendido aquí es que las migraciones pueden depender de otras migraciones .

A continuación tenemos el mapeo entre la tabla que actualmente contiene la información del vino base y el nodo Drupal:

$this->map = new MigrateSQLMap($this->machineName,
  array(
    'wineid' => array(
      'type' => 'int',
      'unsigned' => TRUE,
      'not null' => TRUE,
      'description' => 'Wine ID',
      'alias' => 'w',
    )
  ),
  MigrateDestinationNode::getKeySchema()
);

Esto es bastante sencillo, por lo que si necesita una aclaración, se la proporcionaré.

Voy a omitir algunas cosas provisionales que no son realmente pertinentes para conectar las diferentes categorías y objetos de vino.

Ahora llegamos a las asignaciones de campo. Observar:

// Mapped fields
$this->addFieldMapping('title', 'name')
     ->description(t('Mapping wine name in source to node title'));
$this->addFieldMapping('uid', 'accountid')
     ->sourceMigration('WineUser')
     ->defaultValue(1);
// TIP: By default, term relationship are assumed to be passed by name.
// In this case, the source values are IDs, so we specify the relevant
// migration (so the tid can be looked up in the map), and tell the term
// field handler that it is receiving tids instead of names
$this->addFieldMapping('migrate_example_wine_varieties', 'variety')
     ->sourceMigration('WineVariety')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_best_with', 'best_with')
     ->separator(',')
     ->sourceMigration('WineBestWith')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('field_migrate_example_wine_ratin', 'rating');
$this->addFieldMapping('field_migrate_example_top_vintag', 'best_vintages');

Mira donde dice:

->sourceMigration(...)

Esto indica a la migración que para mapear este campo, otra migración debe ser satisfecha primero. Creo que esta es la "migración secundaria" de la que hablaste. Usemos el regionmapeo de campo como el ejemplo aquí. Desglosándolo ...

$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));

Esto dice que la región de categoría en la base de datos de origen se asigna a un término de vocabulario de región. Como el comentario TIP indica en el fragmento de código de asignaciones de campo, se supone que las asignaciones se realizan en base a los nombres de campo, pero como dependemos de una migración secundaria como la pones, necesitamos especificar la migración de la que depende e indicarle use tids en lugar de nombres de campo.

Entonces, para cada tabla normalizada que tenga en su base de datos de origen, va a especificar una migración para cada una, y luego, en las asignaciones de campo relevantes que involucran esas tablas, especificará migraciones dependientes en sus llamadas de asignación de campo , así como la declaración de migraciones dependientes al comienzo de cada migración.

Espero que esto ayude. No lo entiendo completamente, así que utilicé esta pregunta como una oportunidad para mejorar mi comprensión de cómo Migrate relaciona las bases de datos. A medida que aprenda un poco más, actualizaré mi respuesta en consecuencia.

Lester Peabody
fuente
1
Avísame si necesitas algo aclarado. La publicación es un poco basura mental, me doy cuenta ...
Lester Peabody