web-dev-qa-db-ja.com

Drupal 7のカスタムhook_theme()のテーマのオーバーライド

独自のhook_theme()を定義するカスタムD7モジュールがあります。これは、いくつかのテーマ関数を定義し、それらは独自のテンプレートを定義します。次に例を示します。

_function foo_theme($existing, $type, $theme, $path) {
    $items = array(
        'post_foot' => array(
            'template' => 'templates/post_foot',
            'variables' => array('node' => (object)array())
        )
    );
    return $items;
}
_

ご覧のとおり、それは独自のテンプレートを定義しています。これはfooモジュールにあり、この特定のケースでは_sites/all/modules/custom/foo/templates/post_foot.tpl.php_です。

自分の_post_foot.tpl.php_をテーマで定義し、フォールバックとしてfooのtplを使用できるようにしたいと思います。

これは自動的に起こりますか?オーバーライドを含めるには、hook_theme()を拡張する必要がありますか?

2
electblake

これは自動的に行われるはずです。ほとんどのコアモジュールは、テーマフックを定義します。テーマフックの定義については、テーマでオーバーライドすることについて二度と考えません。たとえば、node_themeを見てみましょう http://api.drupal.org/api/drupal/modules--node--node.module/function/node_theme/7

Devel themerモジュールはそのようなことを手助けしてくれるはずです。 D7のいくつかの作業が必要ですが、役立つはずです。

2
Jeremy French

これは、ハイフンがアンダースコアに置き換えられた後、テーマフックにテンプレートファイルとは異なる名前がない限り、自動的に発生します。その場合、自動検出は失敗します。

自動検出は、モジュールテンプレート名ではなく、モジュール定義のテーマフックの名前に基づいています。これは私にとって落とし穴でした。

モジュール内:

テーマフック:foo_theme_hook

テンプレート:theme-hook.tpl.php

テーマで

テンプレート:theme-hook.tpl.php

=失敗

修正するには、上記の例で、テーマフックの名前を「foo_theme_hook」ではなく「theme_hook」に変更するか、オーバーライドするテンプレートファイルの名前を「foo-theme-hook.tpl.php」に変更します。

2
meriial