Ich entwickle ein Modul, aber die Hooks, die ich hinzufüge, werden nicht von Drupal aufgerufen. Es passiert mit mehr als einem Haken.
Ich habe die Dokumentation zu den Haken gelesen und kann nichts finden, was erklären könnte, warum dies passiert. Ich habe überprüft, ob ich die richtigen Parameter verwende und den richtigen Wert zurückgebe.
Was mache ich falsch? Fehlt mir etwas?
Antworten:
Beachten Sie bei der Entwicklung eines Moduls die folgenden Hinweise.
Die Implementierung eines Hooks aus einem Modul ist eine Funktion, deren Name dem Modul-Kurznamen (auch als Maschinenname bezeichnet ) vorangestellt ist . Nehmen Sie vom Hakennamen das Hakenteil ab und ersetzen Sie es durch den Modulmaschinennamen. Zum Beispiel ist die Implementierung von
hook_menu()
done from example.moduleexample_menu()
. Wenn das Modul example_menu.module lautet und die Funktion istexample_menu()
, wird dies nicht alshook_menu()
Implementierung für example_menu.module betrachtet.Dies bedeutet zum Beispiel auch, dass die
hook_form_alter()
Implementierung in example_form.module nicht istexample_form_alter()
, aberexample_form_form_alter()
. Als weiteres Beispiel ist die Implementierung vonhook_form_FORM_ID_alter()
done zum Ändern desuser_register_form()
von example.module zurückgegebenen Formulars nichtexample_form_user_register_alter()
, aberexample_form_user_register_form_alter()
. (Die Formular-ID lautet user_register_form .)Im Allgemeinen führt die Verwendung von Großbuchstaben im Computernamen des Moduls nicht zu Problemen: PHP macht keine Unterschiede zwischen
myModule_get_value()
undmymodule_get_value()
und$value = myModule_get_value()
würde entwedermyModule_get_value()
oder aufrufenmymodule_get_value()
.Es gibt jedoch einen Fall, in dem die Verwendung von Großbuchstaben in einem Modulcomputernamen Probleme verursachen würde: beim Definieren der Aktualisierungs-Hooks für ein Modul.
drupal_get_schema_versions()
Die Funktion, die eine Liste der verfügbaren Updates zurückgibt, enthält den folgenden Code.Die letzte ausgeführte Zeile
drupal_get_schema_versions()
ist die folgende.Wenn der Modulname myModule.module lautet,
drupal_get_schema_versions('myModule')
werden nur die Funktionen mit einem Namen zurückgegeben, der mit myModule_update beginnt und mit einer Zahl endet. Funktionen wiemymodule_update_7120()
werden nicht berücksichtigt, da der reguläre Ausdruck, der von verwendetdrupal_get_schema_versions()
wird, zwischen Groß- und Kleinschreibung unterscheidet. Dies gilt weiterhin für Drupal 8, da der reguläre Ausdruck immer noch der gleiche ist, der in Drupal 7 verwendet wird.Einige Haken werden in bestimmten Momenten aufgerufen. Zum Beispiel
hook_menu()
undhook_menu_alter()
werden von Drupal 7 aufgerufen, nachdem ein Modul aktiviert / deaktiviert wurde oder wenn der Cache für die Router-Informationen geleert wird.hook_init()
wird nicht für zwischengespeicherte Seiten aufgerufen.Sobald die Hooks aufgerufen werden, weil ein bestimmtes Ereignis aufgetreten ist, werden sie erst wieder aufgerufen, wenn ein ähnliches Ereignis nicht eintritt. Sie werden nicht in zwei aufeinander folgenden Seitenanforderungen aufgerufen.
Drupal speichert die Liste der von einem Modul implementierten Hooks zwischen. Wenn Sie den Code eines aktivierten Moduls bearbeiten, um neue Hooks hinzuzufügen, müssen Sie zuerst das Modul deaktivieren und erneut aktivieren. Andernfalls bemerkt Drupal nicht, dass neue Hooks vorhanden sind.
Stellen Sie sicher, dass sich eine
return
Anweisung während eines Refactorings nicht in eine Ihrer Hook-Funktionen eingeschlichen hat. Es kann nicht nur den Haken brechen, in dem es vorkommt, sondern auch eine Kettenreaktion auslösen, die auch andere Haken bricht, wodurch das Problem schwer zu lokalisieren ist.quelle