it-swarm-vi.com

Làm thế nào để lập trình nhân đôi một nút?

Tôi đang tìm cách tạo một bản sao của một biểu mẫu web tôi đã tạo, với một địa chỉ email mới là người nhận.

Sau khi tôi tải nút bằng node_load, tôi có thể lưu nó bằng node_save không? Điều đó sẽ tạo ra một nút mới với dấu thời gian và id mới?

Làm thế nào tôi có thể nhận được nid của nút mới đã được tạo?

11
Arosboro

Chỉ cần hủy đặt ID nút bằng unset($node->nid)node_save () sẽ tạo một nút mới.

Mã được thực thi từ node_save() là mã sau:

// 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';
}    

Đối số cuối cùng của drupal_write_record () không được thông qua; điều này có nghĩa là hàm sẽ không cập nhật một hàng cơ sở dữ liệu hiện có.

Khi đối tượng nút đã được lưu với node_save(), $node->nid Chứa ID nút cho hàng cơ sở dữ liệu mới được tạo.

17
kiamlaluno

Tôi đã phải đăng bài này như một câu trả lời vì hệ thống khiến bạn có 50 điểm danh tiếng trước khi bạn có thể bình luận.

Dù sao, để đáp lại @koivo và câu trả lời của anh ấy. Tôi chỉ muốn thêm nó cho tôi, cũng bỏ đặt $node->vid đã lừa Vì vậy, mã của tôi để bỏ đặt và lưu là

// 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);
6
Jorge Calderon

Hãy thử sao chép mô-đun .
[.___.] Tôi cần dễ dàng sao chép và thay đổi mọi thứ trên một trang web tôi đã làm gần đây và thấy mô-đun này hoạt động tốt.
[.___.] Kiểm tra tệp sao chép.api.php để xem cách dễ dàng sử dụng.

2
2pha

Trong D7, bạn phải bỏ đặt nút id unset($node->nid) và id sửa đổi unset($node->vid) cả hai. Tôi xây dựng một biểu mẫu để sao chép các nút của một loại (sản phẩm) nhất định có một tham chiếu thuật ngữ nhất định (thay thế id thuật ngữ đó). Đây là bài nộp cuối cùng:

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);
    }   
}

Bạn có thể cân nhắc để lưu lại dấu thời gian und $node->uid cũng.

2
leymannx