Wie entscheidet Drupal über die Ausführungsreihenfolge desselben Hooks in verschiedenen Modulen?

22

Wenn es zwei Module A und B gibt und beide den gleichen user_login-Hook haben. Also, wenn ich mich aus der A_user_login () - und der B_user_login () -Funktion auslogge, welche zuerst aufgerufen wurde, und wie Drupal die Ausführungsreihenfolge dieser beiden Funktionen bestimmt

Kieme
quelle

Antworten:

31

Hooks werden in der Reihenfolge von aufgerufen

  1. Gewicht, das pro Modul in der Datenbank definiert ist als {system.weight}. Niedrigere Gewichte treten früher beim Aufruf auf.
  2. Alphabetisch nach Modulnamen.

Standardmäßig wird Modulen eine Gewichtung von 0 zugewiesen, sodass fast alle Hooks im System in alphabetischer Reihenfolge ausgeführt werden. Einige Module passen dies in ihren Installations-Hooks an, damit sie früher oder später in der module_invoke_allFunktion ausgeführt werden.

Siehe auch: Anpassen des Modulgewichts: Auf welche Risiken und Dinge ist zu achten?

mpdonadio
quelle
3
Beachten Sie in D7 gibt es hook_module_implements_alter().
Andy
11

Standardmäßig definiert ein Modulgewicht seinen Platz in der Zeile, um eine hook_ * -Funktion auszuführen.

Sie können die Standardreihenfolge der implementierenden Module mit hook_module_implements_alter ändern . Ein kleines Beispiel finden Sie in der weiteren Lektüre dieses Blog-Tutorials .

Von diesem Blog-Eintrag aus ist eine Beispielimplementierung:

function mymodule_module_implements_alter(&$module_list, $context){
 if($context === "node_insert"){
 $temp = $module_list['mymodule'];
 // Removing the mymodule key/value
 unset($module_list['mymodule']);
 // Adding the mymodule key value as the last member in the list
 $module_list['mymodule'] = $temp;
 }
}
tenken
quelle