Tôi có thể sử dụng hook nào cho các hành động lưu sau?


16

Tôi đã tìm thấy một số bài đăng có cùng câu hỏi này, nhưng câu trả lời luôn chuyển sang một số chủ đề khác hoặc chúng không hoạt động cho nhu cầu của tôi.

Sau khi một nút được lưu, tôi muốn mô-đun tùy chỉnh của mình chèn một hàng vào một trong các bảng tùy chỉnh có chứa nid của nút mới. Khi hook_node_submitđược gọi, nid chưa tồn tại. hook_node_insertkhông có nid, nhưng chỉ được gọi lần đầu tiên khi nút được lưu, nhưng tôi có khả năng cần phải thực hiện hành động mỗi khi nút được lưu.

Kế hoạch của tôi là tách chức năng của tôi thành phương pháp riêng và thực hiện cả hai hook, nhưng tôi đang cố gắng học cách làm mọi thứ đúng với Drupal và vì vậy tôi tự hỏi liệu có một hook thực sự phù hợp với yêu cầu của tôi không.

Có một hook được gọi mỗi khi một nút được lưu và được gọi là SAU khi lưu xong?


3
bạn có thể sử dụng kết hợp hook_node_inserthook_node_update(hành động mỗi khi một nút đang được lưu).
AjitS

Vâng, tôi đã mô tả rằng trong bài viết trên.
Kenny Wyland

@KennyWyland bạn có đề cập hook_node_submitnhưng không hook_node_update?
David Thomas

Bạn sẽ nhận được nút nid hook_node_insertcũng như trong hook_node_update.
Sumit Madan

2
hook_node_insert()hook_node_update()là các móc chính xác cho điều này, hook_node_submit()được gọi trong quá trình gửi biểu mẫu trước khi nút được lưu. Đừng quên bạn cần xóa bộ nhớ cache bất cứ khi nào bạn thêm / xóa hook
Clive

Câu trả lời:


5

Nhìn vào các ý kiến ​​về câu hỏi, có vẻ như giải pháp rõ ràng là sử dụng móc hook_node_insert()hook_node_update().

Tôi thực sự đã làm một cái gì đó rất giống như được mô tả trong câu trả lời: Tôi đã viết một hàm thực hiện những gì tôi muốn được thực hiện mỗi khi một nút được tạo / cập nhật và sau đó gọi nó từ mỗi hook đó. Nó hoạt động tốt.


Thật tuyệt! Bạn thậm chí có thể làm điều này từ hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx Nhược điểm trong phương thức đó là nó sẽ chỉ được gọi khi một nút được chèn / cập nhật thông qua một hình thức cụ thể. Trong trường hợp của tôi, tôi cần phải bắt tất cả các bổ sung và sửa đổi các nút.
bánh rán

12

Cách chính xác để làm điều này là tôn trọng giao dịch db của Drupal. Nếu bạn muốn thực hiện bất kỳ hành động cơ sở dữ liệu nào trong hook_node_insert, bạn phải xem xét rằng nút này chưa thực sự được lưu. có nghĩa là nếu nó thất bại và khôi phục bạn kết thúc với dữ liệu mồ côi trong cơ sở dữ liệu của bạn. Vì vậy, API cơ sở dữ liệu Drupal nên được sử dụng và không thực hiện truy vấn trực tiếp.

Nếu bạn muốn cập nhật chính nút đó trong hook_node_insert, bạn không thể sử dụng node_save vì nút này chưa được lưu trong cơ sở dữ liệu và gọi nó là nguyên nhân ngoại lệ. Một giải pháp là sử dụng hàm register_shutdown_function và truyền nid, bạn có thể sử dụng node_load để đảm bảo rằng nó thực sự được lưu và sau đó thực hiện bất kỳ hành động nào bạn có thể muốn trên nút mới.

function your_module_node_update($node){
  if($node->type == 'your_node'){
    register_shutdown_function('_your_module_post_insert',$node->nid);
  }
}

function _your_module_post_insert($nid) {
  $node = node_load($nid);
  if ($node) {
      node_save($node);
  }
} 

CẬP NHẬT: Bạn cũng có thể tìm thấy một sự thay thế dễ dàng hơn ở đây /programming//a/24035797/1726778


1
Ý tưởng tốt. Mặc dù nó tốt hơn để sử dụng drupal_register_shutdown_function(). Nhưng hãy lưu ý rằng cả hai dường như có vấn đề trong môi trường php-fpm, xem drupal.stackexchange.com/q/102603/10667
Shevchuk

Tôi đã gặp khó khăn khi kiểm tra nếu một nút hoạt động như một nhóm hữu cơ og_is_group. Tôi nghĩ rằng tôi đã nhận được tiêu cực sai vì lý do này.
icicleking

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.