我必须在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错误还是我做错了?
答案 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');