Di chuyển nội dung đa ngôn ngữ với Mô-đun di chuyển


12

Tôi đã có một bảng MySQL duy nhất với nội dung tiếng Anh / tiếng Pháp hỗn hợp trong mỗi hàng. Tôi đang cố gắng tìm cách di chuyển trang này vào một trang web Drupal được cấu hình i18n thích hợp.

Tôi có thể nhận Di chuyển để nhập nội dung vào một ngôn ngữ, nhưng tôi muốn nhập nội dung đó sang cả hai ngôn ngữ. Có 901 hàng, do đó cuối cùng sẽ tạo 1802 nút được liên kết.

Tôi chỉ không thể tìm ra cách thiết lập mô-đun Di chuyển để lặp qua hai lần và liên kết các nút.

EDIT: Tôi đã sử dụng cái này và có thể hợp nhất cả hai:

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
Tôi không nghĩ rằng bạn nên sử dụng postImport để thêm các bản dịch đã dịch của mình, điều đó sẽ làm rối bản đồ di chuyển (tức là bạn sẽ không thể khôi phục lại). Làm điều đó như hai tập lệnh di chuyển riêng biệt trong cùng một nhóm sẽ là cách phù hợp để thực hiện và sử dụng phương thức 'sourceMigration' cho phép bạn thêm tnid vào lần di chuyển thứ hai để giải quyết câu hỏi liên kết các bản dịch với nhau.
Alan Dixon

Câu trả lời:


2

Bạn có thể tạo hai lần di chuyển, cả hai đều có cùng một ánh xạ (ngoại trừ các nids), nhưng một lần lưu các nút bằng tiếng Anh và lần thứ hai bằng tiếng Pháp.


1
Đúng, nhưng làm thế nào để tôi liên kết hai? Tôi đã có một số mã thô ở đây, nhưng tôi biết có thể làm tất cả cùng một lúc. pastebin.com/ap1P5DGY Tôi nghĩ rằng các tài liệu ở đây đang thiếu thứ gì đó đối với tôi - drupal.org/node/1132582 - trong phần chuẩn bị () đã trả về cái gì? Liên kết có thể được thực hiện với postImport ().
Mike Gifford

Tôi phải làm một số công cụ di chuyển vào ngày mai vì vậy tôi sẽ xem xét. Tôi nghĩ rằng bạn cần xem xét ánh xạ giữa hai lần di chuyển có bản ghi các số liệu đã được nhập và id nội dung gốc.
acouch

1

Trong Chuẩn bị () bạn trả về đúng hoặc sai. Điều này xác định xem hàng đó có được xử lý trong di chuyển cụ thể đó không (và được tính chẵn).

Bằng cách này, bạn có thể phát hiện ngôn ngữ cho từng hàng và chỉ trả về ĐÚNG cho các hàng có chứa nội dung trong ngôn ngữ cụ thể cho việc di chuyển đó.

vì vậy bạn có thể làm một cái gì đó như:

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

Một cách thậm chí hiệu quả hơn để làm điều này, nếu bạn định thực hiện điều di chuyển kép, sẽ là thêm một điều kiện () cho mỗi truy vấn nguồn (nếu bạn đang sử dụng MigrateSourceQuery), chẳng hạn như -> condition ('lang', 'En', '=').


1

(Những điều sau đây áp dụng cho Drupal 7 - Tôi không biết về Drupal 6 hoặc trước đó.)
Tôi cho rằng bạn muốn xác định mối quan hệ dịch thuật giữa các nút tiếng Anh và tiếng Pháp. Để làm điều đó, trước tiên, mỗi nút phải có ngôn ngữ được xác định, như được định nghĩa trong prepareRow():

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

Thứ hai, bạn cần xác định bằng cách nào đó tnidnút của nút nguồn là của riêng nó nidtnidcủa nút dịch là nút nidcủa nút nguồn. Lưu ý rằng bạn có thể chọn ngôn ngữ ngẫu nhiên cho nút nguồn và do đó, có thể chấp nhận được việc trộn lẫn ngôn ngữ nguồn giữa các nội dung khác nhau. Câu hỏi là làm thế nào.
(Lưu ý tôi nghĩ đó là tất cả những gì bạn cần, nhưng tôi có thể sai. Tôi đã làm theo các bước trong trường hợp thứ hai dưới đây và đã thành công.)

Nếu bạn chỉ định rõ ràng số nút (= nid) của mỗi hàng trong quá trình di chuyển của mình thì thật dễ dàng, vì bạn biết hàng nào tương ứng với hàng nào nid, ngay cả trước khi bạn nhập các nút đó. Vì vậy, bạn chỉ có thể đặt tnidtừng hàng như vậy. Rõ ràng, bạn phải cẩn thận để không xung đột nidvới bất kỳ nidnội dung nào hiện có trong nội dung Drupal.

Nếu bạn để Drupal quyết định nidtừng hàng đã nhập thì sẽ khó khăn hơn. Tôi đã làm với 2 bước. Đầu tiên, tôi đã nhập tất cả các hàng của ngôn ngữ nguồn, thêm một trường tùy chỉnh để xác định nó là nút nguồn cho lần sử dụng sau. Thứ hai, tôi đã nhập các hàng ngôn ngữ dịch và thiết lập tất cả các nút tidcủa cả hai nút nguồn và ngôn ngữ dịch. Hai bước này có thể là các mô-đun hoàn toàn khác nhau, nhưng có lẽ sẽ xử lý tốt hơn nếu bạn định nghĩa hai mô-đun này là các lớp riêng biệt trong cùng một nhóm (di chuyển) trong varialbe $apitrong của bạn Your_ModuleName.migrate.inc.

Đối với bước thứ hai cho ngôn ngữ dịch, tôi đã viết như sau. Nói tóm lại, nó tìm thấy nút ngôn ngữ nguồn với truy vấn SQL, dựa trên trường tùy chỉnh field_original_html_filename, được xác định khi nó được nhập.

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

Đó là tất cả. Tôi không ngạc nhiên nếu có một cách dễ dàng hơn hoặc tốt hơn, nhưng nó đã làm việc cho tôi. Dù sao, một lợi thế để thiết lập các bản dịch trong quá trình di chuyển là bạn luôn có thể quay lại. Là một tài liệu tham khảo toàn bộ mã di chuyển của tôi (cho 2 ngôn ngữ, từ các tệp HTML tĩnh) có sẵn tại GitHub:
https://github.com/masasakano/migrate_goo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.