Answers:
只需使用取消设置节点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);
在D7中,您必须同时取消设置节点ID unset($node->nid)
和修订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);
}
}
您可能还考虑重新保存时间戳记und $node->uid
。
尝试复制模块。
我需要轻松克隆和更改最近在一个站点上的内容,发现此模块运行良好。
检出replicate.api.php文件,以了解它的使用简便性。