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


8

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

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

回答:


12

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

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


注目してください、Drupal 6からDrupal 7へのこれらの小さな変更にいつも気を取られています!
Camsoft、2011年

4
テーマ機能は、Drupalの6にあまりにも登録する必要があります
Berdir

10

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

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

2

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.