it-swarm-id.com

Bagaimana cara menduplikasi sebuah node secara terprogram?

Saya ingin membuat salinan formulir web yang saya buat, dengan alamat email baru sebagai penerima.

Setelah saya memuat node dengan node_load, dapatkah saya menyimpannya dengan node_save? Apakah itu akan membuat simpul baru dengan cap waktu dan id baru?

Bagaimana saya bisa mendapatkan nid dari simpul baru yang telah dibuat?

11
Arosboro

Cukup hapus ID simpul dengan unset($node->nid), dan node_save () akan membuat simpul baru.

Kode yang dieksekusi dari node_save() adalah yang berikut:

// 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';
}    

Argumen terakhir drupal_write_record () tidak diberikan; ini berarti fungsi tidak akan memperbarui baris basis data yang ada.

Setelah objek node disimpan dengan node_save(), $node->nid Berisi ID node untuk baris database yang baru dibuat.

17
kiamlaluno

Saya harus memposting ini sebagai jawaban karena sistem membuat Anda memiliki 50 poin reputasi sebelum dapat berkomentar.

Pokoknya, menanggapi @koivo dan jawabannya. Saya hanya ingin menambahkan itu untuk saya, juga membatalkan pengaturan $node->vid melakukan trik. Jadi kode saya untuk unsetting dan saving adalah

// 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);
6
Jorge Calderon

Coba modul duplikat .
Saya perlu dengan mudah mengkloning dan mengubah hal-hal di situs yang saya lakukan baru-baru ini dan menemukan modul ini bekerja dengan baik.
Lihat file replicate.api.php untuk melihat betapa mudahnya menggunakannya.

2
2pha

Di D7 Anda harus menghapus id id unset($node->nid) dan id revisi unset($node->vid) keduanya. Saya membangun formulir untuk mengkloning node dari satu jenis tertentu (produk) yang memiliki satu referensi istilah tertentu (dengan mengganti istilah itu id). Inilah hasil akhir:

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);
    }   
}

Anda mungkin mempertimbangkan untuk menyimpan kembali cap waktu di bawah $node->uid demikian juga.

2
leymannx