Drupal 8でのテンプレート候補の操作


8

URLに特定の_GETパラメータが含まれている場合、カスタムページテンプレートを使用するにはDrupalが必要です。

ではD7 Iテーマのtemplate.phpにこのような何かをするだろう。

function mytheme_preprocess_page(&$variables) {
      if($_GET['isCustomTpl'] == true)
        $variables['theme_hook_suggestions'][] =  'page__myCustomTpl';
}

ただし、D8では機能しません(テーマレイヤーのすべてのアーキテクチャの変更を考えると、その反対に驚いたでしょう)。

何か案は?

おまけの質問:そのような関数をモジュールで定義して、ユーザーにテーマを編集させることなく公開できるようにすることは可能ですか?

回答:


13

新しいhook_theme_suggestions_HOOK_alter()フックを実装できます。

特定のテーマフックの名前付き提案を変更します。

このフックにより、任意のモジュールまたはテーマで代替のテーマ関数またはテンプレート名の提案を提供し、hook_theme_suggestions_HOOK()またはこのフックの以前の呼び出しによって提供された提案を並べ替えたり削除したりできます。

そのまま使えます

function MYMODULE_theme_suggestions_page_alter(array &$suggestions, array $variables) {
  if (\Drupal::request()->query->get('foo') == 'bar') {
    $suggestions[] = 'page__myCustomTpl';
  }
}

モジュールまたはテーマのいずれかに実装できます


1
すばらしい、完璧に機能しています!うまくいけば、d8の完全に機能するpjaxモジュールに進化するでしょう。
Sifro

テーマ別に実行する場合は、このコードをdrupal 7のようにtemplate.phpファイルに配置する必要がありますか?テーマファイル名はpage_myCustomTpl.html.twig?私は正しいですか?
shekoufeh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.