移行モジュールを使用して多言語コンテンツを移動する


12

私は、各行に英語/フランス語の混合コンテンツを持つ単一のMySQLテーブルを持っています。これを適切なi18n構成のDrupalサイトに移行する方法を考えています。

Migrateでコンテンツを1つの言語にインポートできますが、両方の言語にインポートしたいです。901行あるため、最終的にリンクされる1802ノードを作成する必要があります。

Migrateモジュールを2回ループしてノードをリンクするようにセットアップする方法がわかりません。

編集:私はこれを使用し、2つをマージすることができました:

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を使用して翻訳済みのnidを追加する必要はないと思います。これは、移行マッピングを台無しにします(つまり、ロールバックできません)。同じグループ内で2つの別個の移行スクリプトとして実行するのが正しい方法です。「sourceMigration」メソッドを使用すると、2番目の移行にtnidを追加して、翻訳をリンクする問題を解決できます。
アランディクソン

回答:


2

同じマッピング(nidsを除く)で2つの移行を作成できますが、1つは英語でノードを保存し、2つ目はフランス語で保存します。


1
本当ですが、どうすればこの2つをリンクできますか?ここにはいくつかの大まかなコードがありますが、一度にすべてを実行できることはわかっています。pastebin.com/ap1P5DGY -私はここにドキュメントが私のために何かが欠けていると思いdrupal.org/node/1132582を - prepareRowに()返された何?リンクはpostImport()で実行できます。
マイクギフォード

明日、いくつかの移行作業を行う必要があるので、確認します。インポートされたnidと元のコンテンツIDの記録がある2つの移行間のマッピングを調べる必要があると思います。
acouch

1

prepareRow()では、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ソースノードのものに定義する必要があります。ソースノードにランダムな言語を選択できることに注意してください。したがって、異なるコンテンツ間でソース言語を混在させることも可能です。問題はどのようにかです。
(注:必要なのはこれだけだと思いますが、間違っている可能性があります。以下の2番目のケースの手順に従って成功しました。)

nid移行で各行のノード番号(= )を明示的に指定するとnid、それらのノードをインポートする前であっても、どの行がどのに対応するかがわかっているため、簡単です。したがって、tnid各行をそのように設定できます。明らかに、Drupalコンテンツ内のnid既存nidのs とインポートを競合させないように注意する必要があります。

Drupalにnidインポートされた各行の決定を行わせる場合、より注意が必要です。私は2つのステップでやった。最初に、すべてのソース言語行をインポートし、カスタムフィールドを追加して、後で使用するためのソースノードとして識別します。次に、翻訳言語の行をインポートし、tidソースノードと翻訳言語ノードの両方のすべてをセットアップします。これらの2つのステップは、完全に異なるモジュールであってもよいが、あなたはvarialbeで同じ(移行)、グループ内の別のクラスとして、これら二つを定義した場合、おそらく手軽されていることができます$apiあなたにYour_ModuleName.migrate.inc

翻訳言語の2番目のステップとして、次のように書きました。つまり、field_original_html_filenameインポート時に定義されたカスタムフィールドに基づいて、SQLクエリでソース言語ノードを見つけます。

// 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.