本文へ移動
STUDIO UMI
DRUPAL BLOGDrupalブログ

テンプレートファイルのSuggestionを追加する方法

Koki Kubota

こんにちは。
先日Japan ITWeekに参加したものの、1日で声を潰してしまった久保田です。
今日はテーマ開発には欠かせないテンプレートファイルについてのお話です。

テンプレートファイルとは

テンプレートファイルはHTMLのマークアップをカスタマイズしたい場合などに使用します。

通常は以下のようなデバッグ機能を使用して、 現在使用されているテンプレートファイルと同名のファイルを作成して上書きします。
例えばpageのマークアップを変更したい場合には、page.html.twigをカスタムテーマ内に作成します。

テーマデバッグ画面

あるいは特定の場面だけマークアップを変更したい場合には、 あらかじめSuggestionsの中にあるファイル名の中から条件に該当するものを探し
その名前のテンプレートファイルを作成します。
例えばフロントページのマークアップだけ変更する場合は、page--front.html.twigをカスタムテーマ内に作成します。

テーマデバッグ画面

上手くいかないときもある

しかしときにはSuggestionsの中にあるファイル名の候補だけではうまく対応できない場合があります。

例えば完全会員制のサイトで、ログイン前のユーザ(匿名ユーザー)が閲覧するページだけ変更したいようなケースだと、
匿名ユーザーのときにだけ現れるファイル名候補がないため、先ほどの例のようにはいきません。

もちろんpreprocessなどを駆使して、1つのテンプレートファイル内に匿名ユーザーと認証済みの2パターンを記述することもできますが、ファイルの可読性が落ちますし、分岐する条件がもっと増えるとより見づらくなってしまいます。。

hook_theme_suggestions_HOOK_alter を使おう

そんなときには hook_theme_suggestions_Hook_alter外部リンク を使うことで解決できます。
このhookの中で独自のテンプレート名をSuggestionsに追加することができます。

例えば上述の匿名ユーザーのpageテンプレートを変更したい場合には、

/**
 * Implements hook_theme_suggestions_page_alter().
 */
function MY_THEME_NAME_theme_suggestions_page_alter(&$suggestions, &$variables) {
  // 匿名ユーザー用のサジェスチョンを追加する.
  if (\Drupal::currentUser()->isAnonymous()) {
    $suggestions[] = 'page__anonymous';
  }
}

のようにカスタムテーマ内のtemplate.phpに記述します。
匿名ユーザーでサイトを見てみると、

テーマデバッグ画面

このように、Suggestionsの中にpage--anonymous.html.twigが追加されています。
あとはtemplatesフォルダの中にpage--anonymous.html.twigを作成してマークアップを記述することで
テンプレートを上書きすることができます。

ちなみにhook_theme_suggestions_HOOK_alterはtemplate.phpだけでなく、
カスタムモジュールのxxx.moduleファイルに実装しても機能します。

このように既存のSuggestionsでは上手く実装できない場合は、
ぜひhook_theme_suggestions_HOOK_alterを活用してみてください。

スタジオ・ウミは15年以上の実績を誇るDrupal専門の開発会社です。豊富な知見とノウハウでDrupalサイトの開発や技術サポートなどDrupal関連サービスをワンストップでご提供します。

RECRUIT

新たなステージを共に歩んでいける
コアメンバーを募集しています

採用情報

CONTACT

お仕事のご相談やお見積依頼など、
お気軽にお問い合わせください。

お問い合わせ