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');
}

现在,我将一些变量传递给 layout(传递给 Zend_View 实例,一如既往),但 layout 不承认它有它们。

当我将注册助手的代码移动到控制器中的 init() 方法时,一切正常。是 ZF 错误还是我做错了什么?

4

2 回答 2

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 .占位符)

编辑 2:确保您也在引导视图。

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

您的视图助手setView()是否直接或作为 的子类实现该方法Zend_View_Helper_Abstract

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

这是发生连接的地方。在没有这个调用的情况下,看起来虽然视图会知道助手(毕竟,你只是注册了它),助手将不知道视图。如果帮助器尝试访问视图,它最终会创建一个的视图对象,这不是您在 Bootstrap 中配置的方式。

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

于 2012-01-31T14:31:41.407 回答