まず、以下のような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 コメント:
コメントを投稿