web-dev-qa-db-ja.com

私のモジュールtemplate_preprocessが呼び出されていません

モジュールにテーマメカニズムを正しく実装する方法がわかりません。レジストリofcをフラッシュした後、フックが呼び出されません。

私のmymodule.moduleには関数が含まれています(この関数は呼び出されます、問題ありません。説明のためにのみ示します)。

_function mymodule_node_view($node, $view_mode) {
  ...
  $node->content['mymodule_tocteasers'] = array(
    '#markup' => theme('tocteasers', array('tocteasers' =>  "whatever")),
  );
}
_

テーマのメカニズムを理解しているように、tocteasersフックをレンダリングするには、モジュールがそれを実装する必要があります。これが私のモジュールの実装です。これはまったく呼び出されません。

_function template_preprocess_tocteasers(&$variables) {
  $variables['content'] = "something!!!";
  dsm($variables); print "hello";
}
_

^^ 私も成功したfunction mymodule_preprocess_tocteasers(&$variables)を試しました

さらに、モジュールディレクトリにtocteasers.tpl.phpという名前のファイルがあり、以下が含まれています。

_<div>
  <?php print "!!"; ?>
  <?php print $content; ?>
</div>
_

これも印刷または呼び出されません。

Tocteasers.tpl.phpファイルが使用され、意図したとおりに$ content変数を取得するようにこの実装を行う方法を誰かが私にアドバイスしてくれるでしょうか?

2
camcam

あなたが質問で報告しないのは hook_theme() の実装です。これはDrupal=モジュールが実装するテーマ関数を知るために必要です。あなたの場合、 hook_theme()から返される配列は、次のようになります(モジュールがテーマ関数のみを定義していると想定)。

  return array(
    'tocteasers' => array(
      'variables' => array('content' => 'the default value'),
      'template' => 'tocteasers',

      // Use it only if the template is not in the same directory the module is located.                         
      // This path should be relative to the Drupal root directory.
      'path' => 'the directory where the template file is located',
    )
  );

次のことに注意してください。

  • theme('tocteasers', array('tocteasers' => "whatever"))でテーマ関数を呼び出しましたが、テンプレートファイルは$tocteasersを使用していません。
  • テンプレートのファイル名は、テーマ名に使用されているものと同じでなければなりません。あなたの場合、テーマ関数はtocteasersなので、レポートされるテンプレートのファイル名は「tocteasers」である必要があります。拡張子「.tpl.php」は使用されません。テンプレートファイルを検索するときにDrupalによって自動的に追加されるためです。テーマ名とテンプレートファイル名の唯一の許容される違いは、テンプレートのファイル名には「-」を使用できますが、テーマ名にはアンダースコアを使用します。これは、テーマ名に「-」文字を使用できないためです。テーマ名には、PHP関数名(たとえば、数字で始めることはできません)。
  • 既存の有効なモジュールのコードを変更する場合、Drupalはhook_theme()から返されたデータをキャッシュします。その結果、テンプレートを使用していないテーマ関数がありました。 Drupalは古い定義を参照しているため、テンプレートファイルを使用しません。hook_theme()は特定のケースで呼び出されます。 Drupalでキャッシュデータを強制的に更新するには、モジュールを無効にしてから再度有効にする必要があります。
  • dsm($variables)は、呼び出しが遅すぎる場合、つまり drupal_set_message()dsm()から使用される関数)で設定されたメッセージが既にレンダリングされている場合、何も表示できませんでした。これらのタイプのデバッグメッセージについては、データベーステーブルにメッセージを保存する watchdog() を使用することをお勧めします。 Drupalは、admin/reports/dblogでこれらのメッセージを表示できるようにし、この目的のために WATCHDOG_DEBUG を定義します。
  • template_preprocess_tocteasers()hook_preprocess_tocteasers()の両方が使用されます。違いは、template_preprocess_tocteasers()がテーマ関数を実装するモジュールから定義され、hook_preprocess_tocteasers()の前に呼び出されることです。前処理関数の目的は何も出力せず、テンプレートファイルまたはテーマ関数に渡された変数を変更することです。結果として、次のコードは期待どおりに機能しません(つまり、「hello」はテーマ関数の出力にありません)。

    function template_preprocess_tocteasers(&$variables) {
      $variables['content'] = "something!!!";
      print "hello";
    }
    
4
kiamlaluno

間違いなく hook_theme() は、前処理の代わりにモジュールで実装する必要があります。

preprocess_tocteasers()を使用するには、hook_preprocess()で自分で呼び出す必要があります。

0
rémy