ฉันต้องการสร้างสำเนาของเว็บฟอร์มที่ฉันทำด้วยที่อยู่อีเมลใหม่ในฐานะผู้รับ
หลังจากฉันโหลดโหนดด้วย node_load ฉันสามารถบันทึกด้วย node_save ได้หรือไม่ จะสร้างโหนดใหม่ที่มีการประทับเวลาและรหัสใหม่หรือไม่
ฉันจะรับหมายเลขของโหนดใหม่ที่สร้างขึ้นได้อย่างไร
ฉันต้องการสร้างสำเนาของเว็บฟอร์มที่ฉันทำด้วยที่อยู่อีเมลใหม่ในฐานะผู้รับ
หลังจากฉันโหลดโหนดด้วย node_load ฉันสามารถบันทึกด้วย node_save ได้หรือไม่ จะสร้างโหนดใหม่ที่มีการประทับเวลาและรหัสใหม่หรือไม่
ฉันจะรับหมายเลขของโหนดใหม่ที่สร้างขึ้นได้อย่างไร
คำตอบ:
เพียงแค่ถอนการตั้งค่า 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 โหนดสำหรับแถวฐานข้อมูลที่สร้างขึ้นใหม่
$node->nid
เป็นเพียงแค่การตรวจสอบ หากไม่มี ID ของโหนดเหล่านั้นเป็น ID ของโหลดที่โหลดซึ่งจำเป็นต้องเปลี่ยนด้วย ID ของโหนดที่บันทึกไว้จากนั้นคุณสามารถปล่อยให้ ID ของโหนดเหล่านั้นเป็นเช่นนั้น
unset($node->path);
ฉันต้องโพสต์สิ่งนี้เป็นคำตอบเพราะระบบทำให้คุณมี 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);
ใน 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
อีกครั้ง
ลองโมดูลซ้ำ
ฉันต้องการโคลนและแก้ไขสิ่งต่าง ๆ บนไซต์ที่ฉันทำเมื่อเร็ว ๆ นี้และพบว่าโมดูลนี้ทำงานได้ดี
ลองดูไฟล์replicate.api.phpเพื่อดูว่ามันใช้งานง่ายแค่ไหน