テンプレートの探索と決定


これまでの処理で、以下の情報が確定しています。

  • 表示するべき ブログ・カテゴリー・エントリー などの CMS 管理データ

  • 仮想ドキュメントルートとなる テーマ・テーマフォルダ

  • ページタイプとテンプレートファイル の情報

これらをもとに、実際に使用されるテンプレートを探索し、最終的に適用するテンプレートを決定します。ここではテンプレートの探索・決定の流れを順番に見ていきます。


固定テンプレートの決定

最初に確認されるのは、ページタイプに基づく動的な決定よりも優先される 固定テンプレート です。

固定テンプレートとは、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 を固定テンプレートで表示したい場合

  • themes/xxxxx/about.html を作成

  • カテゴリなし

  • about.html というコード名(ファイル名)でエントリーを作成

https://example.com/company/index.html を固定テンプレートで表示したい場合

  • themes/xxxxx/company/index.html を作成

  • company というコード名のカテゴリーを作成


動的テンプレートの決定

固定テンプレートが存在しない場合は、ページタイプに基づいたテンプレート探索へ処理が進みます。

基本動作

動作の流れはシンプルです。

  1. ページタイプを判定する

  2. テーマ設定で、ページタイプに紐づけられたテンプレートファイルを取得する

  3. 仮想ドキュメントルート(テーマフォルダ)内から該当テンプレートを検索し、表示する

基本動作例

  • ブログのドメイン: example.com

  • ブログのコード: 空

  • テーマ設定: site

  • トップページのテンプレート: _top.html

  • 一覧ページのテンプレート: index.html

  • 詳細ページのテンプレート: _entry.html

  • 404ページのテンプレート: 404.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 エントリーが存在する前提

一覧ページと詳細ページの特殊な動作

基本的には、上記の基本動作で説明した動きになるのですが、カテゴリーが関わってくると特殊な動作になります。

例えば、以下条件の時の動作を考えてます。

  • ブログのドメイン: example.com

  • ブログのコード: 空

  • テーマ設定: site

  • 一覧ページのテンプレート: index.html

  • 詳細ページのテンプレート: _entry.html

  • news カテゴリーが存在

  • news カテゴリーに entry-1.html が存在

上記条件のとき https://example.com/news/https://example.com/news/entry-1.html のURLでどのテンプレートが利用されるでしょうか。

https://example.com/news/ の場合の探索順序

  1. themes/site/news/index.html を探索

  2. themes/site/index.html を探索

このようにカテゴリーが存在する場合は、そのカテゴリーに動的テンプレートがあるか探索し、存在しない場合は、上階層のテンプレートを探索します。

階層構造になっているカテゴリーも場合も同様で、例えば news/economy カテゴリーがある場合にhttps://example.com/news/economy/ にアクセスした場合は、以下の順番で探索されます。

  1. themes/site/news/economy.html を探索

  2. themes/site/news/index.html を探索

  3. themes/site/index.html を探索

https://example.com/news/entry-1.html の場合の探索順序

詳細ページの探索も一覧ページと同様で、下階層のディレクトリから探索を行なっていきます。

  1. themes/site/news/_entry.html を探索

  2. themes/site/_entry.html を探索


カテゴリー階層を順番にテンプレート探索する方法ですが、動的テンプレートのみ有効になります。固定テンプレートの場合は、上階層を自動で探索しませんので、お気をつけください。


テーマの継承

本CMSでは、使用中のテーマに存在しないテンプレートを別のテーマから継承することが可能です。

このテーマ継承を利用すると、共通ファイルは継承元から利用し、必要な部分だけを個別のテーマに用意するという柔軟な運用ができ、カスタマイズ性とメンテナンス性が大幅に向上します。

テーマ継承の書き方

子ブログのテーマディレクトリ名に @ を利用します。

継承テーマ@継承元テーマ

例: 「site」を元に「blog」テーマを作成する場合

blog@site

この場合、以下のように動作します。

blog/include/header.html が存在しない場合→ site/include/header.html が利用されます。

つまり、子テーマに存在しないファイルは自動的に継承元テーマから補完される仕組みです。

複数階層の継承

継承は 1 段階だけでなく、複数回の指定も可能です。

president@blog@site

この場合、ファイルは以下の順で探索されます。最終的には system テーマを探索します。

  1. president@blog@site テーマ

  2. blog@site テーマ

  3. site テーマ

  4. system テーマ


テンプレートを直接表示させないようにする

本CMSは 静的な HTML と同じ感覚でテーマを作成できる という特徴を持っています。
そのため、特に意識せず実装すると「同じコンテンツが複数の URL で表示されてしまう」という問題が発生することがあります。

重複表示が発生する例

たとえば、サイトトップのテンプレートを top.html とした場合、以下の URL で同じページが表示されます。

  • https://example.com/

  • https://example.com/top.html

このように同一コンテンツが複数の URL で公開されると、SEO や運用上の問題となる場合があります。

解決方法

この問題を解決するため、固定テンプレートとして表示させない仕組みが用意されています。これによりtop.htmlentry.html などの動的テンプレートを直接表示できなくすることができます。

直接表示させないための命名規則

テンプレートの ファイル名やディレクトリ名にアンダーバー(_)を入れることによって、直接アクセスを禁止できます。

直接サクセスさせないためのファイル・ディレクトリ名の例

  • themes/example/_top.html

  • themes/example/_entry.html

  • themes/example/_include/header.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 | /^_/  パスのディレクトリまたはファイルがこの正規表現に一致したものは直接表示させない