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


7

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

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

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

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

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

回答:


7

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

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

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


1
ありがとう、それはとても役に立ちます。私は...私はちょうど簡単な修正をしたいとユーティリティモジュールをインストールしたくない場合は、私は単純にデータベースを更新することができますね
daphshez

「システム」テーブルでモジュールの重みを変更するのは、通常、次のモジュールを実行する必要がある場合です。私がコードを知っているどのモジュールも、その重みを変更するためにユーティリティモジュールに依存していません。
kiamlaluno

@kiamlalunoユーティリティを依存関係として提案するのではなく、OPが自分のシステムの重みを変更するためのユーティリティとしてそれを提案しました。彼がcontribモジュールをリリースすることになっていたら、いいえ、それは間違いなく解決策ではありません。
2011年

1
私は開発者の観点から質問されている質問を取り上げ、あなたの提案は開発者のためのものであると考えました。自分のサイト(または管理しているサイト)にインストールされているモジュールの重量を変更する必要がなく、別のモジュールの重量を変更するためだけにカスタムモジュールを作成する必要がないことを理解しました。
kiamlaluno

4

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

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


私はこれが受け入れられる答えになるはずだと思います:)
Gokul NK

簡単な例を挙げていただけますか?
leymannx 2014

1
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-48623に基づく小さな変更

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.