Migrasikan: Apa perbedaan antara prep () dan prepow ()?

8

Menggunakan modul Migrasi: Saya mengerti bahwa prepRow () menjalankan filter pada baris dan harus mengembalikan TRUE atau FALSE berdasarkan beberapa kondisi, yang memungkinkan baris dimigrasi atau tidak, tetapi dapatkah seseorang mengklarifikasi:

  • kapan harus menggunakan persiapan ()
  • kapan harus menggunakan prepow ()
  • mengapa Anda tidak akan menambahkan filter dalam kueri sql awal untuk memfilter hasil baris yang mungkin Anda hapus / sertakan di salah satu di atas

Terima kasih!

pengguna4984
sumber
1
Salah satu alasan untuk tidak memfilter kueri sql adalah menambahkan pemetaan untuk baris yang Anda putuskan untuk lewati. Misalnya saya mengimpor pengguna ke situs yang ada. Saya ingin melewati pengguna yang sudah ada di tujuan, dan saya ingin menambahkan pemetaan seolah-olah pengguna benar-benar diimpor , jadi migrasi lain tergantung pada ini bekerja dengan baik.
jonhattan

Jawaban:

9

Ini semua dibahas secara mendalam dalam dokumentasi kelas Migrasi yang disediakan oleh proyek. Khususnya di halaman Metode Migrasi yang Diimplementasikan Secara Umum yang mengatakan hal berikut dan mencakup implementasi fungsi contoh sederhana selanjutnya. Dari dokumen ...

function prep_row ($ row)

Metode preprow () dipanggil oleh metode source next (), setelah memuat baris data. Argumen $ row adalah objek stdClass yang berisi data mentah yang disediakan oleh sumber. Ada dua alasan utama untuk menerapkan prepowow ():

  1. Untuk memodifikasi baris data sebelum melewati metode dan penangan lebih lanjut: misalnya, mengambil data terkait, membagi bidang sumber, menggabungkan atau membuat bidang sumber baru berdasarkan beberapa logika.
  2. Untuk melewati suatu baris secara kondisional (dengan mengembalikan SALAH).

fungsi persiapan ($ entitas, stdClass $ row)

Metode persiapan kelas Migrasi dipanggil oleh metode persiapan kelas () tujuan, setelah memanggil semua metode persiapan tingkat () lapangan dan segera sebelum objek tujuan disimpan. Argumen $ entitas adalah objek tujuan yang diisi oleh pemetaan bidang awal dan dimanipulasi oleh metode tingkat lapangan; argumen $ row adalah objek yang berisi data setelah prepRow () dan semua panggilan balik telah diterapkan. Metode prep () adalah kesempatan terakhir untuk memanipulasi objek tujuan sebelum disimpan ke database Drupal. Penting untuk diingat bahwa, karena dipanggil setelah penangan lapangan, bidang akan dalam bentuk yang diperluas sepenuhnya (yaitu, dalam Drupal 7 nilai bidang teks akan berada di $entity->field_textual_data['und'][0]['value']daripada hanya sederhana $entity->field_textual_data).

The Migrasi modul kerangka yang memungkinkan Anda untuk merangkum proses migrasi dari sepotong sumber data ke lokasi tujuan dan konfigurasi. Migrasi terdiri dari:

  • tentukan di mana data berada
  • menentukan ke mana data harus pergi
  • ambil sepotong data (baris)
  • membersihkan data
  • mulai memindahkan data (katakanlah ke Entitas)
  • sebenarnya memindahkan data
  • setelah memindahkan data, lakukan tindakan tambahan

API menyediakan kait untuk memengaruhi data yang dipindahkan dalam siklus kehidupan migrasi ini. Dengan mengecualikan data dari migrasi melalui permintaan awal Anda, Anda membatasi berapa banyak kontrol yang Anda miliki atas total data yang dapat Anda pindahkan. Untuk sub-migrasi Anda mungkin menemukan ini berguna. Tetapi dalam migrasi konten umum Anda ingin migrasi Anda mencakup semua hal yang mungkin.

Tenken
sumber
Terima kasih, apa yang saya cari. Hargai juga pemikiran untuk menghapus elemen dari permintaan awal.
user4984
6

Jika Anda dapat memilih baris yang tepat dengan menuliskannya dalam query, namun preprareRow () dapat digunakan dalam sistem yang lebih kompleks di mana beberapa parameter mungkin diperlukan sebelum baris dimigrasi. Dalam kasus seperti itu lebih mudah untuk menjalankan semua baris dan melakukan logika pada basis per-baris.

prepar () dijalankan setelah preparow () dan merupakan kesempatan terakhir Anda untuk mengubah entitas sebelum disimpan ke database.

Beberapa informasi lebih lanjut tentang ini dapat ditemukan di sini: https://www.drupal.org/node/1132582

Neograph734
sumber
Saya menemukan ini ringkas dan dapat dimengerti
Johnathan Elmore
3

Ini adalah bagian jawaban dan sama sekali tidak lengkap. Saya juga ingin mengetahui lebih banyak tentang keduanya. Jadi ini mungkin menjadi bagian dari diskusi; walaupun saya telah menulis sebagai jawaban daripada komentar karena cuplikan kode berikut dan contoh bagaimana saya menggunakan kelas di atas.

Biarkan saya mengilustrasikan beberapa kegunaan saya prepowow () sebagai - yang tidak seperti yang dikatakan.

Baru-baru ini saya memberikan beberapa data untuk diimpor dari database non drupal. Entitas yang saya tambahkan memerlukan bidang yang harus dimasukkan yang tidak saya miliki dalam impor data saya.

Jadi sebelum kelas sumber saya dibuat, saya bisa menambahkan

  $source_fields = array(
    'changed' => t('Timestamp of when the change was made.'),
    'created' => t('Timestamp of when the node was Created.'),
 );

dan kemudian dalam fungsi prepRow saya bisa melakukan hal berikut

$nowtimestamp = mktime(date('Y-m-d'));
$row->changed = $nowtimestamp;
$row->created = $nowtimestamp;

Anda juga dapat menjalankan pernyataan php if / else di sini jika perlu.

Saya juga menggunakan fungsi persiapan dalam kode saya dan saya menggunakannya untuk memberikan nilai pada entitas.

$account->field_job_location [und][0]['tid'] = $row->job_location_tid;

Saya hanya harus menggunakan ini dalam skenario ini karena saya membuat plugin simpul kustom saya sendiri.

Juga jika Anda perlu membuat perhitungan tentang itu maka Anda dapat melakukannya di prepowow yang berjalan sebelum prepow ()

Misalnya dalam impor, saya memiliki nilai berlabel 'Kota' - dan dapat mengubahnya menjadi Term Term.

 if ($TownCity == 'London' ){
            $row->job_location_tid = '10';
      } else {
        $row->job_location_tid = '11';
      } 

Saya harap ini membantu.

Deejay
sumber