【问题标题】:How do I construct a new object from a Smarty template?如何从 Smarty 模板构造新对象?
【发布时间】:2012-06-22 22:23:54
【问题描述】:

我想做的是这样的:

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

【问题讨论】:

  • 所以你想在 smarty 中创建一个类?你一定做错了什么。 Smarty 应该只保存 html(当然还有 smarty 变量)。除了极少数例外。你知道你可以将一个对象传递给 smarty 并在那里使用它吗?还是我看错了问题?

标签: php smarty


【解决方案1】:

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

  1. 不要嵌入 PHP
  2. 保持 PHP 结构独立
  3. 保持业务逻辑分离

在您的情况下,您将表示逻辑与业务逻辑混合在一起 - 这很糟糕。

但是,您可以编写自定义 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"}

【讨论】:

  • 不,我要创建的对象纯粹是一个演示对象。我已经有一个自定义的 smarty 函数,我正在尝试构造一个对象来传递给它。
  • 另外我不想将它分配给一个变量,在当前范围内,我想将它作为参数传递给我已经拥有的自定义 smarty 函数。我想必须先将它绑定到一个变量会起作用,但它让我觉得很难看。
【解决方案2】:

closures怎么样?

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

这不是最漂亮的东西,但它应该可以完成工作。 (作为旁注,您可能需要考虑在未来某个时候切换到PHP Templating language

【讨论】:

  • 很好的答案,但我坚持使用 PHP 5.2,我更新了问题以反映这一点。
【解决方案3】:

除非我严重误读了您以错误方式处理的问题。 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。

也请多多包涵,我是在手机上写的:(

【讨论】:

  • 我要构造的对象是一个小部件,我试图将它传递给它的自定义 smarty 函数来呈现它。
猜你喜欢
  • 2011-01-25
  • 2013-09-15
  • 2022-01-13
  • 1970-01-01
  • 2012-06-19
  • 2011-01-25
  • 2010-09-10
  • 2019-02-11
相关资源
最近更新 更多