2

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)でこのコードを使用したいからです。

提案を事前に感謝します!

4

1 に答える 1

0

いくつかの提案(アイデアのみ、それほど良いものはありません):

  1. nullまたは空の文字列を返す__toString()をZend_Layoutに作成します(大きな/醜い/悪い回避策)。

  2. nullまたは空の文字列を返す変数修飾子/フィルターを作成します。これにより、呼び出しは次のようになります{$this->layout()->setLayout('default')|noreturn}(他のものでも使用でき、命令の目的を示すまたはnoreturnのようなわかりやすい名前で呼び出すことができますが、回避策です。それも)definitiondefine

  3. 割り当てを使用して、このすべてを別の変数に設定する式を作成します(回避策も)。

多分これはあなたにいくつかの良いアイデアを与えることができます=)

于 2011-12-14T02:47:49.193 に答える