さまざまなモジュールによるどのフック実装の順序を変更できますか?
質問
D6では、Contribモジュールを使用しますが、その動作のほんの少しをオーバーライドしたいと思います。そのためのカスタムモジュールがありますが、関連するフックの実装は、contribモジュールでの実装の前に呼び出されるため、contribモジュールのバージョンは「wins」です。
それを変更し、私自身のフックを最後に呼ぶように強制する方法はありますか?
具体的な詳細は次のとおりです。
コメントフォームで未登録のユーザーのデフォルトの「匿名」ユーザー名を削除したいと思います。 form_alterフックを実装し、名前フィールドからデフォルト値を削除する小さなカスタムモジュール、tweak_comment_formを作成しました(名前フィールドからデフォルト値を削除します。それについての私の以前の質問への答えを参照してください).
ただし、呼ばれるContribモジュールも使用します 本名, 、form_alterも実装しています。 RealNameは、登録ユーザーに必要なことを行います(ユーザー名を「本名」に置き換えます)が、デフォルト値を名前フィールドに再割り当てします。
解決
はい、非常に簡単に言えば、モジュールの重量をより重くするように設定する必要があります。これを行う方法はいくつかありますが、モジュールがdrupal.orgにリリースされるコントリブモジュールである場合、最良の方法はそれを設定することです hook_install()
次のようなコードを使用してください
db_query("UPDATE {system} SET weight = 100 WHERE name = 'MYMODULE'");
または、使用することもできます ユーティリティモジュール モジュールページからモジュールの重みを設定するには、これは個人のインストール専用です。
他のヒント
Drupal7の追加の役立つ情報と同様に、hook_module_implements_alterがあります。
そこで、他のモジュールのフックを変更することもできます。たとえば、モジュールを終了/開始に移動することもできます。
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