web-dev-qa-db-ja.com

特定のノードのカスタムページテンプレート-テンプレートの継承

特定のコンテンツタイプの特定のノード用にページテンプレートをカスタマイズしようとしています。これは私が持っているものです:コンテンツタイプ:カスタムページNode ID:2

最初に、すべての「カスタムページ」コンテンツノードをカスタマイズする必要があるため、それらのカスタムページテンプレートを作成しました:page--custom-page.tpl.php

次に、特定の「カスタムページ」ノードもカスタマイズする必要があるので、そのためのカスタムページテンプレートも作成しました:page--node--2.tpl.php

しかし、ノード2のページにアクセスすると、カスタムページ(page--custom-page.tpl.php)テンプレートが使用され、そのノード用に特別に作成したページテンプレートは使用されません。

そのノードのカスタムページテンプレートを機能させるにはどうすればよいですか?

1
barrakuda

テンプレートは、それらが$variables['theme_hook_suggestions']配列にあるものに基づいて選択されます。

したがって、リストがある場合:

page.tpl.php
page--node.tpl.php
page--node--1.tpl.php
page--node--edit.tpl.php

次に、下から見て、最初に見つかったテンプレートを使用します。

Drupal 7テンプレート(テーマフック)の提案

ページが実際にレンダリングされると、最後の提案がチェックされます。存在する場合、その提案が使用されます。そうでない場合は、次の提案がチェックされます。もちろん、オーバーライドする提案が存在しない場合は、page.tpl.phpが最終的な提案です。これは、なぜpage--front.tpl.phpが存在する場合、それがフロントページの他の提案をオーバーライドする理由も説明します。これは常にフロントページとして指定されたページの最後の提案です。

次のようにその末尾に一時的な提案を追加するカスタムコード(ここではコードを想定しています)があるためです。

$variables['theme_hook_suggestions'][] = 'page__custom_page';

次に、その提案がリストの最後に追加されるため、存在する場合、以前の提案はすべて上書きされます。

別のテンプレートの優先順位を設定する場合は、フックの候補の配列にその順序を使用させる必要があります。

これを行うにはいくつかの方法があり、どのようにしたいかについて、何を達成したいかによって異なります。

テンプレートをテンプレートの優先順位の最後(配列の最初)にしたい場合は、次のようにします。

array_unshift($variables['theme_hook_suggestions'], 'page__custom_page');

それ以外に、他のPHP配列操作関数を使用して、配列の中央に提案を挿入することもできます。または、最後に提案を追加し、その後に他の提案を追加することもできます(候補が配列に複数回含まれているかどうかは関係ありません。最初にチェックされたときに使用されます。

2
rooby

だから、これが私が必要なことを達成した方法です。

私が使用しているテンプレートは、templates.phpファイルのtheme_preprocess_pageフックを呼び出して、コンテンツタイプごとにカスタムページテンプレートを許可しています。

function myTheme_preprocess_page(&$variables) {
  if (!empty($variables['node'])) {
    $variables['theme_hook_suggestions'][] = 'page__' . $variables['node']->type;
  }
}

したがって、マシン名がcustom_pageのコンテンツタイプがある場合は、page--custom-page.tpl.phpという名前のテンプレートをmyTheme/templatesディレクトリに配置して、これらのコンテンツタイプをターゲットにすることができます。

次に、特定のノード(場合によってはノード15)をターゲットにするために、次のコードを関数に追加しました。

if(arg(1) == 15) {
  $variables['theme_hook_suggestions'][] = 'page__myCustomNode';
}

そして、page--myCustomNode.tpl.phpという名前のページテンプレートを作成し、myTheme/templatesディレクトリに配置しました。

これにより、すべてのcustom-pageコンテンツタイプのカスタムページテンプレートと、同じコンテンツタイプのノード15専用のカスタムページテンプレートを作成できました。

完全な関数は次のようになります。

function myTheme_preprocess_page(&$variables) {
  if (!empty($variables['node'])) {
    $variables['theme_hook_suggestions'][] = 'page__' . $variables['node']->type;
  }
  if(arg(1) == 15) {
    $variables['theme_hook_suggestions'][] = 'page__myCustomNode';
  }
}

私はこれが同じことをする必要がある誰かを助けることを願っています!

これを達成するより良い方法がある場合は、ここに投稿してください!ありがとう!!!

0
barrakuda

これはかなり古い質問であることに気づきましたが、最近私はこれを十分に行う必要があることに気づき、個々のノードのカスタムpage.tpl.phpおよびnode.tpl.phpファイルを指定する機能を提供するモジュールを作成しました。

モジュール内のコードは、ここですでに述べた手法を使用しているため、プロセスが少し複雑になるだけです。テンプレートファイルを自分で作成する必要がありますが、template.phpファイルの変更は必要ありません。

https://www.drupal.org/project/cts

0
Scott Robertson