top

月別アーカイブを年毎に区切ってみる(5) 月リストのみ編

月別アーカイブリストに年見出しをつける・年ごとに区切る、のならこちらの方法で出来ます。ところがMT4.2から少し仕様が変わったのか、4.2からは「年アーカイブ」を作っておかないと
MTArchiveList に archive_type="Yearly"が使えなくなってなってしまいました。というか、年アーカイブなしでarchive_type="Yearly"が使えていた4.1の方がおかしかったのであって、4.2で本来あるべき姿に戻ったとも言える気もしますが(^^;。

ここからが本題。年アーカイブを使う予定があるならいいのですが、年アーカイブを使う予定はない場合はどうしたらよいか? この場合、ダミー用年アーカイブを作って、再構築オプションを「手動」または「使用不可」にしておくという方法がありますが、年見出しのためだけに使わないアーカイブを作るのもしっくりこない、という場合もあるかもしれません。

そこで年リストは使わず、月リストarchive_type="Monthly"のみで「年見出し・年ごとの区切り」をつける方法も覚え書きしておきます。

補足とお断り:
小粋空間yujiroさんの本「Movable Type 4.2 パーフェクトガイド」にこれと同じカスタマイズが載っています。が、惜しいことにダイナミック・パブリッシングで上手く動作しませんorz。本で紹介されているJunnamaさんの方法でもダイナミックだと上手く動作しません(最初の年が2回表示される)。「パーフェクトガイド」の内容を知る前にこちらを元ネタに自分で考えていたサンプルと見比べてみたことろ、考え方の基本は同じだけどタグの組み方は同じではなかったので、ダイナミックでこのカスタマイズを使いたい場合用に「ダイナミックで動作する版」としてエントリーすることにしました。

■年も月も降順
通常の月リストに年見出しをつけるだけ、という基本的なものです。

基本・原理
こちらのカテゴリーアーカイブを年(月)で区切るのと原理は同じです。

<MTArchiveList archive_type="Monthly">
<MTSetVarBlock name="thisyear"><$MTArchiveDate format="%Y"$></MTSetVarBlock>
<MTUnless name="year" eq="$thisyear">
<$MTGetVar name="thisyear"$>年<br />
<MTSetVarBlock name="year"><$MTGetVar name="thisyear"$></MTSetVarBlock>
</MTUnless>
<a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a><br />
</MTArchiveList>

<ul><li>マークアップ版
上の基本形を<ul><li>でマークアップできるようにしたもの。赤字の部分が年見出しになります。これだと年見出しも<div>や<h3>で囲むなど独自のマークアップが出来るので、折りたたみのカスタマイズも導入できるようになるなど、ダイナミックでの応用範囲も広がると思います。

<MTSetVarBlock name="fyear"><MTArchiveList archive_type="Monthly" lastn="1"><$MTArchiveDate format="%Y"$></MTArchiveList></MTSetVarBlock>
 
<MTArchiveList archive_type="Monthly">
<MTSetVarBlock name="thisyear"><$MTArchiveDate format="%Y"$></MTSetVarBlock>
 
<MTUnless name="year" eq="$thisyear">
<MTIf name="fyear" ne="$thisyear"></ul></MTIf>
<$MTGetVar name="thisyear"$>年<ul>
<MTSetVarBlock name="year"><$MTGetVar name="thisyear"$></MTSetVarBlock>
</MTUnless>
 
<li><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a></li>
 
<MTArchiveListFooter></ul></MTArchiveListFooter>
</MTArchiveList>

■年を降順・月を昇順
単純に月リストに年見出しをつけるのではなく、以下のようにコンパクト化して並べたい場合は、年は降順でも月は昇順にしたくなります。

2007年
1月 2月 3月 4月 5月 6月
2006年
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

どうやって月部分を昇順にしよう…と考えて、4.1から使えるようになった<MTLoop>のsort_byモディファイアを使って並べ替えることを思いつきました。(*ちなみに月を昇順にする方法は「パーフェクトガイド」の方がずっとスマートでおすすめです。<MTLoop>を使わずに見事に組まれているので、本を持ってる方は是非参考にしてみて下さい~)

<MTSetVarBlock name="year"><MTArchiveList archive_type="Monthly" lastn="1"><$MTArchiveDate format="%Y"$></MTArchiveList></MTSetVarBlock>
 
<MTArchiveList archive_type="Monthly">
<MTArchiveListHeader>
<dl>
<dt><$MTArchiveDate format="%Y"$>年</dt>
</MTArchiveListHeader>
<MTSetVarBlock name="thisyear"><$MTArchiveDate format="%Y"$></MTSetVarBlock>
 
<MTIf name="year" ne="$thisyear">
<dd><MTLoop name="mlist" sort_by="value"><$MTVar name="__value__"$></MTLoop></dd>
<MTSetVar name="mlist" function="undef">
<dt><$MTArchiveDate format="%Y"$>年</dt>
<MTSetVarBlock name="year"><$MTArchiveDate format="%Y"$></MTSetVarBlock>
</MTIf>
 
<MTSetVarBlock name="push(mlist)"><a href="<$MTArchiveLink$>"><$MTArchiveDate format="%B"$>月</a> </MTSetVarBlock>
 
<MTArchiveListFooter>
<dd><MTLoop name="mlist" sort_by="value"><$MTVar name="__value__"$></MTLoop></dd>
</dl>
</MTArchiveListFooter>
</MTArchiveList>

基本原理は上の「年月降順版」と同じですが、<MTLoop>を組み込むために多少アレンジしてあります。
まずArchiveListHeaderを使って最初の年見出しはそこで出力。

緑字の部分は年が変わる時に1回だけ出力される部分(年見出し用)なので、その中にあらかじめセットしておいた月リストを出力させるようにしています。

青字の部分で年が変わるまでの月リストが出てくるのですが、そこでは出力はさせず配列にセットするだけにしておきます。それが年が変わったタイミングで出力される、という形にしてるわけです。

ここで再び緑字の部分にループする(戻る)わけですが、月リストの出力が終わった時点で<MTSetVar name="mlist" function="undef">として、いったん変数mlistの中身をクリアします(そうしないと次の年に前年のリストが残ってしまうので)。年見出しを出したらyearに年をセットし直して緑字の部分を抜けます。そして青字の部分に入り、空になったmlistに次の年の月リストをセットしていきます。その繰り返しで「年見出し」「月リスト」を出しています。

一番最後の月リストはそれより古い年が存在しないので、ArchiveListFooterの中で出力させています。
4.1、4.2とも静動で同じ表示になることを確認しています。

☆変数の組み方は本当に様々で、同じ結果を出すにも「道は1つではない」ことを実感させてもらいました。「自分ならどう組むか? 他にどんな組み方があるだろうか?」と頭をひねっていろいろ考えてみるのも楽しいと思います。

<2008.9.7>「年」となるべきところが「月」になっていたのを修正。

 

トラックバックの一覧

トラックバック MT4.21について  »» 2008年9月 7日 01:14
MT4.14に入れ替えた時書いた方法そのままで入れ替えは完了できましたが、いくつ...

コメント

さんこうになりました

ありがとうございます!

TAEKOさん~
お疲れ様っす!!!
年は縦並びで月は横並びで
月の横に記事数を( )で表示したいのですが
どこに組んだら良いか?

MT5で無事に動きだしました
色々とありがとうございました。

すみません。。。
使いたいアーカイブページはMT4.13です

>BIG_JUNさん
こんにちは。MT5、順調のようでよかったです。^^

>月の横に記事数を( )で表示したい
青字の部分に追加するといいと思います。
例:<$MTArchiveDate format="%B"$>月(<$MTArchiveCount$>)

この辺はMT5でもMT4でも変わりませんのでよろしくです。

TAEKOさん
早速、使わせてもらってます!!!
なるほど、、、サイドバー見てたらありました。
同じ書き方でイケるんっすね〜♬

Commentsもスパムが来なくなりました。
ホント、まったく来ないので安心です。
色々とありがとうございました。。。

BIG_JUN

>BIG_JUNさん
お役に立てたようで嬉しいです。
基本的なMTタグはどのバージョンでも同じに使えますよ~。
これからもよろしくお願いします。