📃

【Movable Type】条件分岐する

2024/12/17に公開

概要

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

MTIfMTUnlessで指定した条件に合致しない場合に実行される。MTEntriesMTPagesなど一部のブロックタグでも利用可。閉じタグ(</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>)は省略可です(かえって見づらくなるため、筆者はまったくつけていません)
また、nametagなどのモディファイアを指定することでMTElseIfと同じ挙動になりますが、これもかえってわかりにくくまた見づらくなるため、MTElseはそれ単独のタグとして利用することをオススメします。

MTIfやMTUnlessで予約変数を使用する

MTIfMTUnlessをループ処理を行うブロックタグ内で使用する場合、MTにあらかじめ用意されている予約変数nameの値として利用できます。
このうち、以下はとくに利用する頻度が多いです。

  • __first__:ループ出力の最初であればtrue
  • __last__:ループ出力の最後であればtrue

上記の予約変数は、MTEntriesにおけるMTEntriesHeaderMTEntriesFooterのような独自の「一度だけ処理を実行する」タグが用意されていないブロックタグにおいて、代替手段になります。

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を入れ子にして使用する

MTIfMTUnlessの条件分岐の中で、さらに条件分岐することが可能です。
以下の例では、

  • 全ページ共通の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