(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 đó tnid
nút của nút nguồn là của riêng nó nid
và tnid
của nút dịch là nút nid
củ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 tnid
từng hàng như vậy. Rõ ràng, bạn phải cẩn thận để không xung đột nid
với bất kỳ nid
nội dung nào hiện có trong nội dung Drupal.
Nếu bạn để Drupal quyết định nid
từ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 tid
củ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 $api
trong 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