Saya mengembangkan modul, tetapi kait yang saya tambahkan tidak dipanggil dari Drupal. Itu terjadi dengan lebih dari satu kait.
Saya membaca dokumentasi untuk kait, dan saya tidak dapat menemukan apa pun yang akan menjelaskan mengapa ini terjadi. Saya memverifikasi saya menggunakan parameter yang benar, dan mengembalikan nilai yang benar.
Apa yang saya lakukan salah? Apakah ada yang saya lewatkan?
Jawaban:
Saat mengembangkan modul, Anda harus mengingat catatan berikut.
Implementasi pengait yang dilakukan dari modul adalah fungsi yang namanya diawali dengan nama pendek modul (juga disebut nama mesin ); dari nama kait, lepas bagian kait , dan ganti dengan nama mesin modul. Misalnya, implementasi yang
hook_menu()
dilakukan dari example.module adalahexample_menu()
. Jika modulnya adalah example_menu.module, dan fungsinya adalahexample_menu()
, itu tidak dianggap sebagaihook_menu()
implementasi untuk example_menu.module.Ini juga berarti, misalnya, bahwa
hook_form_alter()
implementasi di example_form.module tidakexample_form_alter()
, tetapiexample_form_form_alter()
. Sebagai contoh lain, implementasihook_form_FORM_ID_alter()
dilakukan untuk mengubah formulir yang dikembalikanuser_register_form()
dari example.module tidakexample_form_user_register_alter()
, tetapiexample_form_user_register_form_alter()
. (ID formulir adalah user_register_form .)Secara umum, menggunakan karakter huruf besar dalam nama mesin modul tidak menimbulkan masalah: PHP tidak membuat perbedaan antara
myModule_get_value()
, danmymodule_get_value()
, dan$value = myModule_get_value()
akan memanggil salah satumyModule_get_value()
, ataumymodule_get_value()
.Meskipun, ada kasus di mana menggunakan karakter huruf besar dalam nama mesin modul akan menyebabkan masalah: ketika mendefinisikan kait pembaruan untuk modul.
drupal_get_schema_versions()
, fungsi yang mengembalikan daftar pembaruan yang tersedia, berisi kode berikut.Baris terakhir yang dieksekusi
drupal_get_schema_versions()
adalah sebagai berikut.Jika nama modul adalah myModule.module,
drupal_get_schema_versions('myModule')
hanya akan mengembalikan fungsi dengan nama yang dimulai dengan myModule_update, dan diakhiri dengan angka; fungsi sepertimymodule_update_7120()
tidak akan dimasukkan karena ekspresi reguler yang digunakan daridrupal_get_schema_versions()
case sensitive Ini masih berlaku untuk Drupal 8, karena ekspresi reguler masih sama dengan yang digunakan dalam Drupal 7.Beberapa kait disebut pada saat-saat tertentu. Misalnya,,
hook_menu()
danhook_menu_alter()
dipanggil dari Drupal 7 setelah modul diaktifkan / dinonaktifkan, atau ketika cache untuk informasi router dihapus;hook_init()
tidak dipanggil untuk halaman yang di-cache.Setelah kait dipanggil karena peristiwa tertentu terjadi, mereka tidak akan menelepon lagi sampai peristiwa serupa tidak terjadi. Mereka tidak dipanggil dalam dua permintaan halaman berturut-turut.
Drupal menyimpan daftar kait yang diimplementasikan dari modul. Jika Anda mengedit kode modul yang diaktifkan untuk menambahkan kait baru, Anda harus terlebih dahulu menonaktifkan dan mengaktifkan kembali modul, atau Drupal tidak akan melihat ada kait baru.
Pastikan bahwa
return
pernyataan tidak menyelinap masuk ke salah satu fungsi hook Anda selama refactoring. Ini memiliki potensi untuk memecahkan tidak hanya kait yang muncul, tetapi juga menyebabkan reaksi berantai yang merusak kait lainnya, membuat masalah sulit ditemukan.sumber