今月/来月の記事一覧を出力する(後編)

昨日に続いて、今月/来月の記事一覧を出力する方法を紹介します。
今日は、今月または来月の記事がない場合に、「記事はありません」と出力できるようにする方法を取り上げます。

1.今月/来月の記事をいったん変数に代入する

昨日のテンプレートでは、今月/来月の記事一覧を直接に出力します。
ただし、MTArchiveListタグは、記事がないアーカイブは一切出力しません。
今月(または来月)に記事がない場合、その月については、MTArchiveListタグのブロック内が処理されません。
結果として、今月(または来月)に記事がないと、その部分には何も出力されなくなってしまいます。

そこで、今月/来月の記事を直接に出力せずに、いったんハッシュに代入します。
そして、後でハッシュの内容を確認し、記事があるかどうかを判断してから、出力するようにします。

昨日の記事のMTEntriesタグのブロックをMTSetVarBlockタグで囲み、ハッシュに代入します。
ハッシュのキーとして、「201201」のような年月(変数this_monthやnext_monthの値)を使います。
そして、ハッシュの値として、出力する記事一覧を代入します。

例えば、今月が2012年2月だとします。
この場合、今月と来月の両方に記事があれば、ハッシュの内容は以下のようになります。

キー
2012022012年2月の記事一覧
2012032012年3月の記事一覧

一方、2012年2月に記事があって、3月に記事がない場合は、3月についてはMTArchiveタグのブロックが実行されません。
そのため、ハッシュの内容は以下のようになります。

キー
2012022012年2月の記事一覧

このようにしてハッシュを作った後、ハッシュに今月/来月の要素があるかどうかを条件判断します。
要素があれば(=記事一覧が代入されていれば)、その記事一覧を出力します。
一方、要素がなければ、「記事はありません」と出力します。

2.テンプレートを書き換える

ここまでの話に基づいて、昨日紹介したテンプレートを書き換えると、以下のようになります。

<$mt:Date format="%Y%m" setvar="this_month"$>
<$mt:GetVar name="this_month" op="++" setvar="next_month"$>
<mt:If name="next_month" like="13$">
  <$mt:Date format="%Y" setvar="next_year"$>
  <$mt:GetVar name="next_year" op="++" setvar="next_month"$>
  <$mt:SetVar name="next_month" append="1" value="01"$>
</mt:If>

<mt:Blogs include_blogs="2">
  <mt:ArchiveList archive_type="Monthly">
    <$mt:ArchiveDate format="%Y%m" setvar="archive_month"$>
    <$mt:SetVar name="flag" value="0"$>
    <mt:If name="archive_month" eq="$this_month">
      <$mt:SetVar name="flag" value="1"$>
    <mt:Else name="archive_month" eq="$next_month">
      <$mt:SetVar name="flag" value="1"$>
    </mt:If>
    <mt:If name="flag">
      <mt:SetVarBlock name="entries" key="$archive_month">
      <h2><$mt:ArchiveDate format="%Y/%m"$></h2>
      <mt:Entries>
      <div>
        <h3><$mt:EntryTitle$></h3>
        <$mt:EntryBody$>
      </div>  
      </mt:Entries>
      </mt:SetVarBlock>
    </mt:If>
  </mt:ArchiveList>
</mt:Blogs>

<mt:If name="entries" key="$next_month">
  <$mt:GetVar name="entries" key="$next_month">
<mt:Else>
  <h2><$mt:Date ts="$next_month" format="%Y/%m"></h2>
  <div><p>記事はありません。</p></div>
</mt:If>
<mt:If name="entries" key="$this_month">
  <$mt:GetVar name="entries" key="$this_month">
<mt:Else>
  <h2><$mt:Date ts="$this_month" format="%Y/%m"></h2>
  <div><p>記事はありません。</p></div>
</mt:If>

昨日のリストと比べると、19/27行目のMTSetVarBlockタグと、32行目以降が追加になっています。

19/27行目のMTSetVarBlockタグは、今月および来月の記事一覧を、「entries」という名前のハッシュに代入する働きをします。
ハッシュのキーとして、変数archive_monthの値を指定していますので、キーは「201201」などの年月の値になります。

32~37行目は、来月に記事があるかどうかを判断して、出力を分ける部分です。
32行目のMTIfタグでは、ハッシュentriesの中で、キーが来月の月(変数next_month)になっている要素があるかどうかを判断しています。

要素があれば、33行目によって、その値が出力されます。
ハッシュの値には、19~27行目のMTSetVarBlockタグによって、個々の月のブログ記事一覧が代入されていますので、結果として来月のブログ記事一覧が出力されます。

一方、ハッシュに要素がない場合は、32行目のMTIfタグが成立せず、34行目のMTElseタグ以降によって、「記事はありません」と出力されます。

38~43行目では、32~37行目と同様の考え方で、今月の記事があるかどうかを判断して出力を分けています。

3.変数や条件判断は必須

Movable Type 5.1 Webサイト製作ガイドVolume 2この例のように、手の込んだ処理をしようとすると、変数や条件判断を避けて通ることができません。
拙著「Movable Type 5.1 Webサイト製作ガイドVolume 2」では、変数や条件判断について、かなり詳しく解説しています。
「変数や条件判断がよく分からない」という方は、ぜひ拙著をお読みください。