Pindahkan Konten Multi-Bahasa dengan Modul Migrasi

12

Saya punya satu tabel MySQL dengan konten Inggris / Perancis campuran di setiap baris. Saya mencoba mencari cara memigrasi ini ke situs Drupal yang dikonfigurasi i18n yang tepat.

Saya dapat meminta Migrasikan untuk mengimpor konten ke dalam satu bahasa, tetapi saya ingin migrasi ke kedua bahasa. Ada 901 baris, sehingga pada akhirnya harus membuat 1802 node yang terhubung.

Saya hanya tidak tahu bagaimana mengatur modul Migrasi untuk mengulang dua kali & menautkan node.

EDIT: Saya menggunakan ini dan dapat menggabungkan keduanya:

public function postImport() {
parent::postImport();

// $ii should really be determined by $count_query
$ii = 2000;
for ($i = 1; $i < $ii; $i++) {
  // Confirm SQL in phpMyAdmin to verify
  $query = "SELECT n.nid, tid.field_bv_transfer_id_value
    FROM {field_revision_field_bv_transfer_id} tid
    INNER JOIN node n ON tid.entity_id = n.nid
    WHERE tid.field_bv_transfer_id_value = $i;";
  $result = db_query($query);

  // Reset for each import
  $currentRowCount = $current_translateid = 0;
  foreach ($result as $record) {
    if ($currentRowCount % 2 == 0) {
      $node = node_load($record->nid);
      $node->pathauto_perform_alias = FALSE;
      $node->tnid = $record->nid;
      $current_translateid = $record->nid;
      node_save($node);
    } else {
      $node = node_load($record->nid);
      $node->pathauto_perform_alias = FALSE;
      $node->tnid = $current_translateid;
      node_save($node);
    }
    $currentRowCount++;
  }
}

}

Mike Gifford
sumber
1
Saya tidak berpikir Anda harus menggunakan postImport untuk menambahkan nids terjemahan Anda, yang akan mengacaukan pemetaan migrasi (yaitu Anda tidak akan dapat mengembalikannya). Melakukannya sebagai dua skrip migrasi terpisah dalam grup yang sama akan menjadi cara yang tepat untuk melakukannya, dan menggunakan metode 'sourceMigration' memungkinkan Anda untuk menambahkan tnid ke migrasi kedua untuk menyelesaikan pertanyaan tentang menghubungkan terjemahan bersama.
Alan Dixon

Jawaban:

2

Anda dapat membuat dua migrasi, keduanya dengan pemetaan yang sama (kecuali untuk nids), tetapi satu menyimpan node dalam bahasa Inggris dan yang kedua dalam bahasa Prancis.

acouch
sumber
1
Benar, tetapi bagaimana cara menautkan keduanya? Saya punya beberapa kode kasar di sini, tapi saya tahu itu mungkin dilakukan sekaligus. pastebin.com/ap1P5DGY Saya pikir dokumen di sini kehilangan sesuatu untuk saya - drupal.org/node/1132582 - di prepRow () apa yang dikembalikan? Tautan dapat dilakukan dengan postImport ().
Mike Gifford
Saya harus melakukan beberapa migrasi besok, jadi saya akan memeriksanya. Saya pikir Anda perlu melihat pemetaan antara dua migrasi yang memiliki catatan nids yang telah diimpor dan id konten asli.
acouch
1

Di prepowow () Anda mengembalikan benar atau salah. Ini menentukan apakah baris itu diproses dalam migrasi tertentu (dan bahkan dihitung).

Dengan cara ini, Anda dapat mendeteksi bahasa untuk setiap baris, dan hanya mengembalikan TRUE untuk baris yang berisi konten dalam bahasa tertentu untuk migrasi itu.

sehingga Anda dapat melakukan sesuatu seperti:

public function prepareRow($row){
  $return = FALSE
  if ($row->lang == "fr"){
   $return = TRUE;
  }
  // Only rows with a source 'lang' value of 'fr' are processed
  return $return;
}

Cara yang lebih performan untuk melakukan ini, jika Anda akan melakukan hal migrasi ganda, adalah menambahkan kondisi () ke setiap permintaan sumber (jika Anda menggunakan MigrateSourceSQL), seperti -> condition ('lang', 'en', '=').

Rikki Schulte
sumber
1

(Berikut ini berlaku untuk Drupal 7 - Saya tidak tahu tentang Drupal 6 atau sebelumnya.)
Saya kira Anda ingin mendefinisikan hubungan terjemahan antara simpul bahasa Inggris dan Prancis. Untuk melakukan itu, pertama, setiap node harus memiliki bahasa yang ditentukan, sebagaimana didefinisikan dalam prepareRow():

$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.

Kedua, Anda perlu mendefinisikan tnidnode sumber menjadi miliknya niddan tnidnode terjemahan menjadi nidnode sumber. Catatan Anda dapat memilih bahasa acak untuk simpul sumber, dan bahkan dapat diterima untuk mencampur bahasa sumber antara konten yang berbeda. Pertanyaannya adalah bagaimana.
(Catatan saya pikir hanya itu yang Anda butuhkan, tetapi saya mungkin salah. Saya mengikuti langkah-langkah dalam kasus kedua di bawah ini, dan berhasil.)

Jika Anda secara eksplisit menentukan nomor simpul (= nid) dari setiap baris dalam migrasi Anda, maka itu mudah, karena Anda tahu baris mana yang sesuai dengan yang mana nid, bahkan sebelum Anda mengimpor node tersebut. Jadi, Anda bisa mengatur tnidsetiap baris seperti itu. Jelas, Anda harus berhati-hati untuk tidak bertentangan dengan yang diimpor niddengan yang ada niddi konten Drupal.

Jika Anda membiarkan Drupal memutuskan nidsetiap baris yang diimpor, maka itu lebih rumit. Saya lakukan dengan 2 langkah. Pertama, saya mengimpor semua baris bahasa sumber, menambahkan bidang khusus untuk mengidentifikasinya sebagai simpul sumber untuk penggunaan nanti. Kedua, saya mengimpor baris-baris bahasa terjemahan dan mengatur semua tids dari kedua node sumber dan bahasa terjemahan. Kedua langkah ini dapat menjadi modul yang benar-benar berbeda, tetapi mungkin lebih mudah jika Anda mendefinisikan keduanya sebagai kelas terpisah dalam grup (migrasi) yang sama di varialbe $apidi komputer Anda Your_ModuleName.migrate.inc.

Untuk langkah kedua untuk bahasa terjemahan, saya menulis sebagai berikut. Singkatnya, ia menemukan simpul bahasa sumber dengan query SQL, berdasarkan pada bidang kustom field_original_html_filename, yang didefinisikan ketika diimpor.

// In prepareRow()
//   Set up tnid, obtaining the nid from the node already imported.
    $this->addFieldMapping('tnid', 'row_tnid');
    //
    $field_name = 'field_original_html_filename';
    $query = sprintf("SELECT n.entity_id FROM {field_data_%s} n WHERE n.%s_value = '%s'",
                     $field_name, $field_name, $fbasename_trans);     // entity_id == nid of Node
    $result = db_query($query);
    $nid_trans = $result->fetchCol()[0];
    $row->row_tnid = $nid_trans;      // In my case, it is guaranteed there is only one candidate.

// In prepare()
//   Forcibly set up (Change) tnid of the node already imported.
  public function prepare(&$node, $row) {
    if (isset($node->tnid) && ($source = node_load($node->tnid))) {
      $node->translation_source = $source;
    }
  }

Itu semuanya. Saya tidak terkejut jika ada cara yang lebih mudah atau lebih baik, tetapi itu berhasil bagi saya. Bagaimanapun keuntungan untuk menyiapkan terjemahan selama migrasi adalah Anda selalu dapat mengembalikan. Sebagai referensi seluruh kode migrasi saya (untuk 2 bahasa, dari file HTML statis) tersedia di GitHub:
https://github.com/masasakano/migrate_goo

Masa Sakano
sumber