web-dev-qa-db-ja.com

ノードのインポート時に同じノードIDを維持する

Node ExportFeatures モジュールと共に使用していて、プロファイルのインストール中にコンテンツをインポートしています。すべて正常に動作しますが、インポート中にノードIDを保持したいです。ソースサイトと同じ順序にしたい。

できますか?

1
Hacker

ここでさらに詳しく説明すると、質問が明確になり、より良い回答が得られると思います。

  • 新しいサーバーに移動しますか?
  • 既に他のコンテンツがある別のサイトにコンテンツをインポートしますか?
  • NIDの保持について心配しているのはなぜですか?外部依存関係?
  • 注文が唯一の懸念事項ですか、それとも実際のNID自体ですか?

ここで役立ついくつかの考え:

  1. drush とimportを使用するcore-rsync/sql-syncまたはsql-dumpは、すべてのアイテムのノードIDとマシン名を維持します。これには「機能」は一切含まれていません。インストールのクローンを作成し、サイト#2の違いを上書きするコアオペレーションです。注意してください。
  2. これを1度だけ行う場合(およびNIDのみに関心がある場合)、ノードをインポートする前に、ターゲットデータベースのmySQLでALTER TABLE node AUTO_INCREMENT = XXX;(XXX =最初の古いNID)ステートメントを使用すると役立つ場合があります。ただし、ノードの非順次NIDリスト(64、65、68など)をエクスポートしない場合、これは機能しません。また、ソースの最初のNID(または一致するNID)より大きいNIDがすでにある場合、ターゲットサイトは失敗または破壊される可能性が高くなります。
1
Jake The Dweeb

つまり、いいえ(とにかく簡単/安全に)。

特定のコンテンツIDを探している場合は、ソース/宛先サイトに [〜#〜] uuid [〜#〜] モジュールを配置することを検討してください。私の知る限り、これにより、ノードIDが異なる場合でも、サイト間で一致するノードの一意の識別子を維持できます。

1
Chapabu

はい、少しの作業で。

まず、node.nidとnode_revision.vidの自動インクリメントを無効にします。読者のための演習の詳細。

次に、1つの関数を含むカスタムモジュールを作成します(mymodule_ns($ node)など)。

node_saveの内容をコピーして、api.drupal.orgから関数に貼り付けます。

次に(drupal 7.28)の現在の値)elseの行を

if($node->is_new)

それは言う

drupal_write_record('node', $node, 'nid);

drupal_write_record('node', $node);

次に、elseの下の行を

if($!empty($node->revision))

それは言う

_node_save_revision($node, $user->uid, 'vid');

_node_save_revision($node, $user->uid);

モジュールを有効にします。

最後に、次の変更を加えて、通常どおりプログラムでノードを作成します。

  1. $ node-> nid = $ node-> vid =オブジェクトに必要なものをすべて設定します。
  2. $ node-> logを空ではないものに設定します。「インポートされたノード」などのように言います。
  3. node_saveの代わりにmymodule_nsを呼び出します。

Nodeとnode_revisionテーブルで自動インクリメントをオンに戻し、自動インクリメント値をインポートした最高のnidよりも大きい値に設定することを忘れないでください。

ハッピーハンティング。

1
davery