Pages

2011年10月17日月曜日

Smarty 3.0系と3.1系での変数の挙動の違い

Smartyで、ちょっと不思議な現象に気づいたので書いておきます。

まず、以下のようなSmartyのサブクラスを作ったとします。

class MySmarty extends Smarty{
  public $property;

  public function __construct(){
    $this->registerPlugin('function', 'updateProperty', array($this, 'updateProperty'));
    $this->property = 0;
    $this->assign('property', $this->property);
  }
  public function updateProperty(){
    ++ $this->property;
    $this->assign('property', $this->property);
  }
}

updateProperty() というメソッドは、単にインスタンス変数をインクリメントするだけの単純なものです。それをテンプレート側から呼び出せるようにしただけ。


で、テンプレート側は以下のようにしておきます。

{$property}
{updateProperty} {$property}

インクリメント前後で変数の値を表示するだけ。


で、これを、Smarty 3.0.9 で実行してみると
一行目が"0"
二行目が"1"
と期待通りの結果になりますが、

Smarty 3.1.3 で実行してみると、どちらも"0"と表示されます。
メソッドは確かに実行されているみたいですし、メソッド内でgetTemplateVars()で値を見るときちんとインクリメントされているみたいですが、テンプレート内ではそれが反映されずに、最初の値が維持されたままのようです。

とりあえず、現時点では有効な対策や解決方法は見つかっておらず、オブジェクト等の参照渡しの変数を使うか、配列で assignByRef() を使うかでお茶を濁しています。

どうなっているのか、時間のあるときにでソースを見てみます。

0 コメント:

コメントを投稿