ブロックの出力対象がなかったときの処理

Movable Typeでは、記事の一覧を出力したり、条件によって処理を分けたりなど、ブロック内を繰り返したり条件判断したりする際に、「ブロックタグ」を使います。
場合によっては、ブロック内で出力対象になるものが何もない場合があります。
例えば、記事がないブログでMTEntriesタグのブロックを使うと、何も出力されません。
このような「出力がなかった時」の処理を行う方法を紹介します。

1.MTElseタグで処理する

多くのブロックタグでは、ブロック内にMTElseタグの部分を入れることができます。
ブロックで何も出力されなかったときに、MTElseタグの部分が出力されます。

<mt:XXX>
  記事等の情報を出力する部分
<mt:Else>
  ブロック内で何も出力するものがなかったときに出力する部分
</mt:XXX>

例えば、記事の一覧を出力する際に、記事がない場合に「記事がありませんでした」と出力する場合は、以下のようにテンプレートを組みます。

<mt:Entries>
  <mt:EntriesHeader><ul></mt:EntriesHeader>
  <li><$mt:EntryTitle$></li>
  <mt:EntriesFooter></ul></mt:EntriesFooter>
<mt:Else>
  <p>記事がありませんでした</p>
</mt:Entries>

2.条件判断で処理する

ブロックタグによっては、MTElseタグを使う書き方に対応していないものもあります。
その場合は、「ブロック内を処理したかどうか」を、条件判断するようにします。
書き方は以下のようになります。

<$mt:SetVar name="flag" value="0"$>
<mt:XXX>
  記事等の情報を出力する部分
  <$mt:SetVar name="flag" value="1"$>
</mt:XXX>
<mt:Unless name="flag">
  ブロック内で何も出力するものがなかったときに出力する部分
</mt:Unless>

ブロックに入る前に、変数flagの値を0にしておきます(1行目)。
ブロック内で何かが出力されたときには、4行目のMTSetVarタグで、変数flagの値が1に変わります。
一方、ブロック内で何も出力されなかったときには、4行目のMTSetVarタグは実行されないので、変数flagの値は0のままです。

ブロックの処理が終わった後に、MTUnlessタグを使って、変数flagの値が0かどうかを判断します。
上の話より、ブロック内で何も出力されていなければ、変数flagの値は0ですので、条件が成立します。
したがって、「ブロック内で何も出力するものがなかったときに出力する部分」が出力されます。

一方、ブロック内で何かを出力したときには、変数flagの値は1です。
したがって、条件は成立せず、MTUnlessタグのブロック内は出力されません。

例えば、MTEntryPreviousタグで、前の記事へのリンクを出力したいとします。
ただし、前の記事がないときには、「前の記事はありません」という出力したいとします。
この場合は、以下のようにテンプレートを組みます。

<$mt:SetVar name="flag" value="0"$>
<mt:EntryPrevious>
  <a href="<$mt:EntryPermalink encode_html="1"$>" title="<$mt:EntryTitle encode_html="1"$>">前の記事</a>
  <$mt:SetVar name="flag" value="1"$>
</mt:EntryPrevious>
<mt:Unless name="flag">
  前の記事はありません
</mt:Unless>

MT Cloud Starter Kit
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください