Bagaimana cara menduplikasi sebuah node secara terprogram?

11

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?

Arosboro
sumber

Jawaban:

17

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

Kode yang dijalankan node_save()adalah sebagai 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 disahkan; ini berarti fungsi tidak akan memperbarui baris basis data yang ada.

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

kiamlaluno
sumber
Objek webform node memiliki banyak nid kunci dalam array yang berisi nid lama, apa yang harus saya lakukan?
Arosboro
Drupal cukup periksa $node->nid. Jika tidak ada ID simpul tersebut yang merupakan ID dari simpul yang dimuat, yang perlu diubah dengan ID dari simpul yang disimpan, maka Anda dapat membiarkan ID simpul tersebut apa adanya.
kiamlaluno
2
Jika Anda menggunakan modul path, Anda mungkin juga inginunset($node->path);
Patrick James McDougle
6

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

Pokoknya, dalam menanggapi @koivo dan jawabannya. Saya hanya ingin menambahkan itu untuk saya, juga $node->vidtidak 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);
Jorge Calderon
sumber
2

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 ulang cap waktu $node->uidjuga.

leymannx
sumber
Jika ada bidang entitasreferensi pada node asli maka tidak mempertahankan nilainya pada node yang dikloning dan juga entitasmalformedexception dinaikkan untuk tidak menentukan jenis node. Saya menguji di D7. ada petunjuk?
kiranking
2

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

2pha
sumber