Kait apa yang dapat saya gunakan untuk tindakan pasca-simpan?


16

Saya telah menemukan beberapa posting dengan pertanyaan yang sama, tetapi jawabannya selalu berbeda dengan beberapa topik lain atau tidak sesuai dengan kebutuhan saya.

Setelah sebuah node disimpan, saya ingin modul khusus saya untuk memasukkan baris ke salah satu tabel kustom saya yang berisi nid dari node baru. Ketika hook_node_submitdipanggil, nid belum ada. hook_node_insertmemang memiliki nid, tetapi hanya dipanggil pertama kali node disimpan, tapi saya berpotensi perlu mengambil tindakan setiap kali node disimpan.

Rencana saya adalah untuk memisahkan fungsionalitas saya ke dalam metodenya sendiri dan menerapkan kedua kait, tetapi saya mencoba belajar melakukan hal-hal dengan benar dengan Drupal dan jadi saya bertanya-tanya apakah ada kait yang benar-benar cocok dengan persyaratan saya.

Apakah ada kait yang disebut setiap kali simpul disimpan dan disebut SETELAH simpan selesai?


3
Anda dapat menggunakan kombinasi dari hook_node_insertdan hook_node_update(bertindak setiap kali node disimpan).
AjitS

Ya, saya jelaskan di posting di atas.
Kenny Wyland

@ KennyWyland yang Anda sebutkan hook_node_submittetapi tidak hook_node_update?
David Thomas

Anda akan mendapatkan simpul nid di hook_node_insertdan juga di hook_node_update.
Sumit Madan

2
hook_node_insert()dan hook_node_update()kait yang benar untuk ini, hook_node_submit()dipanggil selama proses pengiriman formulir sebelum node disimpan. Jangan lupa Anda harus menghapus cache kapan saja Anda menambah / menghapus hook
Clive

Jawaban:


5

Melihat komentar pada pertanyaan, sepertinya solusi yang jelas adalah dengan menggunakan kait hook_node_insert()dan hook_node_update().

Saya sebenarnya hanya melakukan sesuatu yang sangat mirip seperti yang dijelaskan dalam jawaban: Saya menulis sebuah fungsi yang melakukan apa yang ingin saya lakukan setiap kali sebuah node dibuat / diperbarui dan kemudian memanggilnya dari masing-masing kait itu. Ini bekerja dengan baik.


Itu keren! Anda bahkan dapat melakukan ini dari hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx Kelemahan dalam metode itu hanya akan dipanggil ketika sebuah node dimasukkan / diperbarui melalui formulir tertentu. Dalam kasus saya, saya perlu menangkap semua penambahan dan modifikasi node.
donat

12

Cara yang benar untuk melakukan ini adalah dengan menghormati transaksi db Drupal. Jika Anda ingin melakukan tindakan basis data di hook_node_insert, Anda harus mempertimbangkan bahwa simpul tersebut belum disimpan. yang berarti jika gagal dan dibatalkan Anda berakhir dengan data yatim di database Anda. Jadi Drupal database API harus digunakan dan bukan eksekusi permintaan langsung.

Jika Anda ingin memperbarui node itu sendiri di hook_node_insert, Anda tidak bisa karena itu tidak mungkin untuk menggunakan node_save karena node belum disimpan dalam database dan memanggilnya menyebabkan pengecualian. Salah satu solusinya adalah dengan menggunakan fungsi register_shutdown_function dan melewatkan nid, Anda dapat menggunakan node_load untuk memastikan bahwa itu benar-benar disimpan dan kemudian melakukan tindakan lain yang Anda inginkan pada node baru.

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

UPDATE: Anda juga dapat menemukan alternatif yang lebih mudah di sini /programming//a/24035797/1726778


1
Ide bagus. Padahal lebih baik digunakan drupal_register_shutdown_function(). Namun ketahuilah bahwa keduanya tampaknya memiliki masalah di lingkungan php-fpm, lihat drupal.stackexchange.com/q/102603/10667
Shevchuk

Saya mengalami kesulitan memeriksa apakah suatu simpul bertindak sebagai Grup Organik og_is_group. Saya pikir saya mendapatkan negatif palsu karena alasan ini.
icicleking

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.