it-swarm.com.de

Meine Hooks werden nicht von Drupal

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?

9
kiamlaluno

Beachten Sie bei der Entwicklung eines Moduls die folgenden Hinweise.

  • Die Implementierung eines Hooks aus einem Modul ist eine Funktion, deren Name dem Modulkurznamen vorangestellt ist (auch als Maschinenname bezeichnet). Nehmen Sie vom Hook-Namen den Hook-Teil ab und ersetzen Sie ihn durch den Namen der Modulmaschine. Zum Beispiel ist die Implementierung von hook_menu() aus example.module example_menu(). Wenn das Modul example_menu.module lautet und die Funktion example_menu() lautet, wird dies nicht als hook_menu() - Implementierung für example_menu.module betrachtet.
    Dies bedeutet beispielsweise auch, dass die Implementierung hook_form_alter() in example_form.module nicht example_form_alter(), sondern example_form_form_alter() ist. Als weiteres Beispiel ist die Implementierung von hook_form_FORM_ID_alter() zum Ändern des von user_register_form() von example.module zurückgegebenen Formulars nicht example_form_user_register_alter(), aber example_form_user_register_form_alter(). (Die Formular-ID lautet user_register_form .)

  • Im Allgemeinen verursacht die Verwendung von Großbuchstaben im Modulcomputernamen keine Probleme: PHP macht keinen Unterschied zwischen myModule_get_value() und mymodule_get_value() und $value = myModule_get_value() würde entweder myModule_get_value() oder mymodule_get_value() aufrufen.
    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 verfügbarer 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 von drupal_get_schema_versions() ausgeführte Zeile ist die folgende.

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

    Wenn der Modulname myModule.module lautet, gibt drupal_get_schema_versions('myModule') nur die Funktionen mit einem Namen zurück, der mit myModule_update beginnt und mit einer Zahl endet. Funktionen wie mymodule_update_7120() werden nicht berücksichtigt, da der reguläre Ausdruck von drupal_get_schema_versions() 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 werden hook_menu() und hook_menu_alter() von Drupal 7 nach einem Modul aufgerufen) aktiviert/deaktiviert oder wenn der Cache für die Router-Informationen gelöscht wird; hook_init() wird für zwischengespeicherte Seiten nicht aufgerufen.
    Sobald die Hooks aufgerufen wurden, 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, oder Drupal bemerkt nicht, dass es neue Hooks gibt.

  • 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.

13
kiamlaluno