我想使用导航助手使用Acl构建我的导航菜单。 Acl部分我工作正常。
我现在希望能够显示几种不同类型的导航。例如。 admin-nav,side-nav,new-nav等。我在文档中找不到任何相关内容。仅限如何设置导航,然后在布局或视图中重复使用该导航对象。
我尝试了类似的东西 - 有两个不同的容器,具有不同的页面数组,然后在注册表中设置这些容器。然后从我的视图和/或布局中调用导航并将其传递给容器:
<?php echo $this->navigation(Zend_Registry::get("news-nav")) ?>
在我的新闻视图中调用上面的内容,在我的布局中调用以下内容
<?php echo $this->navigation(Zend_Registry::get("admin-nav")) ?>
除了新闻页面之外,这适用于我的所有页面。在我的新闻页面上,新闻导航显示两次,一次在布局中,一次在新闻视图中。管理员导航从不显示,似乎被新闻导航覆盖。
我可能会以完全错误的方式解决这个问题,如果是这样,请让我知道一个更好的方法。如果这种方法看起来不错,有人可以帮我理清新闻导航在布局和新闻视图中显示的原因。
感谢您的时间
杰克
答案 0 :(得分:10)
我有同样的问题。我只需在控制器中为我需要的每个菜单创建Zend_Navigation_Container的多个实例,将它们传递给视图,然后通过将对象直接传递给菜单渲染方法来渲染它们。如下:
在控制器中:
$this->view->menu1 = new Zend_Navigation_Container();
$this->view->menu2 = new Zend_Navigation_Container();
在视图中:
$this->navigation()->menu()->renderMenu($this->menu1);
$this->navigation()->menu()->renderMenu($this->menu2);
您甚至可以自定义每个(通过在初始menu()调用后插入方法调用:
$this->navigation()->menu()->setUlClass('my_first_menu')->renderMenu($this->menu1);
$this->navigation()->menu()->setUlClass('my_second_menu')->renderMenu($this->menu2);
答案 1 :(得分:1)
或者您可以缩短语法
$this->menu($this->menu1);
答案 2 :(得分:1)
我刚遇到这个需要多次导航的问题,并且在此过程中发现了您的问题,这实际上是Zend_View_Helper_Navigation_HelperAbstract
中的一个错误。
第516行:
public function __toString()
{
try {
return $this->render();
} catch (Exception $e) {
$msg = get_class($e) . ': ' . $e->getMessage();
trigger_error($msg, E_USER_ERROR);
return '';
}
}
这里的问题是,如果你没有明确地调用$this->navigation->render($container)
或像$this->navigation()->menu($container)
这样的魔术方法,那么对render
的调用最终不会将容器传递给它。< / p>
这反过来导致navigation
的{{1}}的默认视图助手从menu
中拉出(在这种情况下,它将使用最后一个给定的容器),或者在现场实例化(导致没有容器)。
这是我在registry
上调用getContainer
的简单修复。
第516行:
__toString
查看与public function __toString()
{
try {
return $this->render($this->getContainer());
} catch (Exception $e) {
$msg = get_class($e) . ': ' . $e->getMessage();
trigger_error($msg, E_USER_ERROR);
return '';
}
}
相关的所有帮助文件,显然打算调用Navigation
。很明显,如果您直接或通过getContainer
魔术方法调用menu
视图助手,这不是问题。
更改上面的那一行后,您应该可以调用navigation
并渲染多个导航,而无需直接调用$this->navigation($container)
帮助程序。