MovableType4 で大幅に強化された変数関係のタグによって、強力な programmability を備えたテンプレートですが、公式ドキュメントだけではイマイチ仕様がわからない部分があったり、加えて、掲載されていない様々な隠し機能があるようです。ソースコードを眺めたり再構築を繰り返すこと億千万回、少し判ったことをまとめてみました。
変数関係のテンプレートタグで重要な MTSetVar(mt:setvar)
、MTGetVar(mt:var)
は /mt/lib/MT/Template/ContextHandlers.pm にその実装があります。ここを見ると、公式ドキュメントには掲載されていないようなオプションが発見でき、またその仕様についても明らかになる部分が多々あります。
変数名として使用できる文字列については、ほとんど制限がないと言えます。以下のテンプレートは、変数名として使用できる文字列を調べてみた結果です。
変数名の先頭が $で始まる変数参照、[...]を含む配列参照、{...}を含む連想配列参照以外の制限は特になく、ほぼどのような変数名でも使えるようです。そのため、C言語の構造体を真似て "global.format.timestamp" という変数名を使うもよし(実際は構造体でも何でもありません)、ディレクトリパス風に "global/format/timestamp" という変数名を使うもよし、様々なバリエーションが可能です。マルチバイトの変数名も使えるので、日本語で"短い日付書式"なんて変数名もありです(実用性はともかくとして)
# v に指定された名前の変数に値を入力し、その値を表示する <mt:setvartemplate name="show_var"> <mt:setvar name="$v" value="$v"><mt:getvar name="$v">(<mt:getvar name="a">) </mt:setvartemplate> # C,Perl など多くの言語で一般的な変数名 - <mt:setvar name="v" value="a"><mt:var name="show_var"> = a - <mt:setvar name="v" value="_a"><mt:var name="show_var"> = _a # 変数名の大文字と小文字の違い - <mt:setvar name="v" value="A"><mt:var name="show_var"> = A # 数字だけの変数名 - <mt:setvar name="v" value="1"><mt:var name="show_var"> = 1 # 記号から始まる変数名 - <mt:setvar name="v" value="-a"><mt:var name="show_var"> = -a - <mt:setvar name="v" value="~a"><mt:var name="show_var"> = ~a - <mt:setvar name="v" value=":a"><mt:var name="show_var"> = :a - <mt:setvar name="v" value=".a"><mt:var name="show_var"> = .a - <mt:setvar name="v" value=",a"><mt:var name="show_var"> = ,a - <mt:setvar name="v" value="!a"><mt:var name="show_var"> = !a - <mt:setvar name="v" value="#a"><mt:var name="show_var"> = #a - <mt:setvar name="v" value="%a"><mt:var name="show_var"> = %a - <mt:setvar name="v" value="&a"><mt:var name="show_var"> = &a # 先頭以外に変数参照の$を含む変数名 - <mt:setvar name="v" value="a$"><mt:var name="show_var"> = a$ # 記号を含む変数名 - <mt:setvar name="v" value="a->a"><mt:var name="show_var"> = a->a - <mt:setvar name="v" value="a/a"><mt:var name="show_var"> = a/a # 空白文字を含む変数名 - <mt:setvar name="v" value="a "><mt:var name="show_var"> = a(一文字分の空白) - <mt:setvar name="v" value=" a"><mt:var name="show_var"> = (一文字分の空白)a - <mt:setvar name="v" value="a a"><mt:var name="show_var"> = a(一文字分の空白)a # マルチバイト文字列による変数名 - <mt:setvar name="v" value="日本語"><mt:var name="show_var"> = 日本語
先の結果のように自由度が高い変数名は、その大文字と小文字については区別せず同じに扱うため注意が必要です。
・異なる変数名での読出し <mt:setvar name="foo" value="123"> - <mt:var name="foo"> = 123 - <mt:var name="Foo"> = 123 - <mt:var name="fOO"> = 123 ・異なる変数名への書込み - <mt:setvar name="foo" value="123"><mt:var name="foo"> = 123 - <mt:setvar name="Foo" value="456"><mt:var name="foo"> = 456 - <mt:setvar name="fOO" value="789"><mt:var name="foo"> = 789
ドキュメントに掲載されていないオプションがあるようです。
<mt:setvar name="bar" index="1" value="123"> <mt:setvar name="bar" index="2" value="456"> <mt:setvar name="bar" index="3" value="789"> - <mt:var name="bar"> = 123456789 - <mt:var name="bar" glue=","> = ,123,456,789 # 配列に限定しません - <mt:var name="bar" to_json="1"> = [null,123,456,789] - <mt:var name="bar" index="100" default="hoge"> = hoge
MTのテンプレート内で多用されているオプションは、ユーザのカスタムテンプレート中でももちろん使えます。現在の変数の保持する値の前後に文字列として値を結合することができます。
<mt:setvar name="foo" value="123"> <mt:setvar name="foo" value="ABC" prepend="1"> - <mt:var name="foo"> = ABC123 <mt:setvar name="foo" value="XYZ" append="1"> - <mt:var name="foo"> = ABC123XYZ
MTの環境設定値やURLに指定されたクエリパラメータを読み出すことができます。こちらは読出し専用で値を書込むことはできません。
# mt-config.cgi の設定値を読み出す # DBPassword などは参照できない - <mt:var name="config.StaticWebPath"> = /cgi-bin/mt/t-static/ # URLのクエリパラメータを読み出す(未確認) - <mt:var name="request.search"> = (検索文字列)
未定義の変数への代入や参照について。('08/03/07 追記)
tags{hoge}, tags{fuga} は未定義として <MTSetVar name="tags" key="hoge" op="++"> - <MTGetVar name="tags" key="hoge"> = (定義されない) <MTSetVar name="tags" key="fuga" value="1" op="+"> - <MTGetVar name="tags" key="fuga"> = 1