フックがDrupalによって呼び出されない


9

モジュールを開発していますが、追加しているフックはDrupalから呼び出されません。複数のフックで発生します。

フックのドキュメントを読みましたが、これが発生する理由を説明するものは何も見つかりません。正しいパラメーターを使用していて、正しい値を返していることを確認しました。

何が悪いのですか?不足しているものはありますか?


この質問は、フックがDrupalによって呼び出されていないという質問に対する標準的な質問と考えられています。
kiamlaluno

回答:


13

モジュールを開発するときは、次の点に注意してください。

  • モジュールから実行されるフックの実装は、名前にモジュールの短い名前(マシン名とも呼ばれる)が前に付いている関数です。フック名からフック部分を外し、モジュールのマシン名に置き換えます。たとえばhook_menu()、example.moduleからのdone の実装はexample_menu()です。モジュールがexample_menu.moduleであり、関数がであるexample_menu()場合、それはhook_menu()example_menu.module の実装とは見なされません。
    これは、たとえば、hook_form_alter()example_form.module の実装がではなくexample_form_alter()であることも意味しますexample_form_form_alter()。別の例として、example.moduleからhook_form_FORM_ID_alter()返されたフォームを変更するためのdone の実装はでuser_register_form()はありませんexample_form_user_register_alter()が、example_form_user_register_form_alter()。(フォームIDはuser_register_formです。)

  • 一般的な問題を作成していないモジュールのマシン名に大文字を使用して、話す:PHPは間違いをしないmyModule_get_value()、とmymodule_get_value()し、$value = myModule_get_value()いずれか呼び出しますmyModule_get_value()、またはmymodule_get_value()
    ただし、モジュールのマシン名に大文字を使用すると、モジュールの更新フックを定義するときに問題が発生する場合があります。drupal_get_schema_versions()利用可能な更新のリストを返す関数には、次のコードが含まれています。

    // Prepare regular expression to match all possible defined hook_update_N().
    $regexp = '/^(?P<module>.+)_update_(?P<version>\d+)$/';
    $functions = get_defined_functions();
    // Narrow this down to functions ending with an integer, since all
    // hook_update_N() functions end this way, and there are other
    // possible functions which match '_update_'. We use preg_grep() here
    // instead of foreaching through all defined functions, since the loop
    // through all PHP functions can take significant page execution time
    // and this function is called on every administrative page via
    // system_requirements().
    foreach (preg_grep('/_\d+$/', $functions['user']) as $function) {
      // If this function is a module update function, add it to the list of
      // module updates.
      if (preg_match($regexp, $function, $matches)) {
        $updates[$matches['module']][] = $matches['version'];
      }
    }

    から実行された最後の行drupal_get_schema_versions()は次の行です。

    return empty($updates[$module]) ? FALSE : $updates[$module];

    モジュール名がmyModule.moduleの場合、myModule_updateでdrupal_get_schema_versions('myModule')始まり番号で終わる名前の関数のみを返します。mymodule_update_7120()から使用される正規表現でdrupal_get_schema_versions()は大文字と小文字が区別されるため、などの関数は含まれません。正規表現はDrupal 7で使用されているものと同じであるため、これはDrupal 8にも適用されます。

  • 一部のフックは特定の瞬間に呼び出されます。たとえばhook_menu()、およびhook_menu_alter()は、モジュールが有効化/無効化された後、またはルーター情報のキャッシュがクリアされたときにDrupal 7から呼び出されます。hook_init()キャッシュされたページに対しては呼び出されません。
    特定のイベントが発生したためにフックが呼び出されると、同様のイベントが発生するまで、それらは再度呼び出されません。それらは、2つの連続するページ要求では呼び出されません。

  • Drupalはモジュールから実装されたフックのリストをキャッシュします。有効なモジュールのコードを編集して新しいフックを追加する場合は、最初にモジュールを無効にして再度有効にする必要があります。そうしないと、Drupalは新しいフックがあることに気づきません。

  • returnリファクタリング中に、ステートメントがフック関数のいずれかに侵入していないことを確認してください。出現するフックだけでなく、他のフックも破壊する連鎖反応を引き起こす可能性があり、問題の特定が困難になります。


また、将来的に他の人のために私の間違いに言及する価値があるかもしれません:.module(または他の「フラットな」非クラスPHP)ファイルで名前空間を定義しないでください。そうしないと、Drupalはファイルを認識しないため、ファイルに定義されているフックを検出できません。
Balu Ertl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.