DynamicMTML で変数に入れた数字を文字列として扱いたい場合は mt:SetVarBlock を使った方が無難

DynamicMTML 環境下で、変数に入れた数字を文字列として扱いたい場合は mt:SetVarBlock を使った方が無難です。

Movable Type の DynamicMTML 環境でのお話です。

例えば、

<mt:SetVar name="foo" value="1">

と変数にセットします。これを、PHP で文字列かどうか調べると、

<mt:SetVar name="foo" value="1">
<?php
global $app;
$ctx = $app->ctx;
var_dump(is_string($ctx->__stash['vars']['foo']));
?>

結果は、

bool(true)

となり、文字列であることが分かります。

これを op モディファイアで 1 減らします。

<mt:SetVar name="foo" value="1">
<mt:SetVar name="foo" op="--">
<?php
global $app;
$ctx = $app->ctx;
var_dump(is_string($ctx->__stash['vars']['foo']));
?>

結果は、

bool(false)

となり、数値になりました。mt:Var で op して setvar しても同様です。

<mt:SetVar name="foo" value="1">
<mt:Var name="foo" op="--" setvar="foo">
<?php
global $app;
$ctx = $app->ctx;
var_dump(is_string($ctx->__stash['vars']['foo']));
?>

大抵はこれでも問題ないでしょうが、もしこの foo 変数を渡した先の PHP のコードの中で is_stringctype_digit を使って値を判定していると、思った動作にならない可能性があります。

その場合は、下記のようにして mt:SetVarBlock すれば文字列となります。

<mt:SetVar name="foo" value="1">
<mt:SetVarBlock name="foo"><mt:Var name="foo" op="--"></mt:SetVarBlock>
<?php
global $app;
$ctx = $app->ctx;
var_dump(is_string($ctx->__stash['vars']['foo']));
?>

実際には、コードを見ないとこのあたりの挙動はわからないので、実装の方で ctype_digitis_numeric に切り替えるなどするのがいいかもしれませんが、op モディファイアを使って演算したときの豆知識として知っておくと良いと思いました。

以上です。

Published 2015-12-16
Updated 2019-06-25