linkerは「人と人」「人と情報」「人と物」をつなぐデザインユニットです。

MTの年別アーカイブで月毎にグルーピングされた記事一覧を表示

090601.gif

みなさん、こんにちは、まーしーです。
はやいもので今日から6月ですね。

先日はてブ経由で

MovableTypeで、こんな年別アーカイブページを出したい。 月毎にグルーピングされている感じ。 YYYY年M1月  ・記事A (YYYY年M1月DD日)  ・記事B (YYYY年M1月DD日)  ・.. - 人力検索はてな
http://q.hatena.ne.jp/1243005857

こういうのをはてなで見つけたので、勉強がてら少し作ってみよう!ということでやってみました。
(ダミーのエントリーつくるのが手間だったので、自分の日記でやってみたんですが数が多くてそれはそれでめんどくさいですね・・)
もっとうまい方法もあるかもしれないのですが、とりあえずの回答例くらいだと思っていただければと思います。
スマートな方法があったら是非とも教えてください。

サンプル年別アーカイブ

ということで 作ってみたテンプレートがこちら。

<h2><mt:ArchiveTitle></h2>
<mt:ArchiveTitle setvar="thisyear" />
<mt:SetVar name="match" value="1">
<mt:Entries sort_order="ascend">
<mt:SetVarBlock name="thisMonth"><mt:EntryDate format="%m" /></mt:SetVarBlock>
<mt:If name="match" eq="1">
<h3><mt:GetVar name="thisyear" /><mt:GetVar name="thisMonth" />月</h3>
<ul>
</mt:If>
<li><a href="<mt:EntryPermalink />"><mt:EntryTitle encode_html="1" /></a>(<mt:EntryDate />)</li>
<mt:EntryNext><mt:SetVarBlock name="entryMonth"><mt:EntryDate format="%m" /></mt:SetVarBlock></mtEntryNext>
<mt:If name="entryMonth" ne="$thisMonth">
</ul>
<mt:SetVar name="match" value="1">
<mt:Else>
<mt:SetVar name="match" value="0">
</mt:If>  
<mt:EntriesFooter>
<mt:If name="match" eq="0">
</ul>
</mt:If>
</mt:EntriesFooter>
</mt:Entries>

ざっくりサンプルはこちら。

テンプレート解説

年数を表示させるためにアーカイブタイトルをthisyearにセット。

<mt:ArchiveTitle setvar="thisyear" />

判定用の変数 match=1をセット

<mt:SetVar name="match" value="1">

1をセットしておかないと最初が表示されないのでまずは1としておきます。

エントリーを投稿した月をthisMonthにセット

<mt:SetVarBlock name="thisMonth"><mt:EntryDate format="%m" /></mt:SetVarBlock>

loop内での現在のエントリーと次のエントリーの投稿月が違う場合は月の見出しとリストのulを表示させたいので

<mt:If name="match" eq="1">
<h3><mt:GetVar name="thisyear" /><mt:GetVar name="thisMonth" />月</h3>
<ul>
</mt:If>

こんな感じにしてあります。

そして、現在のエントリーの投稿月と次のエントリーの投稿月が違うかどうか?を判定するために
entryMonthに次の月の投稿月をセットして条件分岐します。
次の月が違う場合は</ul>も必要になりますのでそれを記載した上でmatch=1とします。

<mt:EntryNext><mt:SetVarBlock name="entryMonth"><mt:EntryDate format="%m" /></mt:SetVarBlock></mtEntryNext>
<mt:If name="entryMonth" ne="$thisMonth">
</ul>
<mt:SetVar name="match" value="1">
<mt:Else>
<mt:SetVar name="match" value="0">
</mt:If>

mt:Else以下で matc=0を設定しないとずっと1になったままなので、0にしておく。

基本的にこれで問題ないんですが、現在の年(サンプルだと2009年)はこれだと最後の閉じタグが表示されませんね。
なのでmt:EntriesFooterに条件分岐を加えて</ul>を表示させるようにしてあります。

<mt:EntriesFooter>
<mt:If name="match" eq="0">
</ul>
</mt:If>
</mt:EntriesFooter>
</mt:Entries>

トレーニングしないと見えるモノもみえてきません

これを考えるのに参考になっているのは

MTSetVar(Block)/MTIfタグの具体的な利用例。 (Junnama Online (Mirror))
http://junnama.alfasado.net/online/2007/10/mtsetvarblockmtif.html  

のエントリーです。Junnamaさんほんとすげ〜。
ここの中で紹介されている

<MTSetVar name="match" value="1">

っていうのがすごく重要な考え方だと思いますね。
違うのを調べているときに検索でこの考え方をしってすごく感動させられました。
色々手をうごかしてトレーニングしないといけないですね。

個人的にはアーカイブ周りが苦手です。
どうもmt:Archive系のタグの使い方がうまくイメージできていない感じですので、
このあたりはトレーニングして慣れるしかないですね。