45式::雑記
45式::雑記は、日々の事を記してないから日記ではなく雑記です。

MTで変数の値を初期化する方法

コメント
4件
トラックバック
0件

余談

この記事の下書きを作成中、別の記事に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]

zelazny (2009年6月20日14:58) 返信

「いぐのれ」使う方法がグッドです。

blog.aklaswad.com (2009年6月24日12:06) 返信

試してないですが、mt:ignoreを使った方法はダイナミックで動作しない気がします。

4n5からblog.aklaswad.comへの返信 (2009年6月24日21:12) 返信

スタティック派の私にダイナミック時の動作は想定外でした。

こちらで試してみましたが、MTIgnoreとMTTemplateNoteを使った場合は動作しませんでした。
MTSetVarsでは動作しましたのでsetvarモディファイアによる初期化ができない、という事はないようです。

blog.aklaswad.com (2009年6月25日12:30) 返信

そうですね。
mt:Ignoreが、perlでは「空の文字列を返すMTタグ」として実装されているのに対し、phpでは、「テンプレートの処理を開始する前に削除される特別な記法」であって、事実上MTタグでは無いためです。(MTタグでは無いので、グローバルモディファイアも動作しない。)
カッコいいハックなだけに、ちょっと残念ですねー。

コメント投稿フォーム

コメントを投稿するにはJavaScirptが必要です。ブラウザのJavaScriptを有効にしてください。

コメント投稿フォーム

トラックバック[0]

トラックバックはまだありません。

カテゴリ
アーカイブ
ヘルプ
Feed

フィードとは