3

私がやりたいことはこれです:

{myfunc myattribute=new MyClass('arg1', 'arg2')}

しかし、試してみると、関数 MyClass が定義されていないというエラーが表示されます。

私が使用してきた回避策は、次のようなトップレベル関数を作成することです。

function MyClass($arg1, $arg2) { return new MyClass($arg1, $arg2); }

次に、テンプレートで次のことを行います。

{myfunc myattribute=MyClass('arg1', 'arg2')}

しかし、Smarty と対比させたいすべてのクラスに対して新しいトップレベル関数を作成しないようにする方法はありますか?

クラスの名前だけを取って任意のクラスを構築できる関数を作成することもできると思いますが、それは一種の醜い解決策です。

編集: 私のベスト プラクティスに違反していると言っている皆さん、おそらくこれで気分が良くなるでしょう:

私が構築しているオブジェクトは、いくつかの html をレンダリングするウィジェットです。実際のコードは次のようになります。

{render_widget widget=new MyWidget() id="myid" name="myname"}

また、残念ながら私は現在 PHP 5.2 で立ち往生しているため、クロージャーを使用できません。現在 Smarty 3.0 のバージョンを使用していますが、Smarty3 の最新バージョンを使用できます。

4

3 に答える 3

4

http://www.smarty.net/best_practicesから

  1. PHPを埋め込まない
  2. PHP 構造を分離する
  3. ビジネス ロジックを分離する

あなたの場合、プレゼンテーション ロジックとビジネス ロジックを混在させますが、それは悪いことです。

ただし、カスタム オブジェクト作成用のカスタム Smarty プラグイン (ラッパー) を作成することもできます。(私は) それがより適切な "Smarty-way" ソリューションであると考えています。

http://www.smarty.net/docsv2/en/plugins.tplおよびhttp://www.smarty.net/docsv2/en/plugins.functions.tplを参照してください。

例えば。

意味:

function smarty_function_custom_class($params, &$smarty)
{
    $class = $params['class'];       
    $smarty->assign($params['var'], new $class());  
}    

使用法:

{custom_class var='myObject' class='MyClass'}

アップデート

したがって、そのような構造がある場合:

{render_widget widget=new MyWidget() id="myid" name="myname"}

render_widget次の方法で変更できます。

function smarty_function_render_widget($params, &$smarty)
{
    $class = $params['widget'];       

    $id = $params['id'];
    $name = $params['name'];

    $widget = new $class($id, $name);

    /**
     *  if you need object in your template, assign it to same variable:
     */
    $smarty->assign($params['widget'], $widget);
    // rest of your code    
}    

その後、次のように使用できます。

{render_widget widget="MyWidget" id="myid" name="myname"}
于 2012-06-22T22:51:15.650 に答える
2

クロージャーを使用するのはどうですか?

{myfunc myattribute=function() { return new MyClass('arg1', 'arg2'); }}

それはこれまでで最も美しいものではありませんが、仕事を成し遂げるはずです. (ちなみに、将来的にPHP テンプレート言語への切り替えを検討することをお勧めします)

于 2012-06-22T22:36:02.440 に答える
1

私が質問を真剣に読み間違えていない限り、あなたは間違った方法で進んでいます。Smarty は html と smarty 変数のみを保持する必要があります (例外はほとんどありません)。PHP でクラスを作成し、そこでオブジェクトをインスタンス化し、それを smarty に渡します。次に例を示します。

Php:

class Class_name
{
    private $int;

    public function funtion_name()
    {
        $this->int = 1;
        return $this->int;
    }
}

//instantiate the object  

$obj = new Class_name();

$smarty->('smarty_variable_name', $obj);

スマート:

$smarty_variable_name->funtion_name()}

これは 1 を出力するはずです。

また、私に我慢してください、私は私の電話でこれを書きました:(

于 2012-06-22T23:00:40.340 に答える