NORIのFlashユーザのためのMovable Type講座 gihyo.jp版

第7回 コメントをXMLでフィードバック

この記事を読むのに必要な時間:およそ 5.5 分

MTタグで変数を使用して計算する

MTタグを使用して四則演算をするには,<$mt:SetVar$>でopモディファイアを使用します。すると,自動的にその変数に演算結果が代入されます。

このopモディファイアは,変数の値が数値同士の場合のみ有効です。

  • add または +: 加算
  • sub または -: 減算
  • mul または *: 乗算
  • div または /: 除算
  • mod または %: 剰余
  • inc または ++: インクリメント(1増加)
  • dec または --: デクリメント(1減少)

たとえば,変数ageを使って計算をする場合は,次のように書きます。

<$mt:SetVar name="age" op="+" value="100"$>
//age+=100

<$mt:SetVar name="age" op="-" value="2"$>
//age-=2

<$mt:SetVar name="age" op="*" value="3"$>
//age*=3

<$mt:SetVar name="age" op="/" value="4"$>
//age/=4

<$mt:SetVar name="age" op="%" value="5"$>
//age%=5

<$mt:SetVar name="age" op="++"$>
//age++

<$mt:SetVar name="age" op="--"$>
//age--

上記のMTタグだけでは,計算結果を出力しません。出力したいタイミングで<$mt:GetVar name="age"$>を使用します。

 opモディファイアは,<$mt:SetVar>でも使用できますが,演算結果を計算と同時に出力するため,変数そのものは演算前のままであることなど<$mt:SetVar>の時とは違う動作をします。

変数がひと通り使えるようになったので,次は実際にコメント欄に挿入されている値を取り出し,合計値を取得してみましょう。

詳細はMovable Type 4.1で強化されるMTタグの新機能 opモディファイアをご覧ください。

エントリーごとにコメント欄を調べる

エントリー毎のコメント欄をみたい場合は,ブロックタグ<mt:Entries>の中にさらに,<mt:Comments>というブロックタグを記述します。

コメントの本文は,<$mt:CommentBody$>で取得でき,<mt:Comments>ブロックタグの中は自動的にコメントの数だけループ処理されます。同様に,<mt:Entries>もエントリーの数だけ自動的にループ処理されます。そのため,すべてのエントリーとコメントを調べることができます。

まとめると,次のようになります。

 コメントとして<mt:Ignore>タグを使用しています。このタグの間のテキストはコメントとして処理され,再構築しても無視されます。

<mt:Entries>
<mt:Ignore>***********エントリー開始***********</mt:Ignore>
<mt:Comments>
<$mt:CommentBody$>
</mt:Comments>
<mt:Ignore>***********エントリー終了***********</mt:Ignore>
</mt:Entries>

 テスト用インデックステンプレート

図 テスト用インデックステンプレート

テスト用にインデックステンプレートを新規作成し,出力ファイル名もtest.txtなどとしてMTタグを試します。

再構築すると,<$mt:CommentBody$>の中にすでに入っている<p>タグもいっしょに出力されています。このままでは計算できませんので,htmlタグを削除するモディファイア(remove_html="1")をいっしょに指定して削除します。

また,エントリーのタイトルを表示(<$mt:EntryTitle$>)して,切れ目をわかりやすくしました。

<mt:Entries>
<mt:Ignore>***********エントリー開始***********</mt:Ignore>
<$mt:EntryTitle$>
<mt:Comments>
<$mt:CommentBody remove_html="1"$>
</mt:Comments>
<mt:Ignore>***********エントリー終了***********</mt:Ignore>
</mt:Entries>

これで,コメント欄から数値だけが抜き出されました。

次は,それを変数に代入して加算処理を繰り返すことで合計値を求めてみましょう。

コメントの数値を合計する

コメントの中の数値を加算していくのは,op="+"で行います。この処理をするためにresultという変数を使用しました。

resultがすべてのエントリーを対象にして合算するのを防ぐため,<mt:Comments>が始まる前に,毎回初期化します。⁠<$mt:SetVar name="result" value="0" $>)

<mt:Entries>
<mt:Ignore>***********エントリー開始***********</mt:Ignore>
<$mt:EntryTitle$>
<$mt:SetVar name="result" value="0" $>
<mt:Comments>
<mt:SetVarBlock op="+" name="result"><$mt:CommentBody remove_html="1"$></mt:SetVarBlock>
</mt:Comments>
<mt:Ignore>***********エントリー終了***********</mt:Ignore>
</mt:Entries>

コメント総数を調べる

平均値は,コメントの数値の合計÷コメント総数 で求められます。コメント総数は,次のMTタグ <$mt:EntryCommentCount$> を使用すると求められます。

その値を変数countに代入するために<mt:SetVarBlock name="count"><$mt:EntryCommentCount$></mt:SetVarBlock>を使用して,ブロックタグ<mt:Entries>のあと,かつ<mt:Comments>の前に記述します。

<mt:Entries>
<mt:Ignore>***********エントリー開始***********</mt:Ignore>
<$mt:EntryTitle$>
<$mt:SetVar name="result" value="0" $>
<mt:SetVarBlock name="count"><$mt:EntryCommentCount$></mt:SetVarBlock>
<mt:Comments>
<mt:SetVarBlock op="+" name="result"><$mt:CommentBody remove_html="1"$></mt:SetVarBlock>
</mt:Comments>
<mt:Ignore>***********エントリー終了***********</mt:Ignore>
</mt:Entries>

著者プロフィール

NORI(伊藤のりゆき)

Twitter:@nori_togoru

有限会社トゴル・カンパニー代表。Flashアクセシビリティをきっかにアクセシビリティ全般に興味を持つ。UIデベロッパとして企業用WebアプリケーションのUIデザインを行う。写真集「Snap or Nothing写真集」(iTunes AppStoreにて)をリリースするなど写真家としても活動している。