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

MTCSで、ユーザーごとの全得票数を合計してみる。

こんばんは。

今日はお祝い事だったので、美味しいものを沢山いただいてしまった@cremaです。ひゃぁ、明日は節制だー!

さて、今日は、ちこっとMovable Typeの小ネタでも行きましょう。

Movable Typeコミュニティ・ソリューションでの記事に対する投票

Movable Typeコミュニティ・ソリューションのテンプレートセットである「コミュニティブログ」では、ひとつひとつのブログ記事に対して★のマークをクリックして「投票」することができます。

投票数はほぼリアルタイムで集計され、「この記事に対して幾つの★がついている」ということを見ることができます。

スクリーンショットで見ると、黒い星の中に「1」と書いてある部分が得票数ですね。

ph20090612.gif

「記事単位で幾つ★がついているか」というのは、このように見ることができるのですが、「あるユーザーが書いた記事を全て合計して、★が幾つついているか」というリストは、デフォルトでは見ることができないと思います。

ということで、それを書いてみるテスト。

まずはユーザーの名前をリストアップ

実験用に、新規のインデックステンプレートを作成し、適当な出力ファイル名をつけましょう。

コミュニティブログのユーザー一覧を引っ張ってくるのに使うのは、mt:Authorsブロックタグです。その中にmt:AuthorDisplayNameタグを書いてみましょう。

<mt:Authors>
<mt:AuthorDisplayName />
</mt:Authors>

ユーザーが4人いた場合、出力結果はこうなります。

太郎二郎花子良子

それぞれが書いたブログ記事の★の数をリストアップ

ここに、それぞれが書いたブログ記事の★の数をリストアップするべく、mt:Entriesなどを使ってみます。

<mt:Authors>
<mt:AuthorDisplayName /><mt:AuthorDisplayName setvar="authorDisplayName" />
<mt:Entries author="$authorDisplayName">
<mt:EntryScore namespace="community_pack_recommend" />
</mt:Entries>
</mt:Authors>

mt:AuthorDisplayName setvar="authorDisplayName"の部分で、一度ユーザー名を変数「authorDisplayName」に格納します。そしてそれを使ってmt:Entriesの出力結果を絞り込みますので、このような感じになります。

太郎 1 4 4 二郎 3 花子 4 2 良子 3

名前の後の数字が、mt:EntryScore namespace="community_pack_recommend"によって出力された、それぞれの記事についた★の数です。この場合、太郎さんは「★1個」「★4個」「★4個」と、★のついた記事を3つ持っているのです。


先ほど出力された数字を合計する

この、それぞれのユーザ名の後ろに並んだ数字の合計値を計算できれば、ユーザー名+それぞれのブログ記事の合計得票数を出せますね。

ということで、ここで変数を足します。

<mt:Authors>
<mt:AuthorDisplayName /><mt:AuthorDisplayName setvar="authorDisplayName" />
<mt:SetVar name="sum" value="0" />
<mt:Entries author="$authorDisplayName">
<mt:EntryScore namespace="community_pack_recommend" setvar="numStar" />
<mt:setVar name="sum" op="+" value="$numStar" />
</mt:Entries>
<mt:GetVar name="sum" />
</mt:Authors>
mt:Entriesの前に、mt:SetVar name="sum"を足し、変数「sum」を準備します。

mt:EntryScoreにsetvar="numStar"を追加し、名前の後の数字のひとつを変数「numStar」に格納。

mt:setVar name="sum" op="+" value="$numStar"の部分で、ループが廻るたびに変数「sum」に変数「numStar」が加算されていきます。

ループから抜けたあとに、mt:GetVar name="sum"で数値を出力。この数値が、それぞれのユーザーのブログ記事の合計得票数になります。

出力結果はこんな感じ。

太郎 9 二郎 3 花子 6 良子 3 

あとは、これに色々装飾を追加して素敵なリストに仕上げることができます。

説明はこれにて終了。お疲れ様でした。