mtde.info

Movable Type Developers Express

再構築するテンプレートを変数で制御する

2008年4月10日 23:59 | Writer: apstar | 記事本文

再構築するテンプレートを変数で制御する方法を説明します。

例えば、全てのテンプレートからインクルードされるサイドバーがあるとします。以下の非常に簡単なコードをサイドバーのモジュールに記述し、再構築します。

<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で変数定義されています。

変数

2008 mtde.info