web-dev-qa-db-ja.com

カスタムテーマ関数が呼び出されていませんか?

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」のような組み込みのテーマ関数に変更すると、機能します。しかし、なんらかの理由で、カスタムテーマ関数が取得されていません。

テーマレジストリを何百回も再構築し、キャッシュをクリアしました。

8
Camsoft

テーマフックをhook_theme()で定義していない可能性があります。

開発ハンドブックの テーマレイヤーの使用 セクションでは、これについて詳しく説明しています。

12
Damien Tournoud

hook_theme でテーマ関数を定義してから、キャッシュをクリアする必要があります。

 function MYMODULE_theme() {
   return array(
     'test' => array (
       'render element' => 'element',
     ),
   );
 }
10
googletorp

カスタムテーマ関数が登録されていても、テンプレートで呼び出されないという同じ問題に直面していました。別のテーマに切り替えたところ、うまくいきました。

私の解決策は、テーマの名前を 'something_theme'に変更することでした。なぜなら、私が愚かな間違いを犯し、すでに 'something'という名前のモジュールがあったためです。

モジュールとテーマに同じ名前を付けることはできません。これは、予期しない動作とフックのオーバーライドを引き起こす衝突を引き起こすためです。

2
bpile