再構築するテンプレートを変数で制御する
再構築するテンプレートを変数で制御する方法を説明します。
例えば、全てのテンプレートからインクルードされるサイドバーがあるとします。以下の非常に簡単なコードをサイドバーのモジュールに記述し、再構築します。
<MTCategoryLabel>
すると、以下のようなエラーが出ます。
テンプレート「メインページ」の再構築中にエラーが発生しました: テンプレートタグMTIncludeでエラーが発生しました: error in module サイドバー: テンプレートタグMTCategoryLabelでエラーが発生しました: 変数タグを不正なコンテキストで利用しようとしました。
テンプレートタグには、特定のテンプレートタグの内部や、特定の種類のアーカイブ内部でのみ使用可能なものがあります。この外側で使用した場合、メッセージにあるとおり「不正なコンテキスト」や「コンテキスト外」エラーが発生するのです。
ではどうやって回避するのか
先ほどの、再構築時にエラーとなったコードです。
<MTCategoryLabel>
このコードは、実は現在のカテゴリ位置を示す目的でサイドバーへ貼ろうとしていたものとします。
少し考えると、これには次のような矛盾があることに気がつかないでしょうか?
取得できるはずのないカテゴリラベルを取得しようとしている
メインインデックスページの再構築時には、MTCategoryLabelタグのみでのカテゴリのラベルは取得できません。MTCategoryLabelだけでは、カテゴリが特定できないためです。
同じ理由で、月別アーカイブやウェブページでもMTCategoryLabelタグのみでのカテゴリのラベルは取得できなさそうです。
実際は、MTCategoriesブロックタグで括ってあげると、全てのカテゴリラベルが取得できますが、今回は「トップページから特定のカテゴリのラベルを取得する」ことはしないとします。
そこで、このサイドバーの記述は、「カテゴリとエントリでのみ、有効にしたい」とします。そうすると、コードは以下のようになります。
<MTIf name="category_archive">
<MTCategoryLabel>
</MTIf>
<MTIf name="entry_template">
<MTCategoryLabel>
</MTIf>
このコードは、「カテゴリページあるいはエントリページでのみ、このコードを再構築する」という挙動を示します。
テンプレートの種類を識別するための予約変数および定義変数
再構築時に、「どのテンプレートでのみこのコードを適用する」といった制御には必須な、テンプレートの種類を識別するための 予約変数※1 および定義変数※2 を以下に記します。先ほどのサンプルコードは、これを利用しているわけです。
- メインインデックスであるかどうか判断 ※2
- MTIf name="main_index"
- アーカイブインデックスであるかどうか判断 ※2
- MTIf name="archive_index"
- カテゴリ類全部であるかどうか判断 ※1
- MTIf name="archive_listing"
- カテゴリのみであるかどうか判断 ※1
- MTIf name="category_archive"
- エントリのみであるかどうか判断 ※1
- MTIf name="entry_template"
- ウェブページのみであるかどうか判断 ※1
- MTIf name="page_template"
- エントリおよびウェブページであるかどうか判断 ※1
- feedback_template
- 日時用カテゴリのみであるかどうか判断 ※1
- MTIf name="datebased_only_archive"
- Auther用カテゴリのみであるかどうか判断 ※1
- MTIf name="author_archive"
- システムページであるかどうか判断 ※2
- MTIf name="system_template"
- 検索ページであるかどうか判断 ※2
- MTIf name="search_results_template"
- コメントプレビューページであるかどうか判断 ※2
- MTIf name="comment_preview_template"
※1 予約変数です。システム内部で予約されています。
※2 定義変数です。テンプレート先頭付近にMTSetVarで変数定義されています。
- ページ先頭へ
- 前のエントリ: 配列
- 次のエントリ: 繰り返し処理における予約変数
- カテゴリ:変数