モジュールのnode.tpl.phpをオーバーライドする


8

特定のコンテンツタイプのコンテンツを表示できるモジュールを作成しました。表示はやや複雑で、オフにしてすべてをグループ化できるように、このためのモジュールを作成しました。

しかし最終的には、通常のnode.tpl.phpをカスタム.tpl.phpファイルでオーバーライドするだけです。テンプレートフォルダーにファイルを置くと、ファイルが取得され、ページが意図したとおりに表示されますが、ファイルがモジュールフォルダーにあるときにファイルを機能させることができません。

.tplファイルと前処理の登録について多くのことを読みましたが、必要なものを組み合わせるものは何もありませんでした。

これが今のところ

function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node--app' => array(
            'template' =>  drupal_get_path('module', 'app') . '/node--app',
            'variables' => array('node' => (object)array())
        )
    );
    return $items;
}

function apps_preprocess_node(&$vars) {
    $variables['theme_hook_suggestions'][] = 'node__app';
}

1
私はこれについて声を掛けられるかもしれませんが、私の(そうではない)控えめな意見では、モジュールはノードが表示されたときの外観を気にする必要はありません。表示部分。モジュールに、ノードに表示されるカスタムオブジェクトを作成させたい場合、それは別の話ですが、そのためのテンプレートを作成できます。しかし、そのステップを短絡させたい場合は、node.tpl.phpをテーマディレクトリに配置することが唯一の「正しい」方法です。
Jimajamma

誰かが特にDrupal 6でこれを行うことを検討している場合は、この回答を確認してください:stackoverflow.com/a/6153043/1154642
bryanbraun

回答:


3

あなたがあなたのテンプレートを配置している場合、それはあなたの質問に明確ではないsites/all/custom/modules、またはでsites/all/custom/modules/the_name_of_mymodule。後である必要があります。

ただし、次の場合:

  • テンプレートを適切な場所に配置します。
  • 訪問admin/appearanceテーマレジストリの更新を強制的にパスを。
  • キャッシュをすべて削除しました。

...しかしまだサイコロはありません。hook_theme()実装でいつでもtheme_pathキーを指定できます。

<?php
function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node_app' => array(
            // Don't specify the path in the template name.
            // Unless you have your template inside a directory within this module.
            'template' =>  'node--app',
            'variables' => array('node' => (object)array()),
            // If you want to put the tpl in another location, you can use this key.
            'theme path' => drupal_get_path('module', 'another_module'),
        ),
    );
    return $items;
}

それでも機能しない場合は、theme_hook_suggestionsが必要ですか、それとも自分でテンプレートを選択する必要がありますか?「アプリ」はコンテンツタイプ、「アプリ」はモジュール名
dazz

多分あなたが持っている問題は、テーマ関数の名前ですnode--app。より適切な名前はでありnode_app、テーマ設定関数を呼び出すtheme('node_app', [$vars]);ことtheme('node--app')で、私が今まで見たことがあるかどうかはわかりませんが、ほとんど機能しないでしょう。
アマチュアバリスタ

また、$ path変数が提供されているため、drupal_get_path()ダンスを実行する必要はありません。$ pathは、hook_themeを実装するモジュールの場所です。この場合は、appsという名前のモジュールです。
アマチュアバリスタ

1
テーマ名は'node__app'(二重下線)ではない必要があります'node_app'
Junaid

3

私が見つけた解決策を投稿すると思いました:

function MYMODULE_theme($existing, $type, $theme, $path) {
  return array(
    'node__NODETYPE' => array(
      'render element' => 'content',
      'base hook' => 'node',
      'template' => 'node--NODETYPE',
      'path' => drupal_get_path('module', 'MYMODULE') . '/templates',
    ),
  );
}

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