Migrazione con il modulo di migrazione


8

Sto usando Drupal 7 e l'ultimo modulo Migrate. Sto cercando di creare una classe per migrare i prodotti da un DB OpenCart al mio nuovo sito D7. Ho capito tutto l'SQL di cui ho bisogno e ne ho programmato la maggior parte. Ma ho qualche problema a capire come farò le categorie.

Il mio obiettivo di migrazione è Ubercart.

Quello che sto cercando di capire si trova nel modulo migrate_example che è un sottomodulo di Migrate. In particolare sto guardando il file wine.inc alla classe WineWineMigration. Sto cercando di capire il termine migrazione.

Ho due elenchi che diventeranno termini di tassonomia nei prodotti Ubercart. Il primo è le categorie. Ho impostato manualmente le categorie, quindi quando porterò l'elenco di quelle sopra (usando la funzione SQL GROUP_CONCAT) avrò un gruppo di ID che mapperò usando un array che conterrà tutte le conversioni ID. Va bene, ma quando guardo le loro informazioni BestWith che stanno migrando mostra che sta usando la classe WineBestWith sopra per importare il termine.

Sono confuso da questo perché sembra una specie di migrazione secondaria dei termini. È quello che sta succedendo? Inoltre, è qui che metterei il mio array di mappatura, in questo termine classe di migrazione?

La prossima cosa che devo fare è occuparmi dei tag. In OpenCart abbiamo un sacco di tag in formato libero. E quando creo manualmente un prodotto in Ubercart ho un campo di completamento automatico per i tag. In quel campo posso semplicemente inserire un elenco di termini separati da virgole e crea più termini. Posso fare la stessa cosa nel modulo Migrate? Posso semplicemente mappare il campo all'elenco di termini separati da virgola? Questo aggiungerà i tag lì dentro per ogni prodotto?

Risposte:


14

Sto lavorando allo stesso problema in questo momento, quindi capisco la tua confusione. Hai molte domande, ma penso che possano essere riassunte in una domanda singolare:

In che modo il modulo Migrate gestisce la migrazione di un database normalizzato in un'installazione Drupal?

Non è assolutamente semplice, ma ecco la mia comprensione di come funziona. Inizieremo dall'alto (WineWineMigration) scendendo e ponendo domande mentre procediamo.

Iniziamo guardando il codice in cima alla WineWineMigrationclasse.

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

Questo dice al modulo Migrate che per migrare il contenuto di Wine, le migrazioni dipendenti - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - devono prima essere completate.

Quindi quello che abbiamo imparato qui è che le migrazioni possono dipendere da altre migrazioni .

Successivamente abbiamo la mappatura tra la tabella che attualmente contiene le informazioni sul vino di base e il 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()
);

Questo è piuttosto semplice, quindi se hai bisogno di chiarimenti te lo fornirò.

Ho intenzione di saltare alcune cose provvisorie che non sono realmente pertinenti per collegare le varie categorie e oggetti del vino.

Ora arriviamo alle mappature dei campi. Osservare:

// 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');

Vedi dove dice:

->sourceMigration(...)

Ciò indica alla migrazione che per mappare questo campo è necessario prima soddisfare un'altra migrazione. Credo che questa sia la "migrazione secondaria" di cui hai parlato. Usiamo la regionmappatura dei campi come esempio qui. Abbattendo ...

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

Ciò indica che la regione della categoria nel database di origine è associata a un termine del vocabolario della regione. Come afferma il commento SUGGERIMENTO nel blocco del codice delle mappature dei campi, si presume che le mappature siano fatte sulla base di field_names, ma poiché dipendiamo da una migrazione secondaria mentre la metti, dobbiamo specificare la migrazione da cui dipende e istruirla usa le maree invece dei nomi dei campi.

Più o meno per ogni tabella normalizzata che hai nel tuo database di origine, specificherai una migrazione per ognuna, e poi nei relativi mapping dei campi che coinvolgono quelle tabelle, specificherai migrazioni dipendenti nelle tue chiamate di mapping dei campi , nonché la dichiarazione sulle migrazioni dipendenti all'inizio di ogni migrazione.

Spero che questo possa essere d'aiuto. Non lo capisco da solo, quindi ho usato questa domanda come un'opportunità per migliorare la mia comprensione di come Migrate collega i database. Man mano che imparo un po 'di più, aggiornerò la mia risposta di conseguenza.


1
Fammi sapere se hai bisogno di chiarimenti. Il post è un po 'una scarica di cervello, mi rendo conto ...
Lester Peabody,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.