Migrando com o Módulo de Migração

8

Estou usando o Drupal 7 e o módulo Migrate mais recente. Estou tentando criar uma classe para migrar produtos de um OpenCart DB para o meu novo site D7. Eu descobri todo o SQL de que preciso e coloquei a maior parte do programa. Mas estou tendo um pouco de dificuldade para entender como vou fazer as categorias.

Meu destino de migração é o Ubercart.

O que estou tentando entender está no módulo migrate_example, que é um submódulo de Migrate. Especificamente, estou olhando para o arquivo wine.inc na classe WineWineMigration. Estou tentando entender o termo migração.

Eu tenho duas listas que se tornarão termos de taxonomia nos produtos Ubercart. Primeiro são as categorias. Eu configurei as categorias manualmente, portanto, quando eu trazer a lista delas (usando a função SQL GROUP_CONCAT), terei um monte de IDs que mapeei usando uma matriz que reterá todas as conversões de ID. Tudo bem, mas quando observo as informações do BestWith que eles estão migrando, isso mostra que ele está usando a classe WineBestWith acima para importar o termo.

Estou confuso com isso porque parece algum tipo de migração secundária de termos. É isso que está acontecendo? Além disso, é aqui que eu colocaria minha matriz de mapeamento, neste termo classe de migração?

A próxima coisa que preciso fazer é lidar com tags. No OpenCart, temos várias tags de forma livre. E quando crio manualmente um produto no Ubercart, tenho um campo de preenchimento automático para tags. Nesse campo, basta inserir uma lista de termos separados por vírgula e ele cria vários termos. Posso fazer a mesma coisa no módulo Migrar? Posso apenas mapear o campo para a lista de termos separados por vírgula? Isso adicionará as tags para cada produto?

Patrick
fonte

Respostas:

14

Estou trabalhando no mesmo problema agora, então entendo sua confusão. Você tem muitas perguntas, mas acho que elas podem ser resumidas em uma pergunta singular:

Como o módulo Migrate lida com a migração de um banco de dados normalizado para uma instalação do Drupal?

Definitivamente, não é simples, mas eis o meu entendimento de como funciona. Começaremos do topo (WineWineMigration) descendo e fazendo perguntas à medida que avançamos.

Começamos olhando para o código na parte superior da WineWineMigrationclasse.

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

Isso informa ao módulo Migrate que, para migrar o conteúdo do Wine, as migrações dependentes - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - devem ser concluídas primeiro.

Então, o que aprendemos aqui é que as migrações podem depender de outras migrações .

A seguir, temos o mapeamento entre a tabela que atualmente contém as informações básicas do vinho e o nó Drupal:

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

Isso é bastante direto, portanto, se você precisar de esclarecimentos, eu o fornecerei.

Vou pular algumas coisas provisórias que não são realmente pertinentes para conectar as várias categorias e objetos de vinho.

Agora chegamos aos mapeamentos 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');

Veja onde diz:

->sourceMigration(...)

Isso indica para a migração que, para mapear esse campo, outra migração deve ser satisfeita primeiro. Eu acredito que esta é a "migração secundária" de que você falou. Vamos usar o regionmapeamento de campo como o exemplo aqui. Quebrando tudo ...

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

Isso indica que a região da categoria no banco de dados de origem é mapeada para um termo de vocabulário da região. Como o comentário TIP declara no pedaço de código dos mapeamentos de campo, ele pressupõe que os mapeamentos sejam feitos com base em field_names, mas como dependemos de uma migração secundária, como você diz, precisamos especificar a migração da qual depende e instruí-la a use marés em vez de nomes de campos.

Portanto, para praticamente todas as tabelas normalizadas que você possui no banco de dados de origem, você especificará uma migração para cada uma delas e, nos mapeamentos de campo relevantes que envolvem essas tabelas, especificará migrações dependentes nas chamadas de mapeamento de campo , bem como a declaração de migrações dependentes no início de cada migração.

Eu espero que isso ajude. Eu mesmo não entendo completamente, então usei essa pergunta como uma oportunidade para aprimorar meu entendimento de como o Migrate relaciona bancos de dados. À medida que aprender um pouco mais, atualizarei minha resposta de acordo.

Lester Peabody
fonte
11
Deixe-me saber se você precisar de algo esclarecido. O post é um pouco de um cérebro despejo percebo ...
Lester Peabody