これまでの処理で、以下の情報が確定しています。
これらをもとに、実際に使用されるテンプレートを探索し、最終的に適用するテンプレートを決定します。ここではテンプレートの探索・決定の流れを順番に見ていきます。
固定テンプレートの決定
最初に確認されるのは、ページタイプに基づく動的な決定よりも優先される 固定テンプレート です。
固定テンプレートとは、URL とテンプレートファイルが 1 対 1 で結びつく仕組みです。
これは、標準的な静的 HTML の表示ルールに従って動作します。
固定テンプレートの例
テーマフォルダ(仮想ドキュメントルート)はすでに決定しているため、
あとは標準的な静的 HTML の表示ルールに従って、対応するテンプレートファイルを探索します。
ドメイン: example.com
ブログコード: 空(ルートブログ)
テーマ設定: site
フォルダを使用
URL: https://example.com/about.html
探索テンプレート: themes/site/about.html
URL: https://example.com/company/index.html
探索テンプレート: themes/site/company/index.html
URL: https://example.com/service/plan.html
探索テンプレート: themes/site/service/plan.html
存在すれば、これらのファイルがテンプレートとして決定されます。
固定テンプレートを使う目的
静的に固定したいページをテーマ内に直接設置したい場合
CMS のエントリーやカテゴリーに依存せず、単発のページを提供したい場合
専用で他ページとは違うデザイン・スタイルを当てたい場合
固定テンプレートは、CMSのデータとして、カテゴリーやエントリーが存在しなくても表示されますが、テンプレートファイル名と同名のカテゴリーや、エントリーを作成することをお勧めします。
なぜならば、CMSのデータとして存在しない場合、OGP情報などのmeta情報についてもテンプレートで個別に指定する必要があるため、meta情報などは共通テンプレートで、CMSの管理情報から動的に出力することで、実装コストや、設定忘れなどが少なくなるためです。
https://example.com/about.html
を固定テンプレートで表示したい場合
https://example.com/company/index.html
を固定テンプレートで表示したい場合
動的テンプレートの決定
固定テンプレートが存在しない場合は、ページタイプに基づいたテンプレート探索へ処理が進みます。
基本動作
動作の流れはシンプルです。
ページタイプを判定する
テーマ設定で、ページタイプに紐づけられたテンプレートファイルを取得する
仮想ドキュメントルート(テーマフォルダ)内から該当テンプレートを検索し、表示する
基本動作例
URLが https://example.com
の時使用されるテンプレート
themes/site/_top.html
URLが https://example.com/keyword/アップル/
の時使用されるテンプレート
themes/site/index.html
URLが https://example.com/about.html
の時使用されるテンプレート
themes/site/_entry.html
* about.html
エントリーが存在する前提
一覧ページと詳細ページの特殊な動作
基本的には、上記の基本動作で説明した動きになるのですが、カテゴリーが関わってくると特殊な動作になります。
例えば、以下条件の時の動作を考えてます。
上記条件のとき https://example.com/news/
や https://example.com/news/entry-1.html
のURLでどのテンプレートが利用されるでしょうか。
https://example.com/news/ の場合の探索順序
themes/site/news/index.html
を探索
themes/site/index.html
を探索
このようにカテゴリーが存在する場合は、そのカテゴリーに動的テンプレートがあるか探索し、存在しない場合は、上階層のテンプレートを探索します。
階層構造になっているカテゴリーも場合も同様で、例えば news/economy
カテゴリーがある場合にhttps://example.com/news/economy/
にアクセスした場合は、以下の順番で探索されます。
themes/site/news/economy.html
を探索
themes/site/news/index.html
を探索
themes/site/index.html
を探索
https://example.com/news/entry-1.html の場合の探索順序
詳細ページの探索も一覧ページと同様で、下階層のディレクトリから探索を行なっていきます。
themes/site/news/_entry.html
を探索
themes/site/_entry.html
を探索
カテゴリー階層を順番にテンプレート探索する方法ですが、動的テンプレートのみ有効になります。固定テンプレートの場合は、上階層を自動で探索しませんので、お気をつけください。
テーマの継承
本CMSでは、使用中のテーマに存在しないテンプレートを別のテーマから継承することが可能です。
このテーマ継承を利用すると、共通ファイルは継承元から利用し、必要な部分だけを個別のテーマに用意するという柔軟な運用ができ、カスタマイズ性とメンテナンス性が大幅に向上します。
テーマ継承の書き方
子ブログのテーマディレクトリ名に @
を利用します。
継承テーマ@継承元テーマ
例: 「site」を元に「blog」テーマを作成する場合
blog@site
この場合、以下のように動作します。
blog/include/header.html
が存在しない場合→ site/include/header.html
が利用されます。
つまり、子テーマに存在しないファイルは自動的に継承元テーマから補完される仕組みです。
複数階層の継承
継承は 1 段階だけでなく、複数回の指定も可能です。
president@blog@site
この場合、ファイルは以下の順で探索されます。最終的には system
テーマを探索します。
president@blog@site
テーマ
blog@site
テーマ
site
テーマ
system
テーマ
テンプレートを直接表示させないようにする
本CMSは 静的な HTML と同じ感覚でテーマを作成できる という特徴を持っています。
そのため、特に意識せず実装すると「同じコンテンツが複数の URL で表示されてしまう」という問題が発生することがあります。
重複表示が発生する例
たとえば、サイトトップのテンプレートを top.html
とした場合、以下の URL で同じページが表示されます。
このように同一コンテンツが複数の URL で公開されると、SEO や運用上の問題となる場合があります。
解決方法
この問題を解決するため、固定テンプレートとして表示させない仕組みが用意されています。これによりtop.html
や entry.html
などの動的テンプレートを直接表示できなくすることができます。
直接表示させないための命名規則
テンプレートの ファイル名やディレクトリ名にアンダーバー(_)を入れることによって、直接アクセスを禁止できます。
直接サクセスさせないためのファイル・ディレクトリ名の例
上記のように、 アンダーバー(_
)から始まっているファイル名もしくは、ディレクトリ名があると、そのテンプレートは直接表示されなくなります。
https://example.com/_top.html
は表示されない
https://example.com/_entry.html
は表示されない
https://example.com/_include/header.html
は表示されない
命名規則を変更する
デフォルトは、先頭にアンダーバー(_
)がある場合ですが、変更することも可能です。private/config.system.yaml
に正規表現で設定します。
forbid_direct_access_tpl: /^_/ # off | /^_/ パスのディレクトリまたはファイルがこの正規表現に一致したものは直接表示させない