Migracja za pomocą modułu migracji

8

Korzystam z Drupal 7 i najnowszego modułu Migrate. Próbuję utworzyć klasę do migracji produktów z bazy danych OpenCart do mojej nowej witryny D7. Zorientowałem się, ile potrzebuję SQL, i większość tego zaprogramowałem. Mam jednak problem z zrozumieniem, w jaki sposób zamierzam zrobić kategorie.

Mój cel migracji to Ubercart.

To, co próbuję zrozumieć, znajduje się w module migrate_example, który jest submodułem Migrate. W szczególności patrzę na plik wine.inc w klasie WineWineMigration. Próbuję zrozumieć termin migracja.

Mam dwie listy, które staną się warunkami taksonomii w produktach Ubercart. Pierwsza to kategorie. Skonfigurowałem kategorie ręcznie, więc kiedy przyniosę listę tych (używając funkcji GROUP_CONCAT SQL), będę miał kilka identyfikatorów, które zamapuję za pomocą tablicy, która będzie przechowywać wszystkie konwersje ID. To dobrze, ale kiedy patrzę na ich informacje BestWith, że migrują, pokazuje, że używa klasy WineBestWith powyżej do importowania tego terminu.

Jestem tym zaskoczony, ponieważ wygląda to na jakąś wtórną migrację terminów. Czy tak się dzieje? Ponadto, czy w tym miejscu umieściłbym moją tablicę odwzorowań w tym terminie klasa migracji?

Następną rzeczą, którą muszę zrobić, to zająć się tagami. W OpenCart mamy kilka darmowych tagów. A kiedy ręcznie tworzę produkt w Ubercart, mam pole autouzupełniania dla tagów. W tym polu mogę po prostu umieścić listę terminów oddzieloną przecinkami, co spowoduje utworzenie wielu haseł. Czy mogę zrobić to samo w module Migrate? Czy mogę po prostu odwzorować pole na listę terminów oddzielonych przecinkami? Czy doda to tagi dla każdego produktu?

Patrick
źródło

Odpowiedzi:

14

Pracuję teraz nad tym samym problemem, więc rozumiem twoje zamieszanie. Masz wiele pytań, ale myślę, że można je podsumować w jednym pytaniu:

Jak moduł Migrate obsługuje migrację znormalizowanej bazy danych do instalacji Drupal?

Zdecydowanie nie jest to proste, ale rozumiem, jak to działa. Zaczniemy od góry (WineWineMigration), idąc w dół i zadając pytania.

Zaczynamy od spojrzenia na kod na szczycie WineWineMigrationklasy.

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

Mówi to modułowi Migrate, że aby przeprowadzić migrację zawartości Wine, migracje zależne - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - muszą zostać zakończone w pierwszej kolejności.

Nauczyliśmy się tutaj, że migracje mogą zależeć od innych migracji .

Następnie mamy mapowanie między tabelą, która obecnie zawiera podstawowe informacje o winie, a węzłem Drupal:

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

Jest to dość proste, więc jeśli potrzebujesz wyjaśnienia, udzielę go.

Pominę kilka tymczasowych rzeczy, które tak naprawdę nie są odpowiednie do łączenia różnych kategorii i przedmiotów do wina.

Teraz przechodzimy do mapowań pól. Przestrzegać:

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

Zobacz, gdzie jest napisane:

->sourceMigration(...)

Wskazuje to migracji, że aby zmapować to pole, najpierw należy spełnić inną migrację. Wierzę, że jest to „migracja wtórna”, o której mówiłeś. Użyjmy regionmapowania pól jako przykładu tutaj. Rozbijam to ...

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

Oznacza to, że region kategorii w źródłowej bazie danych jest odwzorowany na termin regionu. Jak stwierdza TIP w części kodu odwzorowań pól, zakłada się, że odwzorowania są tworzone na podstawie nazw_pola, ale ponieważ, jak to ująłeś, jesteśmy zależni od migracji wtórnej, musimy określić migrację, od której zależy, i poinstruować ją używaj pływów zamiast nazw pól.

Tak więc prawie dla każdej znormalizowanej tabeli, którą masz w źródłowej bazie danych, będziesz określał migrację dla każdej, a następnie w odpowiednich odwzorowaniach pól obejmujących te tabele, będziesz określał migracje zależne w wywołaniach odwzorowywania pól , a także deklarację migracji zależnych na początku każdej migracji.

Mam nadzieję, że to pomoże. Sam tego nie rozumiem w pełni, więc skorzystałem z tego pytania, aby lepiej zrozumieć, w jaki sposób Migrate wiąże bazy danych. Gdy nauczę się nieco więcej, odpowiednio zaktualizuję swoją odpowiedź.

Lester Peabody
źródło
1
Daj mi znać, jeśli potrzebujesz czegoś wyjaśnionego. Uświadomiłem sobie, że ten post jest trochę zrzutu mózgu ...
Lester Peabody