2

我想将 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) 一起使用。

在此先感谢您的任何建议!

4

1 回答 1

0

一些建议(只有想法,没什么好说的):

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

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

  3. 使用assign构建一个表达式,将所有这些东西设置为另一个 var(也可以解决)。

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

于 2011-12-14T02:47:49.193 回答