更新されない変数
昨日 Smarty を使った Web サービスでの改修でどハマリしました。 swf を読み込む箇所を部品として切り出します。それを include して読み込む箇所が、2箇所ありました。呼び出しの引数で、機能を切り分けてる実装です。
今までは1箇所目は big 2箇所目は small って固定値を include 時に渡していました。そして include ファイルの呼び元から big small を渡せるようにするのが課題です。
まずその include してる部品の変数(mode) を渡してる所に着目すると
mode = $mode || 'big'
$modeが渡されない場合 big を渡す、としてたので
mode = $mode
上記のように修正しました。
で、テンプレートの修正完了。PHP で Smarty に変数を assign してる箇所にDB から取得した <{$mode}> を渡してテストしたら、問題が発生しました。 1箇所目のテストでいくら <{$mode}> を切り替えても、ずっと big のまま変わりません。
そしてしばらくして、原因に気が付きました。
a.tpl が parts.tpl を読み込む。 b.tpl が parts.tpl を読み込む。
parts.tpl を上記のように修正、修正完了。と思ってたら、大間違い。
a.tpl 内で、定数で big を、b.tpl 内で、定数で small を渡してました。そりゃあ切り替わりませんよね。
何でこんな初歩的なミスをしたのかというと
- a.tpl b.tpl で $mode の検索をしてもヒットしなかったため、そして parts.tpl 内で、下記の記述があったため a.tpl b.tpl で $mode を渡してないと決め付けてました。
$mode を渡していないという事は PHP から渡された $mode がそのまま parts.tpl に渡されるので、修正は必要ないと思ったのです。ですが a.tpl b.tpl で定数で渡してたもんだから PHP から渡されたものではなく、定数の方が採用されて、、、ってやつです。
よく見ろよ、私と猛省した、出来事でございました。