ย้ายเนื้อหาหลายภาษาด้วยโมดูลโยกย้าย


12

ฉันมีตาราง MySQL เดี่ยวพร้อมเนื้อหาภาษาอังกฤษ / ฝรั่งเศสผสมกันในแต่ละแถว ฉันกำลังพยายามหาวิธีการย้ายข้อมูลนี้ไปยังไซต์ Drupal ที่กำหนดค่า i18n ที่เหมาะสม

ฉันสามารถย้ายข้อมูลเพื่อนำเข้าเนื้อหาเป็นภาษาเดียว แต่ฉันต้องการให้นำเข้าเนื้อหาเป็นทั้งสองภาษา มี 901 แถวดังนั้นในที่สุดควรสร้างโหนด 1802 ที่เชื่อมโยง

ฉันไม่สามารถหาวิธีตั้งค่าโมดูลการโยกย้ายเพื่อวนซ้ำสองครั้งและเชื่อมโยงโหนด

แก้ไข: ฉันใช้สิ่งนี้และสามารถผสานสอง:

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++;
  }
}

}


1
ฉันไม่คิดว่าคุณควรใช้ postImport เพื่อเพิ่ม nids ที่แปลแล้วของคุณซึ่งจะทำให้การแมปการโอนย้ายข้อมูลเสียหาย (เช่นคุณจะไม่สามารถย้อนกลับ) การทำเช่นนี้เป็นสคริปต์การย้ายข้อมูลที่แยกกันสองตัวภายในกลุ่มเดียวกันจะเป็นวิธีที่ถูกต้องและการใช้วิธีการ 'sourceMigration' ช่วยให้คุณเพิ่ม tnid ในการย้ายข้อมูลครั้งที่สองเพื่อแก้ปัญหาการเชื่อมโยงการแปลเข้าด้วยกัน
Alan Dixon

คำตอบ:


2

คุณสามารถสร้างการย้ายข้อมูลได้สองรายการโดยใช้การแมปเดียวกัน (ยกเว้นเครื่อง nids) แต่เครื่องหนึ่งจะบันทึกโหนดเป็นภาษาอังกฤษและที่สองเป็นภาษาฝรั่งเศส


1
จริง แต่ฉันจะเชื่อมโยงทั้งสองได้อย่างไร ฉันมีรหัสคร่าวๆที่นี่ แต่ฉันรู้ว่าเป็นไปได้ที่จะทำมันทั้งหมดในครั้งเดียว pastebin.com/ap1P5DGY ฉันคิดว่าเอกสารที่นี่หายไปบางอย่างสำหรับฉัน - drupal.org/node/1132582 - ใน prepareRow () มีอะไรส่งคืนหรือไม่ การเชื่อมโยงสามารถทำได้ด้วย postImport ()
Mike Gifford

พรุ่งนี้ฉันจะต้องทำอะไรบางอย่างเพื่อย้ายถิ่นฐาน ฉันคิดว่าคุณต้องดูการแมประหว่างการย้ายข้อมูลสองรายการที่มีการบันทึก nids ที่นำเข้าและรหัสเนื้อหาดั้งเดิม
acouch

1

ใน PreparRow () คุณกลับมาจริงหรือเท็จ สิ่งนี้จะกำหนดว่าแถวนั้นจะได้รับการประมวลผลในการโยกย้ายครั้งนั้นหรือไม่

ด้วยวิธีนี้คุณสามารถตรวจสอบภาษาสำหรับแต่ละแถวและคืนค่า TRUE สำหรับแถวที่มีเนื้อหาในภาษาเฉพาะสำหรับการโยกย้ายนั้นเท่านั้น

ดังนั้นคุณสามารถทำสิ่งที่ชอบ:

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;
}

วิธีที่มีประสิทธิภาพมากยิ่งขึ้นในการทำสิ่งนี้หากคุณกำลังจะทำสิ่งต่าง ๆ ในการโยกย้ายแบบคู่จะเป็นการเพิ่มเงื่อนไข () ลงในแบบสอบถามต้นฉบับแต่ละรายการ (ถ้าคุณใช้ MigrateSourceSQL) เช่น -> เงื่อนไข ('lang' 'en', '=')


1

(ข้อมูลต่อไปนี้ใช้กับ Drupal 7 - ฉันไม่รู้เกี่ยวกับ Drupal 6 หรือก่อนหน้า)
ฉันคิดว่าคุณต้องการกำหนดความสัมพันธ์ของการแปลระหว่างโหนดภาษาอังกฤษและภาษาฝรั่งเศส ในการทำเช่นนั้นอันดับแรกแต่ละโหนดควรมีภาษาที่กำหนดดังที่กำหนดไว้ในprepareRow():

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

ประการที่สองคุณต้องกำหนดอย่างใดอย่างหนึ่งtnidของซอร์ส - โหนดเป็นของตนเองnidและtnidของโหนดการแปลเป็นnidของโหนดต้นทาง หมายเหตุคุณสามารถเลือกภาษาแบบสุ่มสำหรับโหนดต้นทางและดังนั้นจึงเป็นที่ยอมรับกันในการผสมภาษาต้นฉบับระหว่างเนื้อหาที่แตกต่างกัน คำถามคืออย่างไร
(หมายเหตุฉันคิดว่านั่นคือทั้งหมดที่คุณต้องการ แต่ฉันอาจผิดฉันทำตามขั้นตอนในกรณีที่สองด้านล่างและประสบความสำเร็จ)

หากคุณระบุหมายเลขโหนด (= nid) ของแต่ละแถวอย่างชัดเจนในการย้ายข้อมูลของคุณจะเป็นเรื่องง่ายเพราะคุณรู้ว่าแถวใดสอดคล้องกับแถวใดnidก่อนที่คุณจะนำเข้าโหนดเหล่านั้น ดังนั้นคุณสามารถตั้งค่าtnidของแต่ละแถวได้ เห็นได้ชัดว่าคุณจะต้องระมัดระวังไม่ให้ขัดแย้งกับการนำเข้าnidกับใด ๆ ที่มีอยู่nidในเนื้อหา Drupal

หากคุณปล่อยให้ Drupal ตัดสินใจเลือกnidแถวที่นำเข้าแต่ละแถวมันจะยุ่งยากมากขึ้น ฉันทำกับ 2 ขั้นตอน ก่อนอื่นฉันนำเข้าแถวภาษาต้นฉบับทั้งหมดโดยเพิ่มเขตข้อมูลที่กำหนดเองเพื่อระบุว่าเป็นโหนดต้นทางสำหรับใช้ในภายหลัง ประการที่สองฉันนำเข้าแถวภาษาที่แปลแล้วและตั้งค่าtidโหนดทั้งหมดของโหนดต้นทางและโหนดแปลภาษา ทั้งสองขั้นตอนสามารถเป็นโมดูลที่แตกต่างกันอย่างสมบูรณ์ แต่อาจจะเป็นการง่ายกว่าถ้าคุณกำหนดทั้งสองเรียนที่แยกต่างหากในแบบเดียวกัน (การโยกย้าย) กลุ่มใน varialbe ในของคุณ$apiYour_ModuleName.migrate.inc

สำหรับขั้นตอนที่สองสำหรับภาษาที่แปลฉันเขียนดังต่อไปนี้ กล่าวโดยย่อจะค้นหาโหนดภาษาต้นฉบับด้วยแบบสอบถาม SQL โดยยึดตามเขตข้อมูลที่กำหนดเองfield_original_html_filenameซึ่งกำหนดไว้เมื่อนำเข้า

// 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;
    }
  }

นั้นคือทั้งหมด. ฉันไม่แปลกใจเลยว่าจะมีวิธีที่ง่ายกว่าหรือดีกว่านี้ แต่ก็ใช้ได้สำหรับฉัน อย่างไรก็ตามข้อดีของการตั้งค่าการแปลระหว่างการย้ายข้อมูลคือคุณสามารถย้อนกลับได้ตลอดเวลา เป็นการอ้างอิงรหัสการโยกย้ายทั้งหมดของฉัน (สำหรับ 2 ภาษาจากไฟล์ HTML แบบคงที่) ที่ GitHub:
https://github.com/masasakano/migrate_goo

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.