SmartyをZendFrameworkと組み合わせて使用したいと思います。特に、一部のViewHelpersを使用したいと思います。これで、Smartyを使用してテンプレートを表示するZend_Viewを実装することになりました。いつものように値を割り当てることができます。ここまでは順調ですね。
SmartyでZendViewHelpersを使用したいと思います。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)でこのコードを使用したいからです。
提案を事前に感謝します!