プログラムでノードを複製する方法は?


11

新しい電子メールアドレスを受信者として、作成したWebフォームのコピーを作成しようとしています。

node_loadでノードをロードした後、node_saveでノードを保存できますか?新しいタイムスタンプとIDを持つ新しいノードが作成されますか?

作成された新しいノードのNIDを取得するにはどうすればよいですか?

回答:


17

でノードIDを設定解除するだけunset($node->nid)で、node_save()が新しいノードを作成します。

から実行されるコードnode_save()は次のとおりです。

// Insert a new node.
$node->is_new = empty($node->nid);
// ...
if ($node->is_new) {
  _node_save_revision($node, $user->uid);
  drupal_write_record('node', $node);
  db_query('UPDATE {node_revisions} SET nid = %d WHERE vid = %d', $node->nid, $node->vid);
  $op = 'insert';
}    

drupal_write_record()の最後の引数は渡されません。つまり、関数は既存のデータベース行を更新しません。

ノードオブジェクトがで保存されるとnode_save()$node->nid新しく作成されたデータベース行のノードIDが含まれます。


ノードのwebformオブジェクトの配列には、古いnidを含む多くのnidキーがあります。それらについて何をすればよいですか?
アロスボロ2011

Drupalを確認してください$node->nid。これらのノードIDがロードされたノードのIDでなく、保存されたノードのIDで変更する必要がある場合は、それらのノードIDをそのままにすることができます。
kiamlaluno

2
パスモジュールを使用している場合は、次のこともお勧めしますunset($node->path);
Patrick James McDougle

6

コメントを投稿する前に、システムが50の評判ポイントを取得するため、これを回答として投稿する必要がありました。

とにかく、@ koivoと彼の答えに応じて。私はそれを私のために追加したかっただけでなく$node->vid、トリックを解除しました。したがって、設定を解除して保存するための私のコードは

// Load a node
$node = node_load(1);

// unset version and node id's
unset($node->nid);
unset($node->vid);
unset($node->path);

// Save the copy
node_save($node);

2

D7では、ノードID unset($node->nid)とリビジョンIDのunset($node->vid)両方を設定解除する必要があります。特定の用語参照が1つある特定のタイプ(製品)のノードを複製するフォームを作成します(その用語IDを置き換えます)。これが最終的な送信です。

function MYMODULE_form_submit($form, &$form_state) {
    $old_tid = $form_state['values']['old_tid'];
    $new_tid = $form_state['values']['new_tid'];

    $query = new EntityFieldQuery();
    $result = $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'product')
    ->fieldCondition('field_some_term_reference', 'tid', $old_tid)
    ->execute();

    foreach ($result['node'] as $product) {
        $node = node_load($product->nid);
        $node->field_some_term_reference[LANGUAGE_NONE][0]['tid'] = $new_tid;
        unset($node->nid);
        unset($node->vid);
        node_save($node);
    }   
}

タイムスタンプを再保存することも検討してください$node->uid


元のノードにエンティティ参照フィールドがある場合、それは複製されたノードでその値を保持しておらず、また、ノードタイプを指定しないためにentitymalformedexceptionが発生します。D7でテストしています。どんな手掛かり?
ランキング

2

複製モジュールを試してください。
最近行ったサイトで物事を簡単に複製して変更する必要があり、このモジュールがうまく機能していることがわかりました。replicate.api.phpファイルを
チェックして、それがいかに簡単であるかを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.