Moje haki nie są wywoływane przez Drupala

9

Pracuję nad modułem, ale dodawane przeze mnie haki nie są wywoływane z Drupala. Zdarza się to z więcej niż jednym hakiem.

Przeczytałem dokumentację dotyczącą haków i nie mogę znaleźć niczego, co wyjaśniałoby, dlaczego tak się dzieje. Potwierdziłem, że używam poprawnych parametrów i zwracam poprawną wartość.

Co ja robię źle? Czy czegoś mi brakuje?

kiamlaluno
źródło
To pytanie jest uważane za kanoniczne dla tych pytań o haki, które nie są wywoływane przez Drupala.
kiamlaluno

Odpowiedzi:

13

Opracowując moduł, należy pamiętać o następujących uwagach.

  • Implementacja haka wykonanego z modułu jest funkcją, której nazwa poprzedzona jest krótką nazwą modułu (zwaną także nazwą maszyny ); z nazwy haka zdejmij część haczyka i zastąp ją nazwą maszyny modułu. Na przykład implementacja hook_menu()zrobiona z example.module to example_menu(). Jeśli moduł to przykład_menu.moduł, a funkcja jest example_menu()taka, że ​​nie jest to uważane za hook_menu()implementację dla przykład_menu.modułu.
    Oznacza to również, na przykład, że hook_form_alter()implementacja w example_form.module nie jest example_form_alter(), ale example_form_form_alter(). Jako kolejny przykład implementacja hook_form_FORM_ID_alter()zrobiona w celu zmiany formularza zwróconego user_register_form()z example.module nie jest example_form_user_register_alter(), aleexample_form_user_register_form_alter(). (Identyfikator formularza to user_register_form .)

  • Ogólnie rzecz biorąc, używanie wielkich liter w nazwie maszyny modułu nie stwarza problemów: PHP nie robi różnic między myModule_get_value(), i mymodule_get_value(), i $value = myModule_get_value()wywołałby albo myModule_get_value(), albo mymodule_get_value().
    Chociaż zdarza się, że użycie wielkich liter w nazwie komputera modułu może powodować problemy: podczas definiowania przechwytywania aktualizacji dla modułu. drupal_get_schema_versions(), funkcja, która zwraca listę dostępnych aktualizacji, zawiera następujący kod.

    // 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'];
      }
    }
    

    Ostatni wykonany wiersz drupal_get_schema_versions()jest następujący.

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

    Jeśli nazwa modułu to myModule.module, drupal_get_schema_versions('myModule')zwróci tylko funkcje o nazwie zaczynającej się od myModule_update i kończącej się liczbą; funkcje takie jak mymodule_update_7120()nie zostaną uwzględnione, ponieważ w wyrażeniu regularnym używanym z drupal_get_schema_versions()rozróżniana jest wielkość liter. To nadal dotyczy Drupala 8, ponieważ wyrażenie regularne jest nadal takie samo, jak w Drupalu 7.

  • Niektóre haki są wywoływane w określonych momentach. Na przykład, hook_menu()i hook_menu_alter()są wywoływane z Drupala 7 po włączeniu / wyłączeniu modułu lub po wyczyszczeniu pamięci podręcznej informacji o routerze; hook_init()nie jest wywoływany dla stron z pamięci podręcznej.
    Po wywołaniu przechwytywania, ponieważ wydarzyło się określone zdarzenie, nie będą ponownie wywoływane, dopóki podobne zdarzenie nie nastąpi. Nie są wywoływane w dwóch kolejnych żądaniach strony.

  • Drupal buforuje listę haków zaimplementowanych z modułu. Jeśli edytujesz kod włączonego modułu, aby dodać nowe zaczepy, najpierw musisz je wyłączyć i ponownie włączyć, w przeciwnym razie Drupal nie zauważy, że są nowe zaczepy.

  • Upewnij się, że returninstrukcja nie zakradła się do jednej z funkcji przechwytujących podczas refaktoryzacji. Może potencjalnie złamać nie tylko haczyk, w którym się pojawia, ale również wywołać reakcję łańcuchową, która łamie także inne haki, co utrudnia zlokalizowanie problemu.

kiamlaluno
źródło
Warto również wspomnieć o moim błędzie dla innych w przyszłości: NIE definiuj przestrzeni nazw w swoim pliku .module (lub innym „płaskim”, nieklasycznym PHP). W przeciwnym razie Drupal nie rozpozna twojego pliku, dlatego nie odkryje zdefiniowanych w nim haków.
Balu Ertl