web-dev-qa-db-ja.com

Drupal 8でテンプレートの提案を処理する

URLに特定の_ GETパラメータが含まれている場合、Drupal custom page templateを使用するには)が必要です。

D7では、テーマのtemplate.phpで次のようにします。

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

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

何か案は?

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

8
Sifro

新しい 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';
  }
}

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

13
Clive