如何从 Smarty 模板构造新对象


How do I construct a new object from a Smarty template?

我想做的是:

{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的版本。

来自 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"}

使用闭包怎么样?

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

这不是有史以来最漂亮的东西,但它应该完成工作。(作为旁注,您可能需要考虑在将来的某个时候切换到 PHP 模板语言)

除非我严重误读了这个问题,否则你以错误的方式进行。Smarty 应该只保存 html 和 smarty 变量(极少数例外)。你需要用PHP编写你的类,并在那里实例化一个对象,并将其传递给smarty。下面是一个示例:

菲律宾语:

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。

也请耐心等待,我在手机上写了这个:(