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

MovableTypeの個別エントリーでそのエントリーの投稿月の前後の月へのリンクを表示する方法

090917.gif

みなさん、こんにちは、まーしーです
昨日はlinkerの打ち合わせがあってすごく濃い議論ができました。
改めて、linkerいいですよ!!

個別アーカイブで前後の月別アーカイブへリンクさせたい

ここのところMT関係で考えていたのがサイドバーに表示させるカレンダーと前後の月別アーカイブへのリンクでした。月別アーカイブでは問題なく出来ますが、個別エントリーの場合はどうしたものかな?と。そこで昨日、

個別エントリーでそのエントリーの投稿月の前後の月へのリンク。ふむ。簡単にはいかないんだっけかな
http://twitter.com/mersy/status/4020477993  

と書いたら、@junnamaさんや@sivacchiさん、@apstarさん、@tinybeansさん、@kichi_roboさんがヒントとかを投げてくれました。
感謝感激です。ありがとうございます。
これを書いた後打ち合わせに出てしまって、反応が今日になってしまってほんと申し訳なかった感じです。
今朝から改めて考え直してこんな感じの未完成なソースまで作って、本日も打ち合わせへ。

<mt:ArchiveList archive_type="Monthly">
<MTSetVarBlock name="counter"><$MTGetVar name="__counter__"$></MTSetVarBlock>
<MTSetVarBlock name="monthlyarchive[$counter]"><a href="<mt:ArchiveLink />"><mt:ArchiveTitle /></a></MTSetVarBlock>
<mt:ArchiveListFooter>
<mt:SetVarBlock name="lastarchive"><$MTGetVar name="__counter__"$></mt:SetVarBlock>
</mt:ArchiveListFooter>
</mt:ArchiveList>
<mt:SetVarBlock name="prevarchive"><mt:GetVar name="$currentarchive" op="--"></mt:SetVarBlock>
<mt:SetVarBlock name="nextarchive"><mt:GetVar name="$currentarchive" op="++"></mt:SetVarBlock>
<mt:If name="lastarchive" gt="1">
<mt:GetVar name="monthlyarchive[$prevarchive]" />
</mt:If>
<mt:If name="nextarchive" le="lastarchive">
<mt:GetVar name="monthlyarchive[$nextarchive]" />
</mt:If>

このソースは中途半端で全然当てにならないので要注意。
打ち合わせおわってtwitterみてみると

Twitter / かたつむりくん: スタティックのテンプレートタグのみで出来ました! h ...
http://twitter.com/tinybeans/status/4048058464

というスバラシイのが。
帰宅してソースを見させてもらいました。う〜ん、スバラシイ。

自分で途中まで作りながら、当月をどうやって取得しようか?と考えていたのですが、@tinybeansさんは

<mt:If name="archive_title" eq="$crt_month">
        <$mt:Var name="count" setvar="crt_index"$>
</mt:If>

という形で解決されていました。なるほど!

<mt:Unless name="prev_index" eq="$arry_count">

の部分で現在のアーカイブが一番最後(例:index = 11)のとき、prevは12になり、キーの数12個(0 〜 11)と一致することになり、このときはprevは存在しません。

<mt:Unless name="next_index" eq="-1">

逆に最初だったとき(index = 0)のときnextは-1になりますので、mt:unlessで除いています。
これで、個別記事アーカイブでもそのエントリーが投稿された月の前後の月別アーカイブに移動することが出来ますね。

あらためて自分のをみてみると、最初最後の取り方がなかなかめんどくさそうな感じになってますね。

@tinybeansさんをはじめ、参考になる情報を頂いた皆様、どうもありがとうございました。
今回解決した方法以外で教えてもらった方法でもできないかを試してみたいと思います。

補足

記事を書き終わったら

@mersy 昨日のアレ(当該エントリの前後の月別アーカイブ)、MTSetVarTemplateつかって書いてみました http://bit.ly/OLIG6
http://twitter.com/apstar/statuses/4051155826

と@apstarさんがサクッと作られてました。
皆さんすごすぎ。(自分しょぼすぎ)

@apstarさんのはMT:ArchiveListのループの中で、当月の場合に

<MTIf name="LopDate" eq="$CurDate">
        <MTSetVarBlock name="strMonth[0]"><MTArchivePrevious><MTGetVar name="CreateData"></MTArchivePrevious></MTSetVarBlock>
        <MTSetVarBlock name="strMonth[1]"><MTGetVar name="CreateData"></MTSetVarBlock>
        <MTSetVarBlock name="strMonth[2]"><MTArchiveNext><MTGetVar name="CreateData"></MTArchiveNext></MTSetVarBlock>
</MTIf>

というかんじでstrMonthにセットするという方法が特徴的でスバラシイです。
昨日はこのことをおっしゃってたんですね。

う〜ん、みなさん、頭が柔らかいというか発想がすごいなぁ。

補足その2〜2009.9.18 6:30〜

@tinybeansさんもブログ記事にまとめてくれました。

Movable Typeの個別のブログ記事にその記事の投稿月の前後の月別アーカイブへのリンクを表示するカスタマイズ - かたつむりくんのWWW
http://www.tinybeans.net/blog/2009/09/18-060406.html

こちらもすごく参考になります!