如何以编程方式复制节点?


11

我正在寻找创建的网络表单的副本,并使用新的电子邮件地址作为收件人。

使用node_load加载节点后,是否可以使用node_save保存它?这会创建一个带有新时间戳和ID的新节点吗?

如何获取已创建的新节点的图片?

Answers:


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对象在包含旧nid的数组中有很多nid密钥,我该怎么办?
2011年

Drupal只需检查一下即可$node->nid。如果这些节点ID都不是已加载节点的ID(需要使用已保存节点的ID进行更改),则可以保留这些节点ID。
kiamlaluno

2
如果您使用的是路径模块,则可能还需要unset($node->path);
Patrick James McDougle 2013年

6

我必须将其发布为答案,因为该系统使您在评论前拥有50个信誉点。

无论如何,响应@koivo和他的回答。我只是想为我补充一下,还取消$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中,您必须同时取消设置节点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


如果原始节点上有任何entityreference字段,则它不会在克隆的节点上保留其值,并且还会为未指定节点类型而引发EntityMalformedException。我正在D7中进行测试。有什么线索吗?
2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.