備忘録:エントリーの無い月をグレーアウトする月別アーカイブリスト


そもそもmixiの↑のように表示したいのが始まりだった…


MTで普通に月別アーカイブリストを出すとこんな感じになりますね。

縦にダラーッと出すので、年月が経つにつれ冗長になっていきます。
そこでちょっと工夫すると、下記のようにできます。

ここまでは比較的簡単なんですが、mixiのように「記事の無い月」を表示してくれません。
どうにもMTは「記事の無い月なんぞ眼中にねェ!」と言わんばかりに、普通のやり方では出してくれません。出してくれないっていうか、そもそも「存在するアーカイブ一覧」という認識であって、年月で見られてません。
確かにゼロのものを出力するってのは処理として無駄だとは思うんですが、「無いものを明らかにする」っていうこともユーザビリティアクセシビリティの向上に繋がったりするんですよねぇ…


で、小一時間考えた結果…






できました(^q^)





コードは下記になります。


<MTIfArchiveTypeEnabled archive_type="Category-Monthly">

<MTArchiveList archive_type="Category-Monthly">
<MTSetVarBlock name="tempYM">temp_<$MTArchiveDate format="%Y%m"></MTSetVarBlock>
<MTSetVarBlock name="$tempYM"><$MTArchiveCount$></MTSetVarBlock>
</MTArchiveList>

<MTArchiveList archive_type="Category-Yearly">
<MTArchiveListHeader><ul></MTArchiveListHeader>
<li><$MTArchiveDate format="%Y"$>
<ul><MTFor var="i" from="1" to="12"><MTIf name="i" le="9"><MTSetVarBlock name="tempM">0<$MTVar name="i"$></MTSetVarBlock><MTElse><MTSetVarBlock name="tempM"><$MTVar name="i"$></MTSetVarBlock></MTIf><MTSetVarBlock name="tempYM">temp_<$MTArchiveDate format="%Y"$><$MTVar name="tempM"$></MTSetVarBlock>
<li><MTIf name="$tempYM"><a href="<$MTBlogRelativeURL$><$MTCategoryBasename$>/<$MTArchiveDate format="%Y"$>/<$MTVar name="tempM"$>/"><$MTVar name="tempM"$>月</a><MTElse><$MTVar name="tempM"$>月</MTIf></li>
</MTFor></ul>
</li>
<MTArchiveListFooter></ul></MTArchiveListFooter>
</MTArchiveList>

</MTIfArchiveTypeEnabled>

おおざっぱに、前編後編に分かれています。

前編解説

まず、月別アーカイブリストを普通に回しています。
ここで、記事のある年月にフラグを立てています。
記事のあるアーカイブ年月から「temp_200901」といった変数を生成し、その変数にその年月の記事数を入れています。
記事数は何件でも関係なく、正の数があることでフラグとしています。
ここは内部的にフラグを立てるだけで、何も出力しません。

後編解説

まず年単位のアーカイブリストから始まり、下記の処理を12回ループさせています。
前編のように年+ループ回数で「temp_200901」のような文字列を生成し、その文字列を変数名として見た時に、中に値が存在するか判別しています。
値があればリンクのされた月を書き出しています。



上記コードはカテゴリー別月別アーカイブになりますが、ArchiveListの属性値やリンクの書き方などを調整してもらえばどこでも使えると思います。

これでユーザビリティ顧客満足うp