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のどこが原因で実行出来ないのか分からないので、
ご存じの方は改善点を押して下さい。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/03/20 22:30:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:bayan No.1

回答回数100ベストアンサー獲得回数13

ポイント35pt
$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

id:k27w

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


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

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

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

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

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

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


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

2009/03/14 06:35:05
id:rryu No.2

回答回数30ベストアンサー獲得回数2

ポイント35pt

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

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

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

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

id:k27w

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

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


{追記}

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

global $body_var;

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

2009/03/15 02:18:14
  • id:k27w
    質問文の一部が誤字でした・・。

    ご存じの方は改善点を押して下さい

    ご存じの方は改善点を教えて下さい
  • id:bayan
    > あと、$Smarty(クラスの開始)は関数内でしています。

    これは早合点、失礼しました。。。

    同じコードを関数の中で書いたらなぜか動かないと。
    実行できないというのは echo $body で何も出てこない
    という感じですかね。

    当方では、以下のように書いて動いたのですよ。

    <?php
    require_once "Smarty.class.php";

    function test_smarty(){
    $Smarty = new Smarty;
    $Smarty->template_dir = '';
    $Smarty->compile_dir = './templates_c';
    $Smarty->assign('hogehoge', 'hallo, Smarty!');
    $body_var = '{$hogehoge}';
    $body = $Smarty->fetch('var:body_var');
    echo $body;
    }

    test_smarty();
    ?>



    ファイルの配置は以下の通りです。

    test2.php
    templates_c/
    plugins/
    resource.var.php



    resource.var.php の内容は以下の通りです。

    <?php
    // http://api.zikula.de/__filesource/fsource_Smarty_plugins_includesclassesSmartypluginsresource.var.php.html
    /**
    * Smarty plugin
    * @package Smarty
    * @subpackage plugins
    */

    /**
    * Smarty plugin
    * -------------------------------------------------------------
    * Type: resource
    * Purpose: fetches template from a global variable
    * Version: 1.0 [Sep 28, 2002 boots since Sep 28, 2002 boots]
    * -------------------------------------------------------------
    */

    function smarty_resource_var_source($tpl_name, &$tpl_source, &$smarty)
    {
    if (isset($tpl_name)) {
    global $$tpl_name;
    $tpl_source = $$tpl_name;
    return true;
    }
    return false;
    }

    function smarty_resource_var_timestamp($tpl_name, $tpl_timestamp, &$smarty)
    {
    if (isset($tpl_name)) {
    $tpl_timestamp = microtime();
    return true;
    }
    return false;
    }

    function smarty_resource_var_secure($tpl_name, &$smarty)
    {
    // assume all templates are secure
    return true;
    }

    function smarty_resource_var_trusted($tpl_name, &$smarty)
    {
    // not used for templates
    }

    ?>
  • id:bayan
    おっと、コメントだと半角スペースが消えるのを忘れてました。

    resource.var.php は、テストスクリプトのあるフォルダの中に、
    plugins サブフォルダを作って、その中に入れてます。

    plugins/resource.var.php


    あと、実行できたというのは、hallo, Smarty! が表示できたということです。



    それから、今気がついたのですが、

    $Smarty->assign('hogehoge', 'hallo, Smarty!');
    $body_var = '{$hogehoge}';
    $body = $Smarty->fetch('var:body_var');

    上のコードは説明のために記事元を引用したもので、
    実際に k27w さんが書いているものと違っているということはありますか?
    ※特に $body_var = '{$hogehoge}'; の箇所
  • id:k27w
    コメントありがとうございます。
    bayanさんが書かれたコードをコピーして実行してみましたが、
    それでも「hallo, Smarty!」は表示されません。

    テストはローカル環境の、WindowxXP+PHP5.2.5上で行っているので、
    それが原因かと思い、さくらインターネットのサーバ(PHP5.2.8)で
    試してみたのですが、それでもやっぱり表示されません。

    bayanさんが動いたと言うことなので、やっぱり環境が原因かもしれませんね・・。もう少し調べてみます。
  • id:KeyKey
    rryuさんの書いたとおり$body_varをグローバル変数にすると私の環境でも表示されました。
    表示できないときのテンプレートキャッシュが残ったままで表示されていないということはないですか?
    一度「templates_c」を空にしてみてください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません