Tôi chắc chắn sẽ đi cho field_attach_update
.
Ý tưởng rất đơn giản. Chỉ cần tải nút và lưu nó bằng cách sử dụng field_attach_update.
Vd
$node = node_load($nid);
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Điều này sẽ không thay đổi bất kỳ dấu thời gian hoặc bất kỳ hook nào khác mà node_save thường gọi. Tải nút cũng sẽ gọi một số hook nên có thể nó không hiệu quả.
Nếu bạn có nid và nếu cấu trúc nút bị chết đơn giản, bạn cũng có thể làm điều đó như thế này:
$node = new stdClass();
$node->nid = $nid; // Enter the nid taken. Make sure it exists.
$node->type = 'article';
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Dù sao, nếu bạn đang cố gắng cập nhật bất cứ điều gì ngoài các trường, điều này sẽ không hoạt động (trạng thái bình luận, trạng thái được xuất bản, v.v.). Ngoài ra Nếu bạn đang sử dụng node_save, bộ đệm cho nút cụ thể sẽ tự động bị xóa đối với các phương thức khác nhau, chúng tôi cần xóa nó bằng 'entity_get_controll'.
Cập nhật:
Dường như bạn cũng nên gọi field_attach_presave()
để cho các mô-đun khác xử lý trường nhập đúng cách. Ví dụ, mô-đun tệp sử dụng nó để đặt trạng thái tệp thành vĩnh viễn bằng cách sử dụng móc này. Tôi đã cập nhật 2 ví dụ của tôi ở trên.
field_attach_update
?