0

Boostrapで、レイアウトリソースをブートストラップし、いくつかのビューヘルパーを登録するメソッドを作成する必要がありました。

protected function _initViewHelpers() {
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();

    $view->registerHelper(new Application_View_Helper_LoadMenu, 'loadMenu');
    $view->registerHelper(new Application_View_Helper_InfoLink, 'infoLink');
    $view->registerHelper(new Application_View_Helper_InfoData, 'infoData');
}

今、私はいくつかの変数をレイアウトに(いつものようにZend_Viewインスタンスに)渡しますが、レイアウトはそれらを持っていることを認識しません。

ヘルパーを登録するコードをコントローラーのinit()メソッドに移動すると、すべて問題ありません。ZFエラーですか、それとも間違っていましたか?

4

2 に答える 2

0

ビューヘルパーはsetView()、直接またはおそらくサブクラスとしてメソッドを実装しますZend_View_Helper_Abstractか?

メソッドのコードを見ると、ヘルパーにメソッドZend_View_Abstract::registerHelper($helper, $name)が存在するかどうかがチェックされていることがわかります。setView()そのようなメソッドが見つかった場合は、を呼び出します。$helper->setView($this)ここ$thisで、は$viewです。

ここで接続が行われます。この呼び出しがない場合、ビューはヘルパーを認識しますが(結局、登録しただけです)、ヘルパーはビューを認識しないようです。ヘルパーがビューにアクセスしようとすると、ブートストラップで構成したものではない新しいビューオブジェクトが作成されることになります。

tl; dr:ヘルパーを明示的に登録する必要はおそらくないでしょう。デフォルトのリソースオートローダーを配置し、使用していると思われるクラス/メソッドの命名規則を使用すると、組み込みのプラグインローダーがすべてのインスタンス化を処理できるようになります。$this->myHelperMethod()レイアウトまたはビュースクリプトを呼び出すだけで、すべてがクールになります。

于 2012-01-31T14:31:41.407 に答える
0

あなたのコントローラー(またはあなたが見ているところならどこでも)

$view->layout()->some_var = "Some Value";

あなたのレイアウトで

<?php echo $this->layout()->some_var; ?>

私があなたの質問の一部を逃しているならば、私に知らせてください。

編集:上記に失敗した場合、これを行う他の正しい方法は、プレースホルダーヘルパー(http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial .placeholder)

編集2:ビューもブートストラップしていることを確認します。

$this->bootstrap('view');
$view = $this->getResource('view');
于 2012-01-31T14:52:34.557 に答える