MTで変数の値を初期化する方法
余談
この記事の下書きを作成中、別の記事にoscarさんからコメントを頂いた。
ついでに、前にはまったケース。
変数にNULLをセットしようとして、「=""」としたら、「""」が値になった。
「="0"」は数字のゼロでなく、文字列の「"0"」になった。
どこからこの記事の事を嗅ぎ付けたのか、oscar…恐ろしい子!
本題
この記事でいう値の初期化とは値をNullにする事です。
値に0を入れる初期化は変数になれていなくてもできると思いますし。
個人的に、MTの変数は型の判別ができないのでMTIfNonEmpty
タグの結果に関わるNull化は重要だと思います。
その具体的な方法は殆んどのタグ、モディファイアでそんなに変わりません。
百聞は一見に如かず、まずはMTSetVar
タグです。
MTSetVar
タグで初期化する
下の二行はどちらか一行だけで使います。
<$MTSetVar name="foo" value=""$>
<$MTSetVar name="foo"$>
これで変数fooの値は空っぽになります。
二行目は、システム側から見てどういう動作になるのかわかりませんが、見た目だけなら単にvalue=""
を省略しただけです。
MTVar
タグで初期化する
認知度はわかりませんが、MTVar
タグはvalue属性を指定するとMTSetVar
タグと同等の動作をします。
<$MTVar name="foo" value=""$>
これにてファンクションタグは終了です。
続いてはブロックタグです。
MTSetVarBlock
タグとMTSetVarTemplate
タグで初期化する
MTSetVarBlock
タグとMTSetVarTemplate
タグは同じブロックタグなので殆んど同じです。
<MTSetVarBlock name="foo"></MTSetVarBlock>
<MTSetVarTemplate name="foo"></MTSetVarTemplate>
中に改行一つ入れることができない上に記述量も多く、使い勝手は悪いですね。
MTSetVars
タグで初期化する
MTSetVars
タグは記述方法こそ異質な見た目ですが、MTSetVar
タグの二行目を思い出してもらえばわかると思います。
<MTSetVars>
foo=
</MTSetVars>
これで変数fooは空っぽになります。
この方法で重要なのは=
の直後に改行するという事です。
空白が変数の値として格納されることもあるので、注意が必要です。
これでブロックタグは終了です。
最後はグローバル・モディファイアです。
setvar
モディファイアで初期化する
setvar
モディファイアで変数の初期化ができるのか?
できるのです。
<MTSetVars setvar="foo">
bar=baz
</MTSetVars>
これで変数fooは空っぽです。
MovableType.jpのリファレンスでsetvar
モディファイアの説明は以下のように書いてあります。
setvar モディファイアを設定したブロックまたはファンクションは展開されず、出力される結果は、モディファイアの設定値が名前の変数の値となります。
この説明通りなら、タグに出力する結果が無ければそれは変数に無を入れる、MTSetVar
タグにvalue=""
と指定するのと同じなのではないでしょうか。
ちなみに、setvar
モディファイアを指定したMTSetVars
タグの中は通常どおりに動作します。
例の場合、変数barにはbazという値が格納されます。
ただしsetvar
モディファイアと同じ変数名を使った場合、setvar
モディファイアの方が優先されるらしく、変数の値は空になるのでご注意を。
上の例ではMTSetVars
タグを使いましたが、出力する結果が無いタグであれば同じ動作になるはずです。
<MTIgnore setvar="foo">
変数fooを初期化します
</MTIgnroe>
MTIgnore
タグは何も出力しないタグなのでsetvar
モディファイアには値となるものが渡されません。
なので、変数は初期化されます。
コメント[4]
コメント投稿フォーム
コメントを投稿するにはJavaScirptが必要です。ブラウザのJavaScriptを有効にしてください。
トラックバック[0]
トラックバックはまだありません。
「いぐのれ」使う方法がグッドです。
試してないですが、mt:ignoreを使った方法はダイナミックで動作しない気がします。
スタティック派の私にダイナミック時の動作は想定外でした。
こちらで試してみましたが、MTIgnoreとMTTemplateNoteを使った場合は動作しませんでした。
MTSetVarsでは動作しましたのでsetvarモディファイアによる初期化ができない、という事はないようです。
そうですね。
mt:Ignoreが、perlでは「空の文字列を返すMTタグ」として実装されているのに対し、phpでは、「テンプレートの処理を開始する前に削除される特別な記法」であって、事実上MTタグでは無いためです。(MTタグでは無いので、グローバルモディファイアも動作しない。)
カッコいいハックなだけに、ちょっと残念ですねー。