web-dev-qa-db-ja.com

異なるモジュールによるフック実装が呼び出される順序を変更できますか?

D6では、contribモジュールを使用していますが、その動作の少しをオーバーライドしたいと思います。そのためのカスタムモジュールがありますが、関連するフックの実装がcontribモジュールの実装の前に呼び出されるため、contribモジュールのバージョンが「優先」されます。

それを変更し、最後に自分のフックを強制的に呼び出す方法はありますか?

具体的な詳細は次のとおりです。

未登録ユーザーのデフォルトの「匿名」ユーザー名をコメントフォームから削除したいと思います。 form_alterフックを実装し、名前フィールドからデフォルト値を削除する小さなカスタムモジュールTweak_comment_formを作成しました( これに関する以前の質問への回答を参照してください )。

ただし、form-alterも実装する RealName というcontribモジュールも使用します。 RealNameは、登録済みユーザーに必要なことを行います(ユーザー名を「実際の名前」に置き換えます)が、デフォルト値を名前フィールドに再割り当てします。

7
daphshez

はい、非常に単純に、モジュールの重量をより重く設定する必要があります。これを行うにはいくつかの方法がありますが、モジュールがDrupal.orgにリリースされるcontribモジュールである場合、次のようなコードでhook_install()に設定するのが最善の方法です。

db_query("UPDATE {system} SET weight = 100 WHERE name = 'MYMODULE'");

または、 tility module を使用してモジュールページからモジュールの重みを設定することもできますが、これは個人用のインストール専用です。

7
Decipher

Drupal7の追加の役立つ情報と同じように、hook_module_implements_alterがあります。

そこで、他のモジュールのフックを変更することもできます。たとえば、モジュールを最後/最初に移動します。

4
Daniel Wehner
function my_module_module_implements_alter(&$implementations, $hook) {
  if ($hook != 'the_hook_to_change') {
    return;
  }
  $module = 'my_module';
  $group = array($module => $implementations[$module]);
  unset($implementations[$module]);

  $implementations = $group + $implementations; // If you want your implementation to run first.
  //$implementations = $group + $implementations; If you want your implementation to run last.
}

https://api.drupal.org/comment/48623#comment-4862 に基づく小さな変更

1
Gokul N K