MTのハッシュ変数について解説してみる
mt.Vicuna Forum Themeを作っていて使うようになったのが配列変数の仲間(というのか)であるハッシュ変数なんですが,なんか丁度いい具合にハッシュ変数に関する記事がWolaWolaに載ってますね(ハッシュに目覚めてしまいました・・・ - WolaWola).
俺自身以前からPerlを触っていたので,ハッシュ変数の存在については知っていたのですが,余り使う機会がなかったというのが正直なところでした.なのであまり良く理解できていなかったし,正直,テンプレートタグリファレンス | MovableType.jpのMTSetHashVarの説明を見てもよく理解出来る人はそうはいないと思います.そんな人に俺なりに解説してみようとということで書いてみますね(ぉ
配列変数とハッシュ変数の違い
ここは簡単に書いてしまいますが...
- 配列変数の場合
<MTSetVarBlock name="sample" index="0"><$MTEntryTitle$></MTSetVarBlock> <MTSetVarBlock name="sample" index="1"><$MTEntryDate$></MTSetVarBlock> <MTSetVarBlock name="sample" index="2"><$MTEntryAuther$></MTSetVarBlock> <MTSetVarBlock name="sample" index="3"><$MTEntryBody$></MTSetVarBlock>
- ハッシュ変数の場合
<MTSetVarBlock name="sample" key="文字列A"><$MTEntryBody$></MTSetVarBlock> <MTSetVarBlock name="sample" key="文字列X"><$MTEntryExpect$></MTSetVarBlock> <MTSetVarBlock name="sample" key="文字列H"><$MTEntryAuther$></MTSetVarBlock> <MTSetVarBlock name="sample" key="文字列D"><$MTEntryDate$></MTSetVarBlock>
格納する変数自体はどちらも一つずつですが,配列変数の場合は配列を構成するインデックス部分(通常インデックスと呼ばれます)が0から始まる数字になるのに対し,ハッシュ変数の場合は配列のインデックス部分(ハッシュキーと呼ばれます)が文字列となっています.
配列変数は予め出現順番が決まっているものを番号順に変数化していくことができるので,取り出すときはインデックス部分を参照することにより順番はそのままで参照することが可能です.一方,ハッシュ変数はインデックス部分が文字列であるため,順番に関係なく前後の文字列をまとめて変数化し取り出したいときに使います.
なお,配列変数もハッシュ変数も,連続して取り出す際はMTLoopやMTForを使って取り出します.もちろん,普通にMTGetVarを使って取り出しても問題ありません.
ハッシュ変数の使用例
配列変数の使用例については,当サイトでも何度か配列を使ったテンプレートをエントリーしているので省略するとして,ここではハッシュ変数の使用例を書いてみます.
ちょうど掲示板を作っている時に思いついたのですが,メンバープロフィールには「最近のアクション」という,今までユーザーがコメントやエントリー投稿を行ったものを時系列に表示する部分があります.これはMTActionsというブロックタグを使用して実現しているのですが,MTActionsはユーザーのアクションを表示するためのタグとして書かれています.多分ブログ全体でも機能するのでしょう(これから試してみます)が,これをハッシュ変数を使って実現してみることにします.
<$MTSetVar name="ct" value="0"$> <MTEntries lastn="15"> <MTSetVarBlock name="ne_dt"><$MTEntryDate format="%Y%m%d%H%M"$></MTSetVarBlock> <MTSetVarBlock name="action" key="$ne_dt"> <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li></MTSetVarBlock> </MTEntries> <MTComments lastn="15" sort_order="descend"> <MTSetVarBlock name="ne_dt"><$MTCommentDate format="%Y%m%d%H%M"$></MTSetVarBlock> <MTCommentEntry> <MTSetVarBlock name="ftitle"><$MTEntryTitle$>へのコメント</MTSetVarBlock> </MTCommentEntry> <MTSetVarBlock name="action" key="$ne_dt"> <li><a href="<$MTCommentLink$>"><$MTGetVar name="ftitle"$> (<$MTCommentAuthor$>)</a></li></MTSetVarBlock> </MTComments> <ul> <MTLoop name="action" sort_by="key numeric reverse"> <$MTSetVar name="ct" op="+" value="1"$> <MTIf name="ct" le="15"><$MTGetVar name="__value__"$></MTIf> </MTLoop> </ul>
一応解説すると,インデックス部分には「年月日時分」という数値の文字列(12桁)を使用するため,最初に変数$ne_dtに保存しておき,変数$ne_dtをインデックス部分としたハッシュ変数$actionを作成しています.変数本体の内容は,タイトルにハイパーリンクを貼った状態の文字列となっています.
これを最新15個のエントリーと最新のコメント15個に対し行なった後,MTLoopでハッシュ変数$actionを呼び出し,インデックス部分$ne_dtを数値として判定したうえで降順にソートを行い(key numeric reverse
),そのうちの先頭から15個分をリストとして出力しています.
- 2010-04-18 10:50追記
ちなみに,MTActionsでやってみるとこうなります(^^;
<MTActions lastn="15" sort="created_on" sort_order="descend" sort_by="created_on"> <MTActionsHeader><ul></MTActionsHeader> <MTActionsEntry> <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li> </MTActionsEntry> <MTActionsComment> <MTCommentEntry> <MTSetVarBlock name="ftitle"><$MTEntryTitle$>へのコメント</MTSetVarBlock> </MTCommentEntry> <li><a href="<$MTCommentLink$>"><$MTGetVar name="ftitle"$> (<$MTCommentAuthor$>)</a></li> </MTActionsComment> <MTActionsFooter></ul></MTActionsFooter> </MTActions>
まとめ
上記のようにハッシュ変数は,不規則な配列となっている変数をインデックス部分や変数の内容に沿ってソートすることが出来るのが特徴です.使いようによってはMTタグ単独でも出来ることがハッシュ変数を使って出来ちゃったりするんですが,まぁ普通はMTタグを使うのでしょうね(苦笑).
ただ,うちの掲示板のトップページのように「コメントの投稿に応じてトップページの表示内容を変化させる」というのには有効かもしれません.
配列変数もハッシュ変数も,使う条件によって使いやすかったりそうでなかったりします.なので時と場合によって使い分けましょう.ということで(^^;
Comments:0