回答:
別のメニューコールバックを使用する場合は、hook_menu_alter()を実装してメニューコールバックを変更できます。Drupalがsearchに対して定義するメニューコールバックをオーバーライドする場合は、次のコードを使用できます。
function mymodule_menu_alter(&$items) {
if (isset($items['search'])) {
$items['search']['page callback'] = 'mymodule_search_view';
}
}
mymodule_search_view()
呼び出すことができますsearch_viewを()それは、メニューのコールバックを呼び出す前に、Drupalのから行われているように、まずそれを含むファイルを含めずに。
メニューコールバックがフォームを返す場合も同様のコードを実行できますが、ページコールバック(おそらくdrupal_get_form())を変更する代わりに、ページ引数を変更して、最初の引数としてコールバック名を使用します。フォーム配列を返す関数。これを行うのではなく、hook_form_alter()を実装し、不要なフォーム要素を$form['element']['#access'] = FALSE', and not with
unset($ form ['element']) `で非表示にする必要があります。
フックから呼び出される関数の置き換えについては、その関数を呼び出すフックの実装を削除し、別の実装に置き換えることができます。これはDrupal 7でのみ可能であり、慎重に行う必要があります。(私はなぜ右説明します。)
あなたが呼び出された関数に変更したいとしましょう)(menu_node_updateを(の実装hook_node_update() )からmenu_node_save()へmymodule_node_save()
。次のコードを使用できます。
function mymodule_module_implements_alter(&$implementations, $hook) {
if ($hook == 'node_update') {
$group = $implementations['mymodule'];
unset($implementations['mymodule']);
unset($implementations['menu']);
$implementations = array('mymodule' => group) + $implementations;
}
}
function mymodule_node_update($node) {
mymodule_node_save();
}
このようにして、menu_node_update()
もう呼び出されませんが、呼び出されますmymodule_node_update()
。
通常、別のモジュールによって実装されたフックに依存するモジュールは、そのフックが実行されているかどうかをチェックしません。彼らは、モジュールが有効になっている(そしてフックが呼び出されていると想定している)ことを確認するか、そのモジュールを依存関係として追加します。フックの実行を回避すると、他のモジュールに問題が発生し、追跡が困難になる可能性があります。別のモジュールによって実装されたフックが実行されるのを避けることが本当に必要な場合は、まずテストサイトですべてが期待どおりに機能していることを確認する必要があります。Drupalの将来のバージョンではコードが壊れる可能性があることに注意してください。作成しているコードは、Drupalの将来のバージョンでもテストする必要があります(可能な場合)。
あなたはmodule_invoke_allを試すべきです
モジュールを想定すると、コールバックは次のように変数$ outputを返します。
function module_a_callback($args){
$output =... your calculs ...
return $output;
}
これを追加:module_invoke_all( 'module_a_alter');
function module_a_callback($args){
$output = ... your calculs ...
// call all module implementing your 'module_a_alter' hook
$alter = module_invoke_all('module_a_alter', $args);
//if there is an answer,
$final_output = isset($alter[0]) ? $alter[0] : $output;
return $output;
}
これで、hook_module_a_alter($ args)フックが作成されました。モジュールBで、対応するフック実装を作成します
function module_b_module_a_alter($args){
$output =... your calculs from module B ...
return $output;
}
ここで、参照渡しの変数を使用した、より高速な2つ目の方法:
function module_a_callback($args){
$output = ... your calculs ...
// call all module implementing your 'module_a_alter' hook
module_invoke_all('module_a_alter', $output, $args);
return $output;
}
モジュールBで、対応するフック実装を作成します
function module_b_module_a_alter(&$output, $args){
$output =... your calculs from module B ...
}
ミニチュットはこちらをご覧ください。フック呼び出しをリッスンするモジュールを指定できるmodule_invokeを使用することもできます。
これはDrupal自体よりもphp言語の問題です...
デフォルトでは、phpで関数を再定義することはできません。あなたはそれを可能にするrunkit拡張機能を使用することを試みることができますが、私が知る限り、運用サーバーでのrunkitの使用はかなり重くなる可能性があるためお勧めしません。
別のモジュールの機能を絶対に変更する必要がある場合は、適切に保守されたパッチがおそらくより適切です。
Drupal 8では、OOコア(もちろん、これは本当に素晴らしい)にフォーカスが移っているので、この種の問題ははるかに少なくなるはずですが、今のところ、これらの種類の状況の回避策に悩まされています。
hook_menu_alter()
メニューのコールバックは問題ありませんが、フック内で呼び出されるランダム関数の場合、呼び出された関数を変更するためにフックの実装をオーバーライドする必要があります(おなじみのように聞こえます;))...または既存の関数を別の関数に置き換えると、言語問題のIMOの詳細まで。誤解しているかもしれませんが、コード例がないと作業が難しい
この関数の出力を別の関数で上書きしてみてください。両方とも他のフックで出会います(関数はフック内で呼び出されていると述べたように)。
function1()
どのように呼び出しfunction2()
ますか?