ページテンプレートの提案が機能しない


12

テーマを作成し、この構造にテンプレートファイルを配置しました

  • /templates/page/page.tpl.php
  • /templates/page/page--node-type.tpl.php

カスタムページテンプレートを作成しましたが、何らかの理由でDrupalによって選択されません。キャッシュをクリアし、このプリプロセッサ関数をテーマtemplate.phpファイルに追加しようとしましたが、まだ機能していません。

if (isset($vars['node'])) 
  {
    // If the node type is "blog" the template suggestion will be "page--blog.tpl.php".
    $vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
  }

任意の助けをいただければ幸いです。


/templates/page/page--node-type.tpl.phpはpage--blog.tpl.phpであってはなりませんか?
ジェレミーフランス語

回答:


14

Drupal 7 Template Suggestionsで報告されているように、ページに対してDrupal 7からデフォルトで使用されるテンプレートの提案は、page-[front | internal / path] .tpl.phpです。

http://www.example.com/node/1/editに表示されるページの場合、Drupalは次のテンプレートファイルを探します。

  • page--node--edit.tpl.php
  • page--node--1.tpl.php
  • ページ--node.tpl.php
  • page.tpl.php

追加の提案を追加するには、テーマでtemplate_preprocess_page()を実装し、新しい提案を追加する必要があります$variables['theme_hook_suggestions']$variables関数への参照によって渡される変数です)。

その場合、提案されたテンプレートファイルが使用されない唯一の理由は、ファイルの名前が正しくないためです。たとえば、ページに本のページが表示されている場合、テンプレートファイルはpage-book.tplである必要があります.php。テーマのコードを変更し、page-book.tpl.phpのようなテンプレートが見つからない場合は、page--node-type.tpl.phpテンプレートを使用することができます。

また、theme_get_suggestions()template_preprocess_page()によって呼び出される関数では、ハイフンがに置き換えられ_、その逆はないことに注意してください。実行される理由は、機能コードで報告されるコメントで説明されています。

// When we discover templates in drupal_find_theme_templates(),
// hyphens (-) are converted to underscores (_) before the theme hook
// is registered. We do this because the hyphens used for delimiters
// in hook suggestions cannot be used in the function names of the
// associated preprocess functions. Any page templates designed to be used
// on paths that contain a hyphen are also registered with these hyphens
// converted to underscores so here we must convert any hyphens in path
// arguments to underscores here before fetching theme hook suggestions
// to ensure the templates are appropriately recognized.
$arg = str_replace(array("/", "\\", "\0", '-'), array('', '', '', '_'), $arg);

5

私はDrupal 7.4を使用していますが、同じ問題があり、助けたのはこの投稿だけでした:コンテンツタイプに基づいてカスタムpage.tplを追加する方法

投稿から:

<?php
/**
* Variables preprocess function for the "page" theming hook.
*/
function THEME_NAME_preprocess_page(&$vars) {

  // Do we have a node?
  if (isset($vars['node'])) {

    // Ref suggestions cuz it's stupid long.
    $suggests = &$vars['theme_hook_suggestions'];

    // Get path arguments.
    $args = arg();
    // Remove first argument of "node".
    unset($args[0]);

    // Set type.
    $type = "page__type_{$vars['node']->type}";

    // Bring it all together.
    $suggests = array_merge(
      $suggests,
      array($type),
      theme_get_suggestions($args, $type)
    );

    // if the url is: 'http://domain.com/node/123/edit'
    // and node type is 'blog'..
    //
    // This will be the suggestions:
    //
    // - page__node
    // - page__node__%
    // - page__node__123
    // - page__node__edit
    // - page__type_blog
    // - page__type_blog__%
    // - page__type_blog__123
    // - page__type_blog__edit
    //
    // Which connects to these templates:
    //
    // - page--node.tpl.php
    // - page--node--%.tpl.php
    // - page--node--123.tpl.php
    // - page--node--edit.tpl.php
    // - page--type-blog.tpl.php          << this is what you want.
    // - page--type-blog--%.tpl.php
    // - page--type-blog--123.tpl.php
    // - page--type-blog--edit.tpl.php
    //
    // Latter items take precedence.
  }
}
?>

どうもありがとう...提案とテンプレート名の関係を示してくれて本当に助かりました。もう一度ありがとう:)
SGhosh

2

Drupal 7.22で文字列置換を使用して、上記の例を実行しようとして長すぎました。これは私にはうまくいかないようです。興味深いことに、一部のコンテンツタイプは自動的に提案されるようですが、他のコンテンツタイプは提案されません。これは最終的に私のために働いたコードです。

if (isset($variables['node'])) {
   // $variables['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $variables['node']->type);
   //cannot get above working for some reason?
     $variables['theme_hook_suggestions'][] = 'page__' . $variables['node']->type;
  }

したがって、front_pageコンテンツタイプのテンプレートの提案は次のようになります。

ページ--front_cover.tpl.php

興味深いことに、「issue」コンテンツタイプのコードテンプレートの提案は、プリプロセッサスクリプトを必要とせずにpage--issue.tpl.phpとして実現します!?私の目的では、これは同様のパスを使用するビューテンプレートをオーバーライドするようです。

すなわち

ビューのパス= / issue /#コンテンツタイプに基づくテンプレートの提案、つまり/ issue /#/ front_cover


-フロントcover.tpl.phpページ:これは任意のプリプロセッサスクリプトなしになりますfront_pageコンテンツタイプのテンプレートの提案
sneha.kamble
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.