【Movable Type】条件分岐する
概要
MT(PowerCMS含む、以下同)での条件分岐の方法について解説しています。
書き方が少し独特でややこしいですが、条件分岐を使用することで、より柔軟なMTML記述が可能になるかと思います。
条件分岐は以下のMTタグを利用して行います。
MTIf
MTUnless
MTElseIf
MTElse
以下、それぞれのMTタグについての解説と、とりあえず覚えておくといいモディファイアについて記載しています。
MTIf
このMTタグで囲われた中身は、「モディファイアで指定した条件を満たす場合」に実行される。
以下の例では、テンプレートの種類がmain_index
の場合にのみ、ウェブサイトの説明(MTWebsiteDescription
)を表示します。
<!-- トップページ(main_index)にのみウェブサイトの説明を表示する -->
<mt:If name="main_index">
<p><$mt:WebsiteDescription$></p>
</mt:If>
また、以下の例では「ウェブサイトの説明」欄が入力されている場合に表示します。入力されていなければ表示されません。
<!-- ウェブサイトの説明が入力されていれば表示する -->
<mt:If tag="WebsiteDescription">
<p><$mt:WebsiteDescription$></p>
</mt:If>
とりあえず覚えておくといいモディファイア
name
テンプレートの予約変数(main_index
など)、MTSetVar
などで設定した変数で条件分岐する。
name
もしくは次で紹介するtag
の指定は必須。もしいずれのモディファイアも指定していなければ、必ずfalse(偽)を返す。
このモディファイアのみを指定した場合は、指定した変数の値の有無で条件判断される。
tag
テンプレートタグで条件分岐する。値にするテンプレートタグの接頭辞MT
は省略可。
このモディファイアのみを指定した場合は、指定したテンプレートタグの値の有無で条件判断される。
name
と併記した場合はname
が優先されるので、意図した動作にならないので注意(普通は併記することはないと思います)
eq
指定した値が一致する場合に実行する。
<!-- 以下のカテゴリが存在している状態で -->
- カテゴリA
- カテゴリB
- カテゴリC
<!-- カテゴリAの出力でのみ表示する -->
<mt:If tag="CategoryLabel" eq="カテゴリA">
<!-- カテゴリAの出力でのみ表示する内容 -->
</mt:If>
like
指定した値を含む場合に実行する。
<!-- 以下のカテゴリ(ベースネーム)が存在している状態で -->
- admin_profile
- admin_posts
- editor_profile
- editor_posts
- viewer_profile
<!-- adminを含むもののみ表示する -->
<mt:If tag="CategoryBasename" like="admin">
<p><$mt:CategoryBasename$></p>
</mt:If>
<!-- 表示結果 -->
<p>admin_profile</p>
<p>admin_posts</p>
なお、like
モディファイアはPerlの正規表現を利用できます(以下例のtag
はダミーです)
<!-- 複数指定(|) -->
<mt:If tag="xxx" like="(dog|cat)"></mt:If>
<!-- 前方一致(^) -->
<mt:If tag="xxx" like="^(dog)"></mt:If>
<!-- 後方一致($) -->
<mt:If tag="xxx" like="(dog)$"></mt:If>
<!-- 完全一致(^$) -->
<mt:If tag="xxx" like="^(dog)$"></mt:If>
<mt:If tag="xxx" like="^(dog|cat)$"></mt:If>
ne
指定した値が一致しない場合に実行する。
<!-- 以下のカテゴリが存在している状態で -->
- カテゴリA
- カテゴリB
- カテゴリC
<!-- カテゴリAの出力時には表示されない(カテゴリB,Cで表示される) -->
<mt:If tag="CategoryLabel" ne="カテゴリA">
<!-- カテゴリAの出力時には表示されない内容 -->
</mt:If>
以下はMTUnless
を使用した例で、同じ出力結果になります。場合によりますが、「一致しない場合に出力する」のであれば、基本的にMTUnless
を使用した方がテンプレートもわかりやすく、探しやすいです。
<!-- カテゴリAの出力時には表示されない(カテゴリB,Cで表示される) -->
<mt:Unless eq="カテゴリA">
<!-- カテゴリAの出力時には表示されない内容 -->
</mt:Unless>
MTUnless
このMTタグで囲われた中身は、「モディファイアで指定した条件を満たさない場合」に実行される。
以下の例では、インデックステンプレートの種類がmain_index
ではない場合に、パンくずリストを表示します。
<!-- トップページ(main_index)でない場合にパンくずリストを表示する -->
<mt:Unless name="main_index">
<ul>
<li><a href="<$mt:WebsiteURL$>">HOME</a></li>
<li><$mt:BlogName$></li>
</ul>
</mt:Unless>
また、以下の例では「ウェブサイトの説明」欄が入力されていない場合に表示します。入力されていれば表示されません。
<!-- ウェブサイトの説明が入力されていなければ表示する -->
<mt:Unless tag="WebsiteDescription">
<p>サイトの説明はありません。</p>
</mt:Unless>
とりあえず覚えておくといいモディファイア
name
テンプレートの予約変数(main_index
など)、MTSetVar
などで設定した変数で条件分岐する。
name
もしくは次で紹介するtag
の指定は必須。もしいずれのモディファイアも指定していなければ、必ずtrue(真)を返す。
このモディファイアのみを指定した場合は、指定した変数の値の有無で条件判断される。
tag
テンプレートタグで条件分岐する。値にするテンプレートタグの接頭辞MT
は省略可。
このモディファイアのみを指定した場合は、指定したテンプレートタグの値の有無で条件判断される。
name
と併記した場合はname
が優先されるので、意図した動作にならないので注意(普通は併記することはないと思います)
eq
指定した値が一致しない場合に実行する。
<!-- 以下のカテゴリが存在している状態で -->
- カテゴリA
- カテゴリB
- カテゴリC
<!-- カテゴリAの出力時には表示されない(カテゴリB,Cで表示される) -->
<mt:Unless eq="カテゴリA">
<!-- カテゴリAの出力時には表示されない内容 -->
</mt:Unless>
like
指定した値を含まない場合に実行する。
<!-- 以下のカテゴリ(ベースネーム)が存在している状態で -->
- admin_profile
- admin_posts
- editor_profile
- editor_posts
- viewer_profile
<!-- adminを含まないもののみ表示する -->
<mt:Unless tag="CategoryBasename" like="admin">
<p><$mt:CategoryBasename$></p>
</mt:Unless>
<!-- 表示結果 -->
<p>editor_profile</p>
<p>editor_posts</p>
<p>viewer_profile</p>
なお、like
モディファイアはPerlの正規表現を利用できます(以下例のtag
はダミーです)
<!-- 複数指定(|) -->
<mt:Unless tag="xxx" like="(dog|cat)"></mt:Unless>
<!-- 前方一致(^) -->
<mt:Unless tag="xxx" like="^(dog)"></mt:Unless>
<!-- 後方一致($) -->
<mt:Unless tag="xxx" like="(dog)$"></mt:Unless>
<!-- 完全一致(^$) -->
<mt:Unless tag="xxx" like="^(dog)$"></mt:Unless>
<mt:Unless tag="xxx" like="^(dog|cat)$"></mt:Unless>
ne
指定した値が一致する場合に実行する。
<!-- 以下のカテゴリが存在している状態で -->
- カテゴリA
- カテゴリB
- カテゴリC
<!-- カテゴリAの出力でのみ表示する -->
<mt:Unless tag="CategoryLabel" ne="カテゴリA">
<!-- カテゴリAの出力でのみ表示する -->
</mt:Unless>
以下はMTIf
を使用した例で、同じ出力結果になります。場合によりますが、「一致する場合に出力する」のであれば、基本的にMTIf
を使用した方がテンプレートもわかりやすく、探しやすいです。
<!-- カテゴリAの出力でのみ表示する -->
<mt:If tag="CategoryLabel" eq="カテゴリA">
<!-- カテゴリAの出力でのみ表示する内容 -->
</mt:If>
MTElseIf
MTIf
内で使用する。MTIf
または直前のMTElseIf
で指定した条件に合致しなかった場合に、次の条件として「このタグに追加したモディファイアで指定した条件を満たす場合」に実行される。閉じタグ(</MTElseIf>
)は不要。
以下の例では、テンプレートの種類によって表示する文言を切り替えています。
<!-- テンプレートの種類により表示を切り替える -->
<mt:If name="main_index">
<p>トップページ</p>
<mt:ElseIf name="category_archive">
<p>カテゴリ一覧ページ</p>
<mt:ElseIf name="entry_archive">
<p>記事詳細ページ</p>
</mt:If>
また、以下の例ではカテゴリ名により表示する文言を切り替えています。
<!-- 以下のカテゴリが存在している状態で -->
- カテゴリA
- カテゴリB
- カテゴリC
<!-- カテゴリ名により表示を切り替える -->
<mt:If tag="CategoryLabel" eq="カテゴリA">
<p>カテゴリAです</p>
<mt:ElseIf eq="カテゴリB">
<p>カテゴリBです</p>
<mt:ElseIf eq="カテゴリC">
<p>カテゴリCです</p>
</mt:If>
とりあえず覚えておくといいモディファイア
name
テンプレートの予約変数(main_index
など)、MTSetVar
などで設定した変数で条件分岐する。このモディファイアを省略した場合は、ひとつまえのMTIf
またはMTElseIf
の分岐で指定した変数を参照する。
このモディファイアのみを指定した場合は、指定した変数の値の有無で条件判断される。
tag
テンプレートタグで条件分岐する。値にするテンプレートタグの接頭辞MT
は省略可。このモディファイアを省略した場合は、ひとつまえのMTIf
またはMTElseIf
の分岐で指定した変数を参照する。
このモディファイアのみを指定した場合は、指定したテンプレートタグの値の有無で条件判断される。
name
と併記した場合はname
が優先されるので、意図した動作にならないので注意(普通は併記することはないと思います)
eq / like / ne
MTIf
の項目で説明した内容と重複するため、割愛します。
MTElse
MTIf
やMTUnless
で指定した条件に合致しない場合に実行される。MTEntries
やMTPages
など一部のブロックタグでも利用可。閉じタグ(</MTElse>
)は省略可。
以下の例では、テンプレートの種類がmain_index
かそれ以外かによって表示を切り替えています。
<!-- テンプレートの種類により表示を切り替える -->
<mt:If name="main_index">
<h1><a href="<$mt:WebsiteURL$>"><$mt:WebsiteName$></a></h1>
<mt:Else>
<div><a href="<$mt:WebsiteURL$>"><$mt:WebsiteName$></a></div>
</mt:If>
また、以下の例ではカテゴリ名によりclass名を切り替えています。
<!-- 以下のカテゴリが存在している状態で -->
- カテゴリA
- カテゴリB
- カテゴリC
- カテゴリD
<!-- カテゴリ名によりclass名を切り替える -->
<mt:If tag="CategoryLabel" eq="カテゴリA">
<p class="red"><$mt:CategoryLabel$></p>
<mt:ElseIf eq="カテゴリB">
<p class="blue"><$mt:CategoryLabel$></p>
<mt:Else>
<p class="yellow"><$mt:CategoryLabel$></p>
</mt:If>
前述の通り、閉じタグ(</MTElseIf>
)は省略可です(かえって見づらくなるため、筆者はまったくつけていません)
また、name
やtag
などのモディファイアを指定することでMTElseIf
と同じ挙動になりますが、これもかえってわかりにくくまた見づらくなるため、MTElse
はそれ単独のタグとして利用することをオススメします。
MTIfやMTUnlessで予約変数を使用する
MTIf
やMTUnless
をループ処理を行うブロックタグ内で使用する場合、MTにあらかじめ用意されている予約変数をname
の値として利用できます。
このうち、以下はとくに利用する頻度が多いです。
-
__first__
:ループ出力の最初であればtrue -
__last__
:ループ出力の最後であればtrue
上記の予約変数は、MTEntries
におけるMTEntriesHeader
やMTEntriesFooter
のような独自の「一度だけ処理を実行する」タグが用意されていないブロックタグにおいて、代替手段になります。
MTIf
またはMTUnless
に上記予約変数を指定した場合、処理は以下のようになります。
-
MTIf
-
__first__
:ループ出力の最初に実行される -
__last__
:ループ出力の最後に実行される
-
-
MTUnless
-
__first__
:ループ出力の最初以外で実行される -
__last__
:ループ出力の最後以外で実行される
-
MTIfでの出力例
以下の例では、MTCategories
ブロックタグの出力において、MTIf
に予約変数を指定して、ループの最初に<ul>
、ループの最後に</ul>
を出力しています。
<!-- MT記述 -->
<mt:Categories>
<mt:If name="__first__">
<ul>
</mt:If>
<li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
<mt:If name="__last__">
</ul>
</mt:If>
</mt:Categories>
<!-- HTML出力 -->
<ul>
<li><a href="">カテゴリA</a></li>
<li><a href="">カテゴリA-1</a></li>
<li><a href="">カテゴリA-2</a></li>
<li><a href="">カテゴリB</a></li>
<li><a href="">カテゴリB-1</a></li>
<li><a href="">カテゴリB-2</a></li>
<li><a href="">カテゴリC</a></li>
<li><a href="">カテゴリC-1</a></li>
<li><a href="">カテゴリC-2</a></li>
</ul>
MTUnlessでの出力例
以下の例では、MTCategories
ブロックタグの出力において、MTUnless
に予約変数を指定しています。ループの最初の<ul>
およびループの最後の</ul>
が出力されず、HTMLとして構文エラーとなります。
<!-- MT記述 -->
<mt:Categories>
<mt:Unless name="__first__">
<ul>
</mt:Unless>
<li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
<mt:Unless name="__last__">
</ul>
</mt:Unless>
</mt:Categories>
<!-- HTML出力 -->
<li><a href="">カテゴリA</a></li>
</ul>
<ul>
<li><a href="">カテゴリA-1</a></li>
</ul>
<ul>
<li><a href="">カテゴリA-2</a></li>
</ul>
<ul>
<li><a href="">カテゴリB</a></li>
</ul>
<ul>
<li><a href="">カテゴリB-1</a></li>
</ul>
<ul>
<li><a href="">カテゴリB-2</a></li>
</ul>
<ul>
<li><a href="">カテゴリC</a></li>
</ul>
<ul>
<li><a href="">カテゴリC-1</a></li>
</ul>
<ul>
<li><a href="">カテゴリC-2</a></li>
MTIfやMTUnlessを入れ子にして使用する
MTIf
やMTUnless
の条件分岐の中で、さらに条件分岐することが可能です。
以下の例では、
- 全ページ共通のCSSとして
css/style.css
を読み込み - コンテンツタイプのテンプレートの場合は追加で
css/style_content.css
を読み込み - コンテンツタイプのIDが2の場合はさらに追加で
css/content_news.css
を読み込む
という処理をしています。
<link rel="stylesheet" href="<$mt:WebsiteURL$>css/style.css">
<mt:If name="contenttype_archive">
<link rel="stylesheet" href="<$mt:WebsiteURL$>css/style_content.css">
<mt:If tag="ContentTypeID" eq="2">
<link rel="stylesheet" href="<$mt:WebsiteURL$>css/content_news.css">
</mt:If>
</mt:If>
Discussion