以下のサイトを参考に
http://d.hatena.ne.jp/lapis25/20080908/1220861488
resource.var.phpというプラグインを入れました。
http://api.zikula.de/__filesource/fsource_Smarty_plugins_includesclassesSmartypluginsresource.var.php.html
紹介記事の用にして実行することは出来るのですが
なぜか以下のように関数内で実行しようとすると、実行されません。
function test_smarty(){
$Smarty->assign('hogehoge', 'hallo, Smarty!');
$body_var = '{$hogehoge}';
$body = $Smarty->fetch('var:body_var');
echo $body;
}
※関数内のソースは記事元を引用したので、Smartyの設定が一部省かれています。
resource.var.phpのどこが原因で実行出来ないのか分からないので、
ご存じの方は改善点を押して下さい。
$Smarty->assign('hogehoge', 'hallo, Smarty!');
のところでエラーになってないでしょうか?
Notice: Undefined variable: Smarty
Fatal error: Call to a member function assign() on a non-object
変数 $Smarty は test_smarty() 関数の外で用意していますかね。
だとするとスコープの関係で関数の中からはその $Smarty を参照できません。
次のようにしてみるといかがでしょう。
(A) 引数で渡す
$Smarty = new Smarty; // 設定は省略... function test_smarty($Smarty){ $Smarty->assign('hogehoge', 'hallo, Smarty!'); $body_var = '{$hogehoge}'; $body = $Smarty->fetch('var:body_var'); echo $body; }
(B) グローバル変数として参照する (globalキーワード使用)
$Smarty = new Smarty; // 設定は省略... function test_smarty(){ global $Smarty; $Smarty->assign('hogehoge', 'hallo, Smarty!'); $body_var = '{$hogehoge}'; $body = $Smarty->fetch('var:body_var'); echo $body; }
(B') グローバル変数として参照する ($GLOBALS を使用)
$Smarty = new Smarty; // 設定は省略... function test_smarty(){ $Smarty = $GLOBALS['Smarty']; $Smarty->assign('hogehoge', 'hallo, Smarty!'); $body_var = '{$hogehoge}'; $body = $Smarty->fetch('var:body_var'); echo $body; }
resource.var.phpプラグインでは、指定された変数の中味を以下のようにしてグローバル変数として参照するようになっています。
global $$tpl_name; $tpl_source = $$tpl_name;
なので、$body_varは先に関数の外で$body_var=''などとしてグローバル変数にしておく必要があります。
関数の中にだけある変数はローカル変数になるので、グローバル変数として参照できなくなってしまい、値が出てこなくなるという訳です。
回答の通り、$body_varをグローバル変数として関数外で実行しましたが、
それでも値が出てこない状態です。
{追記}
関数外ではなく、関数内で
global $body_var;
とすれば値が表示されました。
やってみましたが、特に変化無いですね。
それに、出来ないというのは
$body = $Smarty->fetch('var: body_var');
この、変数で受け取って処理する方法で、
$body = $Smarty->fetch('index.tpl');
というようにテンプレートで指定したら関数内でも実行されるので、
プラグインの問題だと思います。
あと、$Smarty(クラスの開始)は関数内でしています。