我想将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)一起使用。
提前感谢任何建议!
答案 0 :(得分:0)
一些建议(只有想法,没有那么好):
在Zend_Layout中创建__toString(),返回null或空字符串(大/丑/更差的解决方法)。
创建一个返回null或空字符串的变量修饰符/过滤器,因此您的调用将类似于{$this->layout()->setLayout('default')|noreturn}
(您可以将其与其他内容一起使用,并且可以调用noreturn
一个友好的名称,如definition
或define
,以表明该指令的目的,但也是一种解决方法)
使用assign构建一个表达式,将所有这些内容设置为另一个var(也是变通方法)。
也许这可以给你一些好主意=)