วิธีการทำซ้ำโหนดโดยทางโปรแกรมหรือไม่


11

ฉันต้องการสร้างสำเนาของเว็บฟอร์มที่ฉันทำด้วยที่อยู่อีเมลใหม่ในฐานะผู้รับ

หลังจากฉันโหลดโหนดด้วย node_load ฉันสามารถบันทึกด้วย node_save ได้หรือไม่ จะสร้างโหนดใหม่ที่มีการประทับเวลาและรหัสใหม่หรือไม่

ฉันจะรับหมายเลขของโหนดใหม่ที่สร้างขึ้นได้อย่างไร

คำตอบ:


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 ของโหนดมีคีย์จำนวนมากในอาร์เรย์ที่มีหมายเลขเก่าฉันควรทำอย่างไรกับพวกมัน
Arosboro

Drupal $node->nidเป็นเพียงแค่การตรวจสอบ หากไม่มี ID ของโหนดเหล่านั้นเป็น ID ของโหลดที่โหลดซึ่งจำเป็นต้องเปลี่ยนด้วย ID ของโหนดที่บันทึกไว้จากนั้นคุณสามารถปล่อยให้ ID ของโหนดเหล่านั้นเป็นเช่นนั้น
kiamlaluno

2
หากคุณกำลังใช้โมดูลเส้นทางคุณอาจต้องการunset($node->path);
Patrick James McDougle

6

ฉันต้องโพสต์สิ่งนี้เป็นคำตอบเพราะระบบทำให้คุณมี 50 คะแนนชื่อเสียงก่อนที่จะแสดงความคิดเห็น

อย่างไรก็ตามในการตอบสนองต่อ @koivo และคำตอบของเขา ฉันแค่อยากจะเพิ่มว่าสำหรับฉันยัง unsetting $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 คุณต้องยกเลิกการตั้งค่า node id unset($node->nid)และ revision id unset($node->vid)ทั้งคู่ ฉันสร้างแบบฟอร์มเพื่อคัดลอกโหนดประเภทหนึ่ง (ผลิตภัณฑ์) ที่มีการอ้างอิงคำหนึ่งคำ (แทนที่ด้วยคำว่า 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);
    }   
}

คุณอาจลองบันทึก timestamps und $node->uidอีกครั้ง


หากมีฟิลด์เอนทิตีการอ้างอิงใด ๆ บนโหนดดั้งเดิมดังนั้นจะไม่มีการเก็บค่าไว้บนโหนดที่ถูกโคลนและยังมีการยกระดับการเก็บข้อมูลความร้อนเนื่องจากไม่ได้ระบุประเภทโหนด ฉันกำลังทดสอบใน D7 เบาะแสใด ๆ
kiranking

2

ลองโมดูลซ้ำ
ฉันต้องการโคลนและแก้ไขสิ่งต่าง ๆ บนไซต์ที่ฉันทำเมื่อเร็ว ๆ นี้และพบว่าโมดูลนี้ทำงานได้ดี
ลองดูไฟล์replicate.api.phpเพื่อดูว่ามันใช้งานง่ายแค่ไหน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.