1

我整个周末都在为 Zend_Navigation 苦苦挣扎,现在我遇到了另一个问题,我相信这是我很多问题的原因。

我正在尝试将 Zend_Navigation 添加到旧版 1.7.6 Zend Framework 应用程序中,我已将 Zend 库更新为 1.9.0 并更新了引导程序以允许此库更新。

问题是我不知道怎么做,示例显示了如何将 Navigation 对象添加到视图的新引导方法,我试过这个:

//initialise the application layouts with the MVC helpers
$layout = Zend_Layout::startMvc(array('layoutPath' => '../application/layouts'));

$view = $layout->getView();
$configNav = new Zend_Config_Xml('../application/config/navigation.xml', 'navigation');
$navigation = new Zend_Navigation($configNav);
$view->navigation($navigation);
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setView($view); 

这似乎运行良好,但是当我在布局中使用面包屑视图助手时,它会出错:严格标准:从 C:\www\moobia\development\website\application\modules\ 中的空值创建默认对象雇主\控制器\IndexController.php 第 27 行

这是由我的控制器的 init() 函数中的以下代码引起的。

$uri = $this->_request->getPathInfo();
$activeNav = $this->view->navigation()->findByUri($uri); <- this is null when called
$activeNav->active = true;

我相信这是因为 Zend_Navigation 对象不在视图中。

我会考虑将引导程序迁移到当前方法,但目前我已经没有时间发布了。

谢谢,

授予

4

1 回答 1

2

首先,您需要确定您对 Zend_Navigation 不在视图中的怀疑是否正确。最简单的方法是添加:

var_dump($this->view->navigation());exit;

到您的控制器 init()。如果 Zend_Navigation 对象存在,它应该返回它。

如果它不存在,提供 Zend_Navigation 对象的另一种方法是使用注册表,这可能更容易。为此,您将从引导程序中删除视图内容,然后执行以下操作:

$configNav = new Zend_Config_Xml('../application/config/navigation.xml', 'navigation');
$navigation = new Zend_Navigation($configNav);
Zend_Registry::set('Zend_Navigation', $navigation);

如果视图对象还没有 Zend Navigation 对象,您的控制器 init() 内容将与在注册表中查看的视图对象保持相同。

但是,我不确定您的控制器 init() 代码是否会按照您想要的方式工作。我不认为 findByUri() 可以在 Mvc 页面上工作(但我可能错了),从你之前的问题来看,你的 XML 文件中的大多数页面都是 Mvc 页面。Mvc 类有一个“href”属性,看起来是等价的。如果您的 XML 文件包含两种页面类型,您可能需要同时检查这两种类型,因此我建议您这样做:

$uri = $this->_request->getPathInfo();
if (($activeNav = $this->view->navigation()->findByHref($uri)) !== null) {
    $activeNav->active = true;
} else if (($activeNav = $this->view->navigation()->findByUri($uri)) !== null) {
    $activeNav->active = true;
}
于 2010-04-02T15:48:31.327 回答