人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Smartyで変数にHTMLソースを代入してテンプレート扱いしたいと思い、
以下のサイトを参考に
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のどこが原因で実行出来ないのか分からないので、
ご存じの方は改善点を押して下さい。

●質問者: k27w
●カテゴリ:ウェブ制作
✍キーワード:BODY echo HTML PHP Smarty
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● bayan
●35ポイント
$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;
}

http://www.php.net/manual/ja/language.variables.scope.php

◎質問者からの返答

やってみましたが、特に変化無いですね。


それに、出来ないというのは

$body = $Smarty->fetch('var: body_var');

この、変数で受け取って処理する方法で、

$body = $Smarty->fetch('index.tpl');

というようにテンプレートで指定したら関数内でも実行されるので、

プラグインの問題だと思います。


あと、$Smarty(クラスの開始)は関数内でしています。


2 ● りゅう
●35ポイント

resource.var.phpプラグインでは、指定された変数の中味を以下のようにしてグローバル変数として参照するようになっています。

global $$tpl_name; 
$tpl_source = $$tpl_name;

なので、$body_varは先に関数の外で$body_var=''などとしてグローバル変数にしておく必要があります。

関数の中にだけある変数はローカル変数になるので、グローバル変数として参照できなくなってしまい、値が出てこなくなるという訳です。

◎質問者からの返答

回答の通り、$body_varをグローバル変数として関数外で実行しましたが、

それでも値が出てこない状態です。


{追記}

関数外ではなく、関数内で

global $body_var;

とすれば値が表示されました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ