Drupal 7モジュールをビルドして、ビスポークフィールドタイプを作成しています。必要なすべてのフックを実装しました。hook_field_formatter_view()
関数は次のようになります:
_function MYMODULE_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
$element = array();
switch ($display['type']) {
case 'default':
foreach ($items as $delta => $item) {
$element[$delta] = array(
'#theme' => 'test',
'#item' => $item,
);
}
break;
}
return $element;
}
_
次に、以下のtheme()
関数を定義しました。
_function theme_test($variables) {
return '<h1>Hello World</h1>';
}
_
しかし、ページを表示しても何も出力されません。最近のログエントリを見ると、次のメッセージが表示されます。
_Theme key 'test' not found.
_
MYMODULE_field_formatter_viewレンダー配列「#theme」の値を「item_list」のような組み込みのテーマ関数に変更すると、機能します。しかし、なんらかの理由で、カスタムテーマ関数が取得されていません。
テーマレジストリを何百回も再構築し、キャッシュをクリアしました。
テーマフックをhook_theme()
で定義していない可能性があります。
開発ハンドブックの テーマレイヤーの使用 セクションでは、これについて詳しく説明しています。
hook_theme
でテーマ関数を定義してから、キャッシュをクリアする必要があります。
function MYMODULE_theme() {
return array(
'test' => array (
'render element' => 'element',
),
);
}
カスタムテーマ関数が登録されていても、テンプレートで呼び出されないという同じ問題に直面していました。別のテーマに切り替えたところ、うまくいきました。
私の解決策は、テーマの名前を 'something_theme'に変更することでした。なぜなら、私が愚かな間違いを犯し、すでに 'something'という名前のモジュールがあったためです。
モジュールとテーマに同じ名前を付けることはできません。これは、予期しない動作とフックのオーバーライドを引き起こす衝突を引き起こすためです。