xai1981's blog

http://twitter.com/xai1981

更新されない変数

昨日 Smarty を使った Web サービスでの改修でどハマリしました。 swf を読み込む箇所を部品として切り出します。それを include して読み込む箇所が、2箇所ありました。呼び出しの引数で、機能を切り分けてる実装です。

今までは1箇所目は big 2箇所目は small って固定値を include 時に渡していました。そして include ファイルの呼び元から big small を渡せるようにするのが課題です。

まずその include してる部品の変数(mode) を渡してる所に着目すると

mode = $mode || 'big'

$modeが渡されない場合 big を渡す、としてたので

mode = $mode

上記のように修正しました。

で、テンプレートの修正完了。PHPSmarty に変数を assign してる箇所にDB から取得した <{$mode}> を渡してテストしたら、問題が発生しました。 1箇所目のテストでいくら <{$mode}> を切り替えても、ずっと big のまま変わりません。

そしてしばらくして、原因に気が付きました。

a.tpl が parts.tpl を読み込む。 b.tpl が parts.tpl を読み込む。

parts.tpl を上記のように修正、修正完了。と思ってたら、大間違い。

a.tpl 内で、定数で big を、b.tpl 内で、定数で small を渡してました。そりゃあ切り替わりませんよね。

何でこんな初歩的なミスをしたのかというと

  1. a.tpl b.tpl で $mode の検索をしてもヒットしなかったため、そして parts.tpl 内で、下記の記述があったため a.tpl b.tpl で $mode を渡してないと決め付けてました。

$mode を渡していないという事は PHP から渡された $mode がそのまま parts.tpl に渡されるので、修正は必要ないと思ったのです。ですが a.tpl b.tpl で定数で渡してたもんだから PHP から渡されたものではなく、定数の方が採用されて、、、ってやつです。

よく見ろよ、私と猛省した、出来事でございました。