年毎の月別リスト(何)の完成...と覚書(^^;
何の話かというと,7月頃に書いたこれのこと.
実はこれにも若干欠点があって,エントリーの無い月については表示すらされないのですよね.んで,いつだったかMT系のサイトを読み漁っていたら,おあつらえ向き(はぁ?)に俺のほぼ希望通りのテンプレートをカスタマイズ例として公開しているところが2箇所ありまして,早速これを参考にテンプレートモジュール(ユーティリティ)を変更してみたのです.
んがしかし,これにも実は2つほど欠点がありまして...
- 問答無用で1月~12月までループするので,最新年のエントリが1月だけであっても1月~12月まで表示される.
- リンクの有無のみをチェックしてハイパーリンクを張っているため,該当する月別アーカイブに関連して出力したい数値(例えば,エントリー数等)を持ってくることが出来ない.
というのがありまして,先月までは「まぁ,しょうがないか」と思いつつ当該テンプレートを使っておりました.
ところが,何の拍子かは知りませんが(苦笑),先日自分で改良を加えたところ欠点のうちの1番目の方が解決してしまいました.まだ2番目の方が解決していませんが,まぁこれは文字列の条件付き切り出しが出来ないと駄目っぽいのでひとまず公開してみることににに(ぉぃ
<dl class="mlist"> <MTArchiveList archive_type="Individual" lastn="1"> <MTSetVarBlock name="endy"><$MTArchiveDate format="%Y"$></MTSetVarBlock> <MTSetVarBlock name="endm"><$MTArchiveDate format="%B"$></MTSetVarBlock> </MTArchivelist> <MTArchiveList archive_type="Yearly"> <MTSetVarBlock name="year"><$MTArchiveDate format="%Y"$></MTSetVarBlock> <dt><a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y/"$>"><$MTArchiveDate format="%Y年"$></a>(<$MTArchiveCount$>)</dt> <MTSetVarBlock name="month"> <MTArchiveList archive_type="Monthly"> <$MTArchiveDate format="_%B_"$> </MTArchiveList> </MTSetVarBlock> <MTIf name="year" ne="$endy"><MTSetVar name="endm" value="12"></MTIf> <dd><ul><MTFor var="m" from="1" to="$endm"> <MTSetVarBlock name="mon">_<$MTGetVar name="m"$>_</MTSetVarBlock> <MTIf name="month" like="$mon"> <li><a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y"$>/<$MTGetVar name="m" zero_pad="2"$>/" title="<$MTArchiveDate format="%Y"$>年<$MTGetVar name="m" sprintf="%d月"$>"><$MTGetVar name="m" sprintf="%d月"$></a></li> <MTElse> <li><$MTGetVar name="m" sprintf="%d月"$></li> </MTIf> </MTFor></ul></dd> </MTArchiveList> </dl>
一応解説してみると...まず最新の個別エントリーを1つだけ取り出して,年と月を変数に格納しておき(endyとendm),そのうえで年別アーカイブのループを作り,年部分を別の変数に格納(year)→年部分のリンクを表示→その年内で存在する月別アーカイブの月数を加工したもの(1月だけなら「_1_」,1月から4月と,7月の実質5ヶ月なら「_7__4__3__2__1_」という感じ)で分を変数に格納(month).
んで,ここからがキモなんだけど,endyとyearを比較して一致しない場合のみ,endmを12に上書き→1月~endm月までのループ→_m_とmonth内の文字を比較して存在するのであれば,リンクがあればリンク付の月を出力,無ければ月のみを出力...といった感じになっています.
上記テンプレートを組み込んだ結果は,ユーティリティのArchives部分を見ると分かるとおり,最新年のみ最新エントリーのある月までで表示が止まっています.うん,すっきり(何が?).
それにしても,アーカイブループを囲む形で<MTSetVarBlock>
を置くと,1個だけじゃなくて,ループ内に存在するものをまとめて一つの変数に格納してくれるんですね.いや勿論取り出す際の処理としてforとかloopとかが必須になるだろうし,俺自身理解するまでに相当時間がかかりましたけど.うまくはまってくれるとこれはかなり良い仕様(というのか?)なのかもしれないですね.
- 2008-10-02 21:50追記
俺自身微妙に勘違いして覚えていた部分があったので修正しました(^^;
- 2008-10-02 23:20追記
今さっき,ようやく2番目の課題をクリアできましたよ(^^).以下に完成形をあげておきます.
<dl class="mlist"> <MTArchiveList archive_type="Individual" lastn="1"> <MTSetVarBlock name="endy"><$MTArchiveDate format="%Y"$></MTSetVarBlock> <MTSetVarBlock name="endm"><$MTArchiveDate format="%B"$></MTSetVarBlock> </MTArchivelist> <MTArchiveList archive_type="Yearly"> <MTSetVarBlock name="year"><$MTArchiveDate format="%Y"$></MTSetVarBlock> <dt><a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y/"$>"><$MTArchiveDate format="%Y年"$></a>(<$MTArchiveCount$>)</dt> <MTArchiveList archive_type="Monthly"> <MTSetVarBlock name="month"><$MTArchiveDate format="%B"$></MTSetVarBlock> <MTSetVarBlock name="count" index="$month"><$MTArchiveCount$></MTSetVarBlock> </MTArchiveList> <MTIf name="year" ne="$endy"><MTSetVar name="endm" value="12"></MTIf> <dd><ul><MTFor var="m" from="1" to="$endm"> <MTIf name="count" index="$m"> <li><a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y"$>/<$MTGetVar name="m" zero_pad="2"$>/" title="<$MTArchiveDate format="%Y"$>年<$MTGetVar name="m" sprintf="%d月"$>(<$MTGetVar name="count" index="$m"$>)"><$MTGetVar name="m" sprintf="%d月"$></a></li> <$MTSetVar name="count" index="$m" value="0"$> <MTElse> <li><$MTGetVar name="m" sprintf="%d月"$></li> </MTIf> </MTFor></ul></dd> </MTArchiveList> </dl>
どうせループさせるのなら,わざわざ1個の変数に存在する月を全部格納するのではなく,月を添え字にした配列変数(count[month])を作るようにして,それぞれの月のエントリー数を格納するようにしました.これならループ内で変数を設定したうえでlike比較をしなくても,count[month]があるかどうかだけを確認すればいいのでより確実なのかもしれません.
...ただし,count[month]内の数値を取り出して使った直後は,必ずcount[month]の中身をクリアしておくのを忘れずに(後で気づいた←アホ).
Comments:0