引导布局资源后将变量传递给布局

时间:2012-01-31 10:42:04

标签: php zend-framework bootstrapping zend-layout

我必须在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错误还是我做错了?

2 个答案:

答案 0 :(得分:0)

您的视图帮助程序是直接实现setView()方法还是实现Zend_View_Helper_Abstract的子类?

如果查看Zend_View_Abstract::registerHelper($helper, $name)方法的代码,您将看到它检查助手上是否存在setView()方法。如果找到这样的方法,则会调用$helper->setView($this),其中$this$view

这是连接发生的地方。在没有这个调用的情况下,似乎虽然视图会知道帮助器(毕竟,你刚刚注册了它),但帮助器将不知道该视图。如果帮助程序尝试访问该视图,它最终会创建一个 new 视图对象,这不是您在Bootstrap中配置的那个。

tl; dr:可能没有必要明确注册帮助程序。使用默认的资源自动加载器和您似乎正在使用的类/方法命名约定,您可以允许内置的插件加载器来处理所有实例化。只需在布局或视图脚本中调用$this->myHelperMethod(),一切都应该很酷。

答案 1 :(得分: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');