如何从Smarty模板构造新对象?

时间:2012-06-22 22:23:54

标签: php smarty

我想做的是:

{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,所以我不能使用闭包。我可以使用最新版本的Smarty3,虽然我目前正在使用Smarty 3.0版本。

3 个答案:

答案 0 :(得分:4)

来自http://www.smarty.net/best_practices

  1. 不要嵌入PHP
  2. 保持PHP结构分开
  3. 保持业务逻辑分离
  4. 在您的情况下,您将表示逻辑与业务逻辑混合 - 这很糟糕。

    但是,您可以编写自定义Smarty插件(包装器)来创建自定义对象 - 并且(我认为)它更适合“Smarty-way”解决方案。

    请参阅http://www.smarty.net/docsv2/en/plugins.tplhttp://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"}
    

答案 1 :(得分:2)

如何使用closures

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

这不是最漂亮的事情,但它应该完成工作。 (作为旁注,您可能希望考虑在将来的某个时间切换到PHP Templating language

答案 2 :(得分: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:

$smarty_variable_name->funtion_name()}

这应输出1。

还要跟我说,我在手机上写了这个:(