Zend Framework - 多板导航块

时间:2009-11-16 17:26:47

标签: php zend-framework navigation

我想使用导航助手使用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")) ?>

除了新闻页面之外,这适用于我的所有页面。在我的新闻页面上,新闻导航显示两次,一次在布局中,一次在新闻视图中。管理员导航从不显示,似乎被新闻导航覆盖。

我可能会以完全错误的方式解决这个问题,如果是这样,请让我知道一个更好的方法。如果这种方法看起来不错,有人可以帮我理清新闻导航在布局和新闻视图中显示的原因。

感谢您的时间

杰克

3 个答案:

答案 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)帮助程序。