3

Web サイトを asp.net から drupal アーキテクチャに移行するプロジェクトに取り組んでいます。しかし、サイトのコンテンツは非常に階層的で、エンティティ間の参照が多数あります。

たとえば、各コンテンツはカテゴリに属し、各カテゴリは別のカテゴリ セクションに属します。現在、別のレベルの階層さえあるかもしれません。

データベースの内容を移行し、ノード参照フィールドを介して移行されたノードをリンクするために、移行モジュールを利用することを計画しています。

しかし、ノード参照フィールドをどこにも移行する方法が見つからないため、移行モジュールに行き詰まっています...

誰でもこれで私を助けることができます...

4

5 に答える 5

3

実際、2012年はそれほど難しいことではないようです。はい、ソースIDとインポートIDを追跡する必要がありますが、移行モジュールは、きちんとした小さなテーブルでこれを実行します。ソースクエリでそのテーブルを結合し、ノード参照フィールドを..参照ノードのnidで更新できます。もちろん、参照されるノードはすでにインポートされているはずです。それらがなかった場合は、後で「更新」の実行を実行でき、参照されたnidは後者のインポートに基づいて入力されます。実際には:

$query = Database::getConnection(
    'default', 'mysourcedb'
)->select(
    'mysourcetable','source'
)->fields('source', array(
        'id',
        'title',
        'whatever'
        'rel_rec_id'
    )
);

$query->leftJoin('migrate_map_relimport','relmap','relmap.sourceid1=source.rel_rec_id');
$query->addField('relmap','destid1','rel_node_id');

上記のコードは、「rel_rec_id」を参照する「mysourcetable」を含む「mysourcedb」があり、rel_rec_idが参照しているrelテーブルをインポートするRelImportという別のインポートがあることを前提としています。すでに実行されている必要があります(または、追加の更新を実行する前に実行されます)。RelImportクラスを取得したら、migrate-statusを実行して、テーブルが存在することを確認します。

'migrate_map_relimport'テーブルに結合できるようにするには、マップテーブルがdrupalデータベースではなくソースデータベースに書き込まれていることを確認してください。これは必ずしも必要ではありませんが、ここにあります。

$this->map = new MigrateSQLMap(
    $this->machineName,
        array(
            'id' => array(
                'type' => 'int',
                'unsigned' => true,
                'not null' => true,
                'alias' => 'source' 
              )
        ),
        MigrateDestinationNode::getKeySchema(),
        'mysourcedb' // connection to use to write map tables
);

最後に、取得したrel_node_idをノード参照に割り当てます。

$this->addFieldMapping( 'field_rel_node', 'rel_node_id' );

ええ、それはロケット科学です.. YMMV

*-パイク

于 2012-10-12T10:16:15.823 に答える
1

Content Migrate モジュールのコードも参照してください (詳細はhttps://drupal.org/node/1144136を参照)。D6 Content Construction Kit (CCK) コンテンツを D7 Fields に移行するためのもので、References モジュールと統合されています。

D6 サイトではなく ASP.net サイトからアクセスしているため、すぐに必要な機能は実行されませんが、いくつかの手がかりが得られる場合があります。

于 2012-04-20T17:14:59.453 に答える
1

私の知る限り、移行モジュール内でこれを完全に行うことはできません。MySQL でいくつかのクエリを直接実行する必要があります。

基本的に、各コンテンツ タイプに追加のフィールドを作成して、レガシー ID を格納し、レガシー参照ごとに (実際の nodereference フィールドに加えて) 追加フィールドを作成する必要があります。すべてのデータをコンテンツ タイプにロードします (nodereference フィールドは空のままにします)。次に、すべてのエンティティが読み込まれたら、mysql クエリを実行して、従来の ID と従来の参照フィールドに基づいてノード参照フィールドを設定します。それが完了したら、これらのレガシー フィールドを安全に削除できます。

最もエレガントなソリューションではありませんが、私は何度も使用しました。

警告: * これは Drupal 6 用です。Drupal 7 のフィールドの実装は、知る限りまったく異なります。* 非常に大規模な移行の場合、MySQL を介してレガシー フィールドの削除を行うことができます。

幸運を。移住は汚いビジネスです。

于 2011-02-03T15:07:57.847 に答える
0

あなたが求めているものとは正確には異なりますが、これは私にとって役に立ちました: http://drupal.org/node/1013506

于 2013-03-12T18:43:44.250 に答える
0

興味深いリンクを次に示します: http://www.lullabot.com/articles/drupal-data-imports-migrate-and-table-wizard#comment-6974

于 2011-02-03T10:30:51.590 に答える