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


22

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

回答:


31

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

  1. データベース内のモジュールごとにとして定義される重み{system.weight}。より低い重みは、呼び出しプロセスの初期になります。
  2. モジュール名によるアルファベット順。

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

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


3
D7に注意してくださいhook_module_implements_alter()
アンディ14

11

デフォルトでは、モジュールの重みは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;
 }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.