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_submit
dipanggil, nid belum ada. hook_node_insert
memang 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?
hook_node_insert
danhook_node_update
(bertindak setiap kali node disimpan).hook_node_submit
tetapi tidakhook_node_update
?hook_node_insert
dan juga dihook_node_update
.hook_node_insert()
danhook_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 hookJawaban:
Melihat komentar pada pertanyaan, sepertinya solusi yang jelas adalah dengan menggunakan kait
hook_node_insert()
danhook_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.
sumber
hook_form_alter()
. drupal.stackexchange.com/a/221041/15055Cara 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.
UPDATE: Anda juga dapat menemukan alternatif yang lebih mudah di sini /programming//a/24035797/1726778
sumber
drupal_register_shutdown_function()
. Namun ketahuilah bahwa keduanya tampaknya memiliki masalah di lingkungan php-fpm, lihat drupal.stackexchange.com/q/102603/10667og_is_group
. Saya pikir saya mendapatkan negatif palsu karena alasan ini.Ada modul drupal baru, Hook Post Action , yang menambahkan post save hooks. Mari kita coba untuk melihat apakah itu berhasil.
sumber