Kait saya tidak dipanggil oleh Drupal

9

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?

kiamlaluno
sumber
Pertanyaan ini dianggap sebagai pertanyaan kanonik untuk pertanyaan-pertanyaan tentang kait yang tidak dipanggil oleh Drupal.
kiamlaluno

Jawaban:

13

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 adalah example_menu(). Jika modulnya adalah example_menu.module, dan fungsinya adalah example_menu(), itu tidak dianggap sebagai hook_menu()implementasi untuk example_menu.module.
    Ini juga berarti, misalnya, bahwa hook_form_alter()implementasi di example_form.module tidak example_form_alter(), tetapi example_form_form_alter(). Sebagai contoh lain, implementasi hook_form_FORM_ID_alter()dilakukan untuk mengubah formulir yang dikembalikan user_register_form()dari example.module tidak example_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(), dan mymodule_get_value(), dan $value = myModule_get_value()akan memanggil salah satu myModule_get_value(), atau mymodule_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.

    // Prepare regular expression to match all possible defined hook_update_N().
    $regexp = '/^(?P<module>.+)_update_(?P<version>\d+)$/';
    $functions = get_defined_functions();
    // Narrow this down to functions ending with an integer, since all
    // hook_update_N() functions end this way, and there are other
    // possible functions which match '_update_'. We use preg_grep() here
    // instead of foreaching through all defined functions, since the loop
    // through all PHP functions can take significant page execution time
    // and this function is called on every administrative page via
    // system_requirements().
    foreach (preg_grep('/_\d+$/', $functions['user']) as $function) {
      // If this function is a module update function, add it to the list of
      // module updates.
      if (preg_match($regexp, $function, $matches)) {
        $updates[$matches['module']][] = $matches['version'];
      }
    }

    Baris terakhir yang dieksekusi drupal_get_schema_versions()adalah sebagai berikut.

    return empty($updates[$module]) ? FALSE : $updates[$module];

    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 seperti mymodule_update_7120()tidak akan dimasukkan karena ekspresi reguler yang digunakan dari drupal_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()dan hook_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 returnpernyataan 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.

kiamlaluno
sumber
Mungkin juga layak untuk menyebutkan kesalahan saya demi orang lain di masa depan: JANGAN mendefinisikan ruang nama dalam file .module Anda (atau "flat", PHP non-kelas lainnya). Kalau tidak, Drupal tidak akan mengenali file Anda, karena itu tidak akan menemukan kait yang ditentukan di dalamnya.
Balu Ertl