Migrate Module로 다국어 콘텐츠 이동


12

각 행에 영어 / 프랑스어 내용이 혼합 된 단일 MySQL 테이블이 있습니다. 이것을 적절한 i18n 구성 Drupal 사이트로 마이그레이션하는 방법을 알아 내려고합니다.

Migrate가 콘텐츠를 한 언어로 가져 오도록 할 수 있지만 두 언어로 가져 오기를 원합니다. 901 개의 행이 있으므로 궁극적으로 연결된 1802 개의 노드를 만들어야합니다.

Migrate 모듈을 두 번 반복하고 노드를 연결하도록 설정하는 방법을 알 수 없습니다.

편집 : 나는 이것을 사용하고 두 가지를 병합 할 수있었습니다.

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
번역 된 nid를 추가하기 위해 postImport를 사용해야한다고 생각하지 않습니다. 마이그레이션 매핑을 엉망으로 만듭니다 (즉, 롤백 할 수 없습니다). 동일한 그룹 내에서 두 개의 개별 마이그레이션 스크립트로 수행하는 것이 올바른 방법이며 'sourceMigration'방법을 사용하면 두 번째 마이그레이션에 tnid를 추가하여 번역을 서로 연결하는 문제를 해결할 수 있습니다.
Alan Dixon

답변:


2

동일한 매핑을 사용하여 두 가지 마이그레이션을 만들 수 있지만 (nid 제외) 하나는 노드를 영어로 저장하고 다른 하나는 프랑스어로 저장합니다.


1
사실이지만 어떻게 연결합니까? 여기에 거친 코드가 있지만 한 번에 모두 할 수 있다는 것을 알고 있습니다. pastebin.com/ap1P5DGY 여기에있는 문서가 준비 행 ()에서 drupal.org/node/1132582- 나에게 뭔가 누락 된 것 같습니다 . postImport ()를 사용하여 연결할 수 있습니다.
Mike Gifford

내일 마이그레이션을 수행해야하므로 살펴 보겠습니다. 가져온 nids 레코드와 원본 콘텐츠 ID가있는 두 마이그레이션 간의 매핑을 살펴 봐야한다고 생각합니다.
23 분 48 초

1

PreparingRow ()에서 true 또는 false를 반환합니다. 이는 해당 행이 해당 특정 마이그레이션에서 처리되는지 (짝수로 계산되는지) 여부를 결정합니다.

이런 방식으로 각 행의 언어를 감지하고 해당 마이그레이션에 대한 특정 언어의 컨텐츠를 포함하는 행에 대해서만 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;
}

이중 마이그레이션 작업을 수행하려는 경우-> condition ( '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각 행을 그대로 설정할 수 있습니다 . 임포트 된 Drupal 컨텐츠 nid와 충돌하지 않도록주의해야합니다 nid.

Drupal이 nid가져온 각 행을 결정하게하면 더 까다 롭습니다. 나는 2 단계로했다. 먼저 모든 소스 언어 행을 가져 와서 나중에 사용할 수 있도록 소스 노드로 식별하기 위해 사용자 정의 필드를 추가했습니다. 둘째, 번역 된 언어 행을 가져 와서 tid소스 및 번역 된 언어 노드 모두를 설정했습니다 . 이 두 단계는 완전히 다른 모듈 일 수 있지만,이 두 단계를의 varialbe $api에 있는 동일한 (마이그레이션) 그룹에서 별도의 클래스로 정의하면 더 편리 합니다 Your_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;
    }
  }

그게 다야. 더 쉽고 좋은 방법이 있는지는 놀랍지 않지만 그것은 나를 위해 일했습니다. 어쨌든 마이그레이션 중에 번역을 설정하면 항상 롤백 할 수 있다는 이점이 있습니다. 참고로 GitHub에서 전체 마이그레이션 코드 (정적 HTML 파일의 2 개 언어)를 https://github.com/masasakano/migrate_goo 에서 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.