我想将 Smarty 与 Zend 框架结合使用,尤其是其中的一些 View Helpers。现在我说到点子上了,我实现了一个 Zend_View,它使用 Smarty 来显示模板。我可以像往常一样赋值。到目前为止,一切都很好。
现在我真的很想在 Smarty 中使用 Zend View Helpers。我将 Zend_View 对象分配为“this”并在模板中尝试了这个:
{$this->layout()->setLayout('default')}
由于这将打印 setLayout() 方法(它是 Zend_Layout)的返回值,因此会出现错误:
可捕获的致命错误:无法将 Zend_Layout 类的对象转换为第 27 行 /path/to/templates_c/089c3d67082722c7cabc028fa92a077f8d8b4af5.file.default.tpl.cache.php 中的字符串
这对我来说很清楚,所以我进入 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) 一起使用。
在此先感谢您的任何建议!