有没有办法告诉Smarty不要打印表达式?

时间:2011-12-13 23:45:53

标签: php zend-framework smarty zend-framework-mvc pimcore

我想将Smarty与Zend Framework结合使用,特别是其中的一些View Helpers。 现在我明白了,我实现了一个使用Smarty显示模板的Zend_View。我可以照常分配值。到目前为止一切都很好。

现在我真的想在Smarty中使用Zend View Helpers。我将Zend_View对象指定为“this”并在模板中尝试了这个:

{$this->layout()->setLayout('default')}

由于这将打印setLayout()方法(Zend_Layout)的返回值,因此出现错误:

可捕获的致命错误:第27行的/path/to/templates_c/089c3d67082722c7cabc028fa92a077f8d8b4af5.file.default.tpl.cache.php中无法将类Zend_Layout的对象转换为字符串

这对我来说很清楚,所以我进入了Smarty的核心来解决这个问题:

生成的代码看起来像这样:

<?php 
    echo $_smarty_tpl->tpl_vars['this']
                     ->value->layout()
                     ->setLayout('default');
?>

现在它写着:

<?php
    $hack = $_smarty_tpl->tpl_vars['this']
                          ->value
                          ->layout()
                          ->setLayout('default');
    if( is_string($hack) ||
        ( is_object($hack) && method_exists($hack, '__toString') ) )
        echo $hack;
?>

现在这可能是我能想到的最糟糕的修复,原因有几个(Smarty兼容性损失,性能)。可悲的是,这是唯一的一个。有没有办法阻止Smarty尝试打印表达式的输出?此外,我希望语法尽可能保持直观,我不想为所有助手编写Smarty函数,因为我想将此代码与可能添加新助手的第三方应用程序(Pimcore)一起使用。

提前感谢任何建议!

1 个答案:

答案 0 :(得分:0)

一些建议(只有想法,没有那么好):

  1. 在Zend_Layout中创建__toString(),返回null或空字符串(大/丑/更差的解决方法)。

  2. 创建一个返回null或空字符串的变量修饰符/过滤器,因此您的调用将类似于{$this->layout()->setLayout('default')|noreturn}(您可以将其与其他内容一起使用,并且可以调用noreturn一个友好的名称,如definitiondefine,以表明该指令的目的,但也是一种解决方法)

  3. 使用assign构建一个表达式,将所有这些内容设置为另一个var(也是变通方法)。

  4. 也许这可以给你一些好主意=)