Tại sao entity_metadata_wrapper-> save () không cập nhật sửa đổi của nút?


8

Tôi đang phát triển một mô-đun để cập nhật các nút (cho phép sửa đổi). Có vẻ như thế này.

 $nodes = node_load_multiple(array(), array('type' => $bundleType));
 foreach ($ndoes as $node){
    $w = entity_metadata_wrapper('node',$node);
    $w->MyFields->set($someValue);
    $w->save();
 }

Nó đặt các trường chính xác nhưng id sửa đổi của nút không thay đổi sau đó $w->save().

Làm cách nào để cập nhật ID sửa đổi?


create new revisioncờ được đặt trên nút cho loại nội dung? Bạn đã thử như thế $w->revision->set(1);trước khi tiết kiệm? ....
tenken

Có, "tạo bản sửa đổi mới" được bật. Tôi không biết nhiều về việc $w->revision->set(1)đó có phải là một cách thủ công để cho drupal biết rằng nút đã được cập nhật? Tôi sẽ thử nó.
zhuchun

hmm, $w->revision->set()làm việc Có vẻ như tôi hiểu lầm $w->save(). Tôi nghĩ rằng nó sẽ tăng tự động sửa đổi id trong khi lưu. Có cách nào để có được bản sửa đổi tăng tiếp theo không? Cảm ơn bạn
zhuchun

không, revision->set(1)yêu cầu nút ghi lại bản sửa đổi mới trong lần chỉnh sửa sắp tới / hiện tại của nút. Tôi không chắc tại sao trình bao bọc siêu dữ liệu không nhìn thấy cài đặt toàn cầu tạo bản sửa đổi mới ..... nhưng đặt cờ sửa đổi là một cách giải quyết rất đơn giản như bạn đã thấy bây giờ. Tôi đã cung cấp nhận xét của mình dưới dạng câu trả lời bên dưới nếu bạn quan tâm nâng cao nhận xét đó để giúp những người dùng khác trong tương lai tìm được câu trả lời chính xác.
tenken

Câu trả lời:


6

Là cờ tạo sửa đổi mới được đặt trên nút cho loại nội dung? Bạn đã thử như $ w-> sửa đổi-> set (1); trước khi tiết kiệm? ....

BIÊN TẬP:

Tác giả nói rằng thiết lập $w->revision->set(1)giải quyết vấn đề của mình.


Đó là một cách giải quyết dễ dàng! Chỉ không hiểu tại sao nó cần lol. Cảm ơn bạn!
zhuchun

10

Khi bạn chỉnh sửa một nút thông qua UI, nó được thực hiện thông qua node_form(). Điều này có một cuộc gọi gần đầu đến node_object_prepare(), thiết lập các giá trị mặc định cho nút đó. Điều này bao gồm thiết lập giá trị mặc định của $node->revision, được sử dụng node_save()để xác định xem có cần sửa đổi mới hay không.

API thực thể là nhận thức sửa đổi, nhưng node_object_prepare()là một điều cụ thể của nút. Điều này có nghĩa là bạn cần tự quản lý các giá trị, bao gồm đặt thuộc tính sửa đổi để bắt chước những gì biểu mẫu chỉnh sửa nút sẽ làm.


7

Không có câu trả lời nào trong số này thực sự đúng, làm ->set(1)cho nó có vẻ như bạn thực sự thay đổi số sửa đổi và do đó nên tăng nó.

Đây thực sự chỉ là một cờ boolean nên câu trả lời đúng là $node->revision->set(true);

Như zhuchun nói: anh ta không hiểu tại sao cần thiết, khi được giải thích là cờ boolean, nó có ý nghĩa hoàn hảo hơn là số.


Đã có lúc tạo ra nội dung drupal mới liên quan đến việc gọi điện dễ dàng nhất drupal_submit_formchẳng hạn. Nếu bạn kiểm tra các giá trị POST cho biểu mẫu gửi nút, bạn sẽ thấy những thứ như revision = 1trong các trường POST vì create new revisionhộp mục biểu mẫu đã được chọn. Vì 1 == TRUEmã hoạt động một trong hai cách. Nhưng, quan điểm của bạn là hợp lệ.
tenken

câu trả lời này nên được chấp nhận
Alex Skrypnyk


0

Nếu loại nút không có sửa đổi được bật theo mặc định, cách ngắn gọn nhất để yêu cầu sửa đổi mới là:

$w->revision = TRUE;

hoàn toàn giống với việc sử dụng:

$w->revision->set(TRUE);

nhưng với yêu cầu gõ ít hơn.

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.