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?
Odpowiedzi:
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 toexample_menu()
. Jeśli moduł to przykład_menu.moduł, a funkcja jestexample_menu()
taka, że nie jest to uważane zahook_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 jestexample_form_alter()
, aleexample_form_form_alter()
. Jako kolejny przykład implementacjahook_form_FORM_ID_alter()
zrobiona w celu zmiany formularza zwróconegouser_register_form()
z example.module nie jestexample_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()
, imymodule_get_value()
, i$value = myModule_get_value()
wywołałby albomyModule_get_value()
, albomymodule_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.Ostatni wykonany wiersz
drupal_get_schema_versions()
jest następujący.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 jakmymodule_update_7120()
nie zostaną uwzględnione, ponieważ w wyrażeniu regularnym używanym zdrupal_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()
ihook_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
return
instrukcja 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.źródło