Bermigrasi dengan modul migrasi

8

Saya menggunakan Drupal 7 dan modul Migrasi terbaru. Saya mencoba membuat kelas untuk memigrasikan produk dari OpenCart DB ke situs D7 baru saya. Saya menemukan semua SQL yang saya butuhkan dan mendapatkan sebagian besar dari yang diprogram. Tapi saya mengalami sedikit kesulitan memahami bagaimana saya akan melakukan kategori.

Target migrasi saya adalah Ubercart.

Apa yang saya coba pahami duduk di modul migrate_example yang merupakan submodule dari Migrate. Secara khusus saya melihat file wine.inc di kelas WineWineMigration. Saya mencoba memahami istilah migrasi.

Saya memiliki dua daftar yang akan menjadi istilah taksonomi dalam produk-produk Ubercart. Pertama adalah kategorinya. Saya telah menyiapkan kategori secara manual, jadi ketika saya membawa daftar yang berakhir (menggunakan GROUP_CONCAT SQL func), saya akan memiliki banyak ID yang akan saya petakan menggunakan array yang akan menampung semua konversi ID. Itu baik-baik saja, tetapi ketika saya melihat info BestWith mereka bahwa mereka bermigrasi itu menunjukkan bahwa itu menggunakan kelas WineBestWith di atas untuk mengimpor istilah.

Saya bingung dengan ini karena sepertinya semacam migrasi istilah sekunder. Itukah yang terjadi? Lebih lanjut, apakah ini tempat saya akan meletakkan array pemetaan saya, dalam kelas migrasi ini?

Hal berikutnya yang perlu saya lakukan adalah berurusan dengan tag. Di OpenCart kami memiliki banyak tag formulir gratis. Dan ketika saya secara manual membuat produk di Ubercart, saya memiliki bidang autocomplete untuk tag. Di bidang itu saya bisa memasukkan daftar istilah yang dipisahkan koma dan menciptakan beberapa istilah. Bisakah saya melakukan hal yang sama di modul Migrasi? Bisakah saya memetakan bidang ke daftar istilah yang dipisahkan koma? Apakah itu akan menambahkan tag di sana untuk setiap produk?

Patrick
sumber

Jawaban:

14

Saya sedang mengerjakan masalah yang sama sekarang jadi saya mengerti kebingungan Anda. Anda memiliki banyak pertanyaan, tetapi saya pikir mereka dapat diringkas menjadi pertanyaan tunggal:

Bagaimana modul Migrasi menangani migrasi database yang dinormalisasi ke dalam instalasi Drupal?

Ini jelas tidak mudah, tapi inilah pemahaman saya tentang cara kerjanya. Kami akan mulai dari atas (WineWineMigration) turun dan mengajukan pertanyaan saat kami pergi.

Kami memulai dengan melihat kode di bagian atas WineWineMigrationkelas.

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

Ini memberi tahu modul Migrasi bahwa untuk memigrasi konten Wine Anda, migrasi bergantung - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - harus diselesaikan terlebih dahulu.

Jadi yang kami pelajari di sini adalah bahwa migrasi dapat bergantung pada migrasi lain .

Berikutnya kita memiliki pemetaan antara tabel yang saat ini menyimpan info anggur dasar dan simpul Drupal:

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

Ini cukup mudah jadi jika Anda perlu klarifikasi saya akan berikan.

Saya akan melewatkan beberapa hal sementara yang tidak benar-benar berkaitan dengan menghubungkan berbagai kategori dan objek anggur.

Sekarang kita sampai ke pemetaan lapangan. Mengamati:

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

Lihat di mana dikatakan:

->sourceMigration(...)

Ini menunjukkan kepada migrasi bahwa untuk memetakan bidang ini, migrasi lain harus dipenuhi terlebih dahulu. Saya percaya ini adalah "migrasi sekunder" yang Anda bicarakan. Mari kita gunakan regionpemetaan lapangan sebagai contoh di sini. Memecahnya ...

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

Ini mengatakan bahwa wilayah kategori dalam basis data sumber dipetakan ke istilah kosakata wilayah. Seperti komentar TIP menyatakan dalam potongan pemetaan pemetaan bidang, ia mengasumsikan bahwa pemetaan dibuat berdasarkan field_names, tetapi karena kita bergantung pada migrasi sekunder seperti yang Anda katakan, kita perlu menentukan migrasi tempat bergantungnya dan memerintahkannya untuk gunakan tid sebagai ganti nama bidang.

Jadi cukup banyak untuk setiap tabel yang dinormalisasi yang Anda miliki di basis data sumber Anda, Anda akan menentukan migrasi untuk masing-masing, dan kemudian dalam pemetaan bidang yang relevan yang melibatkan tabel itu, Anda akan menentukan migrasi bergantung pada panggilan pemetaan lapangan Anda , serta deklarasi migrasi bergantung pada awal setiap migrasi.

Saya harap ini membantu. Saya sendiri tidak sepenuhnya memahami hal ini sehingga saya menggunakan pertanyaan ini sebagai kesempatan untuk meningkatkan pemahaman saya tentang bagaimana Migrasi menghubungkan basis data. Saat saya belajar sedikit lagi saya akan memperbarui jawaban saya sesuai.

Lester Peabody
sumber
1
Beri tahu saya jika Anda membutuhkan sesuatu yang diklarifikasi. Posnya agak seperti sampah otak, saya sadar ...
Lester Peabody