Home > Logs > March 2008 > This Entry
MTSetVarBlock とか MTSetVar とか MTSetVarTemplate ではアトリビュート prepend と append が使える
知ってたら今日二時間早く帰れたかもしれないことがあまりにも悔しいので、公開されている MT タグリファレンスには載ってないけど晒してやることにします。
使い方と動作について
アトリビュート prepend をつけた場合、それまで変数に格納されていた値の前に、新しい値が追加されます。逆に、append をつけた場合には、それまで変数に格納されていた値の後に、新しい値が追加されます。MovableType のソースコード上は MTSetVarBlock、MTSetVar、MTSetVarTemplate タグのアトリビュート prepend または append があるかどうかのみ判断しているので、以下のように prepend="1" または append="1" のように指定します。
<mt:SetVarBlock name="variable" append="1">
ももたろうは
</mt:SetVarBlock>
<mt:SetVarBlock name="variable" append="1">
おにたいじに
</mt:SetVarBlock>
<mt:SetVarBlock name="variable" append="1">
いきました
</mt:SetVarBlock>
<$mt:var name="variable"$>
この場合、結果表示は以下のようになります。
ももたろうは おにたいじに いきました
ちなみに、アトリビュート prepend や append をつけなかった場合は、以下のようになります。
<mt:SetVarBlock name="variable">
ももたろうは
</mt:SetVarBlock>
<mt:SetVarBlock name="variable">
おにたいじに
</mt:SetVarBlock>
<mt:SetVarBlock name="variable">
いきました
</mt:SetVarBlock>
<$mt:var name="variable"$>
この場合、期待通りの結果を得ることはできません。結果表示は以下のようになります。
いきました
これは、あとに出てきた MTSetVarBlock タグが変数の値を上書きするからです。なので、値を追加したい場合は、アトリビュート prepend や append をつける必要があるわけです。
役に立つ場面
いろいろな場面で役に立つことでしょうけれど、僕が今日やりたかったのは、「ループを一回まわして振り分けした結果の表示」でした。たとえば、僕がももたろうの物語を「ももたろうは」「おにたいじに」「いきました」のように、ブログ記事のタイトルに断片的に入れていて、それらを「Movable Type 4 へようこそ!」のような、関係ない記事と分けて表示したいとします(例えが悪いのはわかってるんですが…ねむくて…)。
<mt:Entries>
<mt:SetVarBlock name="entry_title"><$mt:EntryTitle$></mt:SetVarBlock>
<mt:If name="entry_title" eq="Movable Type 4 へようこそ!">
<mt:SetVarBlock name="その他のブログ記事" prepend="1">
<li><$mt:EntryTitle$></li>
</mt:SetVarBlock>
<mt:Else>
<mt:SetVarBlock name="ももたろう関連のブログ記事" prepend="1">
<li><$mt:EntryTitle$></li>
</mt:SetVarBlock>
</mt:If>
</mt:Entries>
<h1>ももたろう関連のブログ記事</h1>
<ul>
<$mt:Var name="ももたろう関連のブログ記事"$>
</ul>
<h1>その他のブログ記事</h1>
<ul>
<$mt:Var name="その他のブログ記事"$>
</ul>
この場合、出力される結果を HTML コードで示すと、以下のようになります。
<h1>ももたろう関連のブログ記事</h1>
<ul>
<li>ももたろうは</li>
<li>おにたいじに</li>
<li>いきました</li>
</ul>
<h1>その他の関連のブログ記事</h1>
<ul>
<li>Movable Type 4 へようこそ!</li>
</ul>
同じ結果は、以下のようにループを二回まわして、その途中でタグを出力させても得ることができます。
<h1>ももたろう関連のブログ記事</h1>
<ul>
<mt:Entries>
<mt:SetVarBlock name="entry_title"><$mt:EntryTitle$></mt:SetVarBlock>
<mt:If name="entry_title" ne="Movable Type 4 へようこそ!">
<li><$mt:EntryTitle$></li>
</mt:If>
</mt:Entries>
</ul>
<h1>その他のブログ記事</h1>
<ul>
<mt:Entries>
<mt:SetVarBlock name="entry_title"><$mt:EntryTitle$></mt:SetVarBlock>
<mt:If name="entry_title" eq="Movable Type 4 へようこそ!">
<li><$mt:EntryTitle$></li>
</mt:If>
</mt:Entries>
</ul>
しかし、ループを二回まわすというのはいかにも非効率だし、ソースコードとしても美しいとはいえません。また、データベースに発行する SQL も多くなるので結果として処理が重くなるし、一回目のループと二回目のループの間にデータベースに変更が加えられない保証はありません。ループはできるだけ一回ですませてしまうべきでしょう。このようなとき、MTSetVarBlock、MTSetVar、MTSetVarTemplate においてアトリビュート prepend と append が使えることは有用であるといえます。
あとがき
僕は今日、アトリビュート prepend と append が使えることを知らなかったために二時間遅く帰った上、結局気づかなかったため積極的な解決ができなかったので、同じことを実現するための MTAddVarBlock みたいなタグを追加するプラグインを書く気まんまんで帰りの電車で設計を考えていて帰宅してMTSetVarBlock のソースを見たらしっかりこの機能が実装されていたのですばらしくへこみました。使えるのにドキュメント化してくれていないってどうなんだよとも思うけれど、やはりソースを見ておかなきゃいけないなあと。もともと、公開されている MT タグリファレンスは間違い多いしねえ。
ちなみに、MTSetVar タグや MTSetVarBlock タグは MovableType 3 でも使えますが、アトリビュート prepend や append は実装されていません。
Post Comment