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


11

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?

Câu trả lời:


17

Chỉ cần hủy đặt ID nút với 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 đây:

// 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->nidchứa ID nút cho hàng cơ sở dữ liệu mới được tạo.


Đối tượng webform của nút có rất nhiều khóa nid trong mảng chứa nid cũ, tôi nên làm gì với chúng?
Arosboro

Drupal chỉ cần kiểm tra $node->nid. Nếu không có ID nút nào trong số đó là ID của nút được tải, cần phải thay đổi bằng ID của nút đã lưu, thì bạn có thể để các ID nút đó như hiện tại.
kiamlaluno

2
Nếu bạn đang sử dụng mô-đun đường dẫn, bạn cũng có thể muốnunset($node->path);
Patrick James McDougle

6

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ỏ cài $node->vidđặt thủ thuật. 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);

2

Trong D7, bạn phải bỏ đặt cả id nút unset($node->nid)và id sửa đổi unset($node->vid). 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ũng có thể cân nhắc để lưu lại dấu thời gian $node->uid.


Nếu có bất kỳ trường thực thể nào trên nút gốc thì nó sẽ không giữ lại giá trị của nó trên nút nhân bản và cũng có thể nhận ra kiểu thực thể được nêu ra vì không chỉ định loại nút. Tôi đang thử nghiệm trong D7. có manh mối nào không?
kiranking

2

Hãy thử mô-đun nhân rộng .
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 Replicate.api.php để xem nó dễ sử dụng như thế nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.