Meine Hooks werden von Drupal nicht aufgerufen

9

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?

kiamlaluno
quelle
Diese Frage wird als kanonische Frage für Fragen zu Hooks angesehen, die von Drupal nicht aufgerufen werden.
Kiamlaluno

Antworten:

13

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.module example_menu(). Wenn das Modul example_menu.module lautet und die Funktion ist example_menu(), wird dies nicht als hook_menu()Implementierung für example_menu.module betrachtet.
    Dies bedeutet zum Beispiel auch, dass die hook_form_alter()Implementierung in example_form.module nicht ist example_form_alter(), aber example_form_form_alter(). Als weiteres Beispiel ist die Implementierung von hook_form_FORM_ID_alter()done zum Ändern des user_register_form()von example.module zurückgegebenen Formulars nicht example_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()und mymodule_get_value()und $value = myModule_get_value()würde entweder myModule_get_value()oder aufrufen mymodule_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.

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

    Die letzte ausgeführte Zeile drupal_get_schema_versions()ist die folgende.

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

    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 wie mymodule_update_7120()werden nicht berücksichtigt, da der reguläre Ausdruck, der von verwendet drupal_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()und hook_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 returnAnweisung 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.

kiamlaluno
quelle
Vielleicht ist es auch wert, meinen Fehler für andere in Zukunft zu erwähnen: Definieren Sie KEINEN Namespace in Ihrer .module-Datei (oder einer anderen "flachen" PHP-Datei, die keine Klasse ist). Andernfalls erkennt Drupal Ihre Datei nicht und erkennt daher die darin definierten Hooks nicht.
Balu Ertl