移行モジュールを使用した移行


8

Drupal 7と最新の移行モジュールを使用しています。OpenCart DBから新しいD7サイトに製品を移行するクラスを作成しようとしています。私は必要なすべてのSQLを理解し、そのほとんどをプログラムに組み込みました。しかし、私がどのようにカテゴリーを行うのかを理解するのに少し問題があります。

私の移行ターゲットはUbercartです。

私が理解しようとしているのは、Migrateのサブモジュールであるmigrate_exampleモジュールにあります。具体的には、WineWineMigrationクラスのwine.incファイルを見ています。移行という用語を理解しようとしています。

Ubercart製品の分類用語になる2つのリストがあります。最初はカテゴリです。カテゴリを手動で設定したので、(GROUP_CONCAT SQL funcを使用して)それらのリストを表示すると、すべてのID変換を保持する配列を使用してマップするIDの束ができます。それで問題ありませんが、移行中のBestWith情報を見ると、上記のWineBestWithクラスを使用して用語をインポートしていることがわかります。

なんらかの用語の二次移行のように見えるので、私はこれに混乱しています。それは何が起こっているのですか?さらに、これは私がマッピング配列を置く場所ですか、今期のマイグレーションクラスですか?

次に、タグを処理する必要があります。OpenCartには、自由形式のタグがたくさんあります。また、Ubercartで商品を手動で作成すると、タグのオートコンプリートフィールドができます。そのフィールドでは、コンマで区切られた用語のリストを入力するだけで、複数の用語が作成されます。移行モジュールで同じことを実行できますか?フィールドをカンマ区切りの用語のリストにマッピングできますか?各製品のタグが追加されますか?

回答:


14

私は今同じ問題に取り組んでいるので、あなたの混乱を理解しています。あなたにはたくさんの質問がありますが、私はそれらを単一の質問にまとめることができると思います:

Migrateモジュールは、正規化されたデータベースのDrupalインストールへの移行をどのように処理しますか?

それは間違いなく簡単ではありませんが、これがどのように機能するかについての私の理解です。上(WineWineMigration)から下に向かって質問をしていきます。

まず、WineWineMigrationクラスの上部にあるコードを見てみましょう。

...
$this->dependencies = array('WineVariety', 'WineRegion',
  'WineBestWith', 'WineUser', 'WineProducer');
...

これは、Migrateモジュールに、Wineコンテンツを移行するために、依存する移行(WineVariety、WineRegion、WineBestWith、WineUser、WineProduce)を最初に完了する必要があることを伝えます。

したがって、ここで学んだことは、移行は他の移行に依存する可能性があるということです。

次に、現在ベースのワイン情報を保持しているテーブルとDrupalノードの間のマッピングがあります。

$this->map = new MigrateSQLMap($this->machineName,
  array(
    'wineid' => array(
      'type' => 'int',
      'unsigned' => TRUE,
      'not null' => TRUE,
      'description' => 'Wine ID',
      'alias' => 'w',
    )
  ),
  MigrateDestinationNode::getKeySchema()
);

これは非常に簡単なので、説明が必要な場合は提供します。

ここでは、さまざまなカテゴリやワインオブジェクトを接続するのにあまり関係のないいくつかの暫定的なものをスキップします。

次に、フィールドのマッピングについて説明します。観察する:

// Mapped fields
$this->addFieldMapping('title', 'name')
     ->description(t('Mapping wine name in source to node title'));
$this->addFieldMapping('uid', 'accountid')
     ->sourceMigration('WineUser')
     ->defaultValue(1);
// TIP: By default, term relationship are assumed to be passed by name.
// In this case, the source values are IDs, so we specify the relevant
// migration (so the tid can be looked up in the map), and tell the term
// field handler that it is receiving tids instead of names
$this->addFieldMapping('migrate_example_wine_varieties', 'variety')
     ->sourceMigration('WineVariety')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_best_with', 'best_with')
     ->separator(',')
     ->sourceMigration('WineBestWith')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('field_migrate_example_wine_ratin', 'rating');
$this->addFieldMapping('field_migrate_example_top_vintag', 'best_vintages');

それが言うところを見てください:

->sourceMigration(...)

これは、このフィールドをマップするために、最初に別の移行が満たされる必要があることを移行に示します。これはあなたが話した「二次移住」だと思います。regionここでは例としてフィールドマッピングを使用します。それを分解...

$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));

これは、ソースデータベースのカテゴリ領域が領域語彙用語にマップされていることを示しています。TIPコメントはフィールドマッピングコードチャンクに記載されているように、マッピングはfield_namesに基づいて行われることを前提としていますが、ユーザーが入力するセカンダリマイグレーションに依存しているため、依存するマイグレーションを指定し、それを指示する必要がありますフィールド名の代わりにTIDを使用します。

ソースデータベースにあるすべての正規化されたテーブルについて、ほとんどの場合、それぞれの移行を指定し、それらのテーブルを含む関連するフィールドマッピングでは、フィールドマッピングの呼び出しに依存する移行を指定します、および各移行の開始時の依存する移行の宣言。

これがお役に立てば幸いです。私はこれを完全には理解していません。この質問を、Migrateがデータベースを関連付ける方法についての理解を深める機会として使用しました。もう少し学ぶと、それに応じて私の答えを更新します。


1
明確にする必要がある場合はお知らせください。投稿は私が気づいたちょっとした脳のダンプです...
レスターピーボディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.