モジュールにテーマメカニズムを正しく実装する方法がわかりません。レジストリ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変数を取得するようにこの実装を行う方法を誰かが私にアドバイスしてくれるでしょうか?
あなたが質問で報告しないのは 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
を使用していません。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";
}
間違いなく hook_theme() は、前処理の代わりにモジュールで実装する必要があります。
preprocess_tocteasers()
を使用するには、hook_preprocess()
で自分で呼び出す必要があります。