note モディファイアでコメントを書くときの注意点と、プラグインなしでの変数の局所化する方法

この記事は Movable Type Advent Calendar 2015 の 6日目の記事です。

今日で 39 歳になりました。毎年、自分の誕生日にブログを書くノルマを当てて自分を追い込む企画です。

今日はちょっと軽めに記事になってしまいますが、note モディファイアでコメントを書く方法と、プラグインなしで変数の局所化する方法をご紹介します。

note モディファイアでコメントを書くときの注意点

やはりお前らのMTMLは間違っている! の 66 ページにある「存在しないモディファイアは無視される」から note モディファイアでコメントを書くという方法、すごくいいですね。僕も早速取り入れています。

ただし、mt:Else には書いてはいけません。例えば、

<mt:SetVar name="foo" value="1">
<mt:If name="foo" note="fooがあるとき">
fooあります。
<mt:Else note="fooがないとき">
fooありません。
</mt:If>

このテンプレートの場合は、

fooあります。

が出力されます。

note モディファイアでコメントを書いてテンプレートも見やすいです。

これの1行目の value を 0 にすると「fooありません。」が出力されると思いきや、何も出力されません。

<mt:SetVar name="foo" value="0">
<mt:If name="foo" note="fooがあるとき">
fooあります。
<mt:Else note="fooがないとき">
fooありません。
</mt:If>

このコードは、実質的に内部では下記のように解釈されてしまいます。

<mt:SetVar name="foo" value="0">
<mt:If name="foo" note="fooがあるとき">
fooあります。
<mt:ElseIf name="foo" note="fooがないとき">
fooありません。
</mt:If>
<mt:Var name="note">

なので、

<mt:SetVar name="foo" value="0">
<mt:If name="foo" note="fooがあるとき">
fooあります。
<mt:ElseIf name="foo" eq="0" note="fooがないとき">
fooありません。
</mt:If>
<mt:Var name="note">

ならちゃんと、

fooありません。

と出力されます。もちろん mt:Elsenote を付けなければ、

<mt:SetVar name="foo" value="0">
<mt:If name="foo" note="fooがあるとき">
fooあります。
<mt:Else>
fooありません。
</mt:If>
<mt:Var name="note">

でも、

fooありません。

と出力されます。たぶん、ハマる人は結構いると思います。

mt:Include タグを使って変数を局所化する

やはりお前らのMTMLは間違っている! の 28 ページにある変数を局所化する mt:LocalVars タグ、すごい便利です。ぜひ MT 本体に取り入れて欲しいです!でもまあ、このあたりのグローバルとか変数のスコープの話になると MTMLer には苦しいかもしれません。。。プログラムのお勉強でつまずく最初の方の壁でしょうし。

さて、この変数の局所化ですが、 mt:Include を利用しても似たようなことができます(正しい動作かどうかはなんとなく疑問ですが)。

インデックステンプレートで、下記のようなテンプレートを用意します。

<mt:SetVar name="who" value="tinybeans">
1.<mt:Var name="who">
<mt:Include module="test" who="bit part">
4.<mt:Var name="who">

この中で読み込んでいる test モジュールの内容は下記の通りです。

2.<mt:Var name="who">
<mt:SetVar name="who" value="mersy">
3.<mt:Var name="who">

変数が完全にグローバルであれば、期待する出力は、

1.tinybeans
2.bit part
3.mersy
4.mersy

ですが、実際には、

1.tinybeans
2.bit part
3.mersy
4.tinybeans

となります。つまり、 mt:Include タグでセットした who="bit part" も、モジュール内でセットした <mt:SetVar name="who" value="mersy"> も、大元のインデックステンプレートの変数 who には影響していません。

この mt:Include タグでの変数の局所化のポイントとなるのは mt:Include タグでセットした who="bit part" モディファイアです。このモディファイアを削除して、

<mt:SetVar name="who" value="tinybeans">
1.<mt:Var name="who">
<mt:Include module="test">
4.<mt:Var name="who">

とすると、

1.tinybeans
2.tinybeans
3.mersy
4.mersy

となります。不思議ですね。

この方法は、いちいち局所化したい部分をモジュールに切り出さないといけないので、現実的には GetHashVarプラグイン の LocalVars タグを使ったほうが良いですが、上記の仕組みも知っているといいかもしれませんね。

以上です。 来年も Movable Type をもっと使い込んで楽しみましょう!!

  • このエントリーをはてなブックマークに追加
Just a second...