web-dev-qa-db-ja.com

どのようにdrupal異なるモジュールで同じフックの実行順序を決定しますか?

2つのモジュールAとBがあり、両方に同じuser_loginフックがある場合。それで、私がログインすると、最初に呼び出したA_user_login()およびB_user_login()関数から、そしてdrupalこれら2つの関数の実行順序を決定する方法

22
GiLL

フックは次の順序で呼び出されます

  1. 重み。データベースのモジュールごとに{system.weight}として定義されています。重みが低いほど、呼び出しプロセスの早い段階で来ます。
  2. モジュール名のアルファベット順。

デフォルトでは、モジュールには0の重みが割り当てられるため、システム内のほぼすべてのフックがアルファベット順に実行されます。一部のモジュールは、インストールフックでこれを調整して、 module_invoke_all 関数の前後で実行されるようにします。

参照: モジュールの重みの調整:リスクと注意すべき点は何ですか?

31
mpdonadio

デフォルトでは、モジュールの重みは、hook_ *関数を実行するための行の場所を定義します。

hook_module_implements_alter を使用して、実装モジュールのデフォルトの順序を変更できます。小さな例は、この ブログチュートリアル をさらに読むとわかります。

そのブログ投稿からの実装例は次のとおりです。

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;
 }
}
11
tenken