代码之家  ›  专栏  ›  技术社区  ›  Jake N

Zend框架-多页导航块

  •  8
  • Jake N  · 技术社区  · 15 年前

    我想使用导航助手使用Acl构建我的导航菜单。我的Acl部分工作正常。

    我尝试了类似的方法——使用两个不同的容器,使用不同的页面数组,然后在注册表中设置这些容器。然后从我的视图和/或布局中调用导航并向其传递容器:

    <?php echo $this->navigation(Zend_Registry::get("news-nav")) ?>
    

    <?php echo $this->navigation(Zend_Registry::get("admin-nav")) ?>
    

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

    我可能完全走错了路,如果是这样,请让我知道一个更好的方法。如果这个方法看起来不错,有人能帮我弄清楚为什么新闻导航显示在版面和新闻视图中。

    满意的

    3 回复  |  直到 15 年前
        1
  •  10
  •   berty    15 年前

    我也有同样的问题。我只需在控制器中为我需要的每个菜单创建Zend_Navigation_容器的多个实例,将它们传递到视图,然后通过将对象直接传递到菜单渲染方法来渲染它们。详情如下:

    在控制器中:

    $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);
    

    您甚至可以自定义每个方法(通过在初始菜单()调用之后插入方法调用:

    $this->navigation()->menu()->setUlClass('my_first_menu')->renderMenu($this->menu1);
    $this->navigation()->menu()->setUlClass('my_second_menu')->renderMenu($this->menu2);
    
        2
  •  1
  •   SMka    15 年前

    $this->menu($this->menu1);
    
        3
  •  1
  •   Ballsacian1    14 年前

    我刚刚遇到了需要多个导航的问题,在这个过程中发现了您的问题,实际上这是 Zend_View_Helper_Navigation_HelperAbstract .

    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

    这又会导致默认的视图辅助对象 navigation menu registry (在这种情况下,它将使用最后一个给定的容器),或在现场实例化(这导致没有容器)。

    getContainer 在…上 __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 . 如果你打电话给 直接或通过 航行 神奇的方法。

    $this->navigation($container) 并呈现多个导航,而无需调用 菜单 直接帮助。