Zend_Navigation:无法使用多个容器获取面包屑

时间:2009-12-17 06:11:09

标签: zend-framework zend-navigation

  

可能重复:
  Zend Framework - multiplate navigation blocks

我正在尝试在我的应用程序中进行面包屑渲染(它们不会显示在任何地方,甚至没有显示主页,它有相应的Zend Page Uri对象),它有多个导航区域 - 主要和实用程序。对于菜单生成,我有一个MenuController,我在布局中使用:

进行渲染
$this->layout()->utility = $this->action('render', 'menu', null, array('menu' => $this->utilityId));
$this->layout()->nav = $this->action('render', 'menu', null, array('menu' => $this->mainMenuId));

utilityIdmainMenuId属性是数字,从数据库中抓取。

Menu控件的render方法只是构建一个数组并创建一个Zend Navigation对象,然后调用setContainer并将其设置为该容器。这是伪代码,因为它相当长:

// MenuController.php
private function renderAction() {
    $itemArray[] = array('label' => $label, 'uri' => $uri ); // in a loop
    $container = new Zend_Navigation($itemArray);
    if ( $container instanceof Zend_Navigation_Container ) {
       $this->view->navigation()->setContainer( $container );
       $uri = $this->_request->getPathInfo();
       $item = $this->view->navigation()->findByUri($uri);
       $item->active = true;
    }
}

因此,此实现方法在实用程序和导航的布局中被调用两次。

修改 我认为问题是我需要指定$ container所以我的代码将是

$this->navigation($container)->breadcrumbs();

但是因为我正在使用$this->action('render', 'menu' ) $container变量设置在那里而没有返回,有没有办法可以用其他方式指定容器?可能使用$this->layout()->nav和指向容器的属性。

This看起来是同一个问题,有人建议使用Zend_Registry设置/获取它们,也许我会尝试一下。

3 个答案:

答案 0 :(得分:1)

我怀疑您没有导航层次结构。您需要页面内的页面。

e.g。

Home Page
[pages] => Sign In
           [pages] => Forgot Password
        => Create Account
           [pages] => Confirm Account Email
                   => Email Confirmed

使用上述内容,面包屑将在除主页之外的所有活动页面上呈现...如果您这样做,所有页面都会显示:

$this->navigation()->breadcrumbs()->setMinDepth(0); // don't skip the root page

或者也许是别的,但很难说。不过我希望有所帮助!

答案 1 :(得分:0)

这可能是一个肮脏的解决方案,但我使用Zend_Registry手动设置容器引用,如下所示:

Zend_Registry::set( 'nav' . $menu, $container );

并吐出来:

$main = Zend_Registry::get( 'nav' . $this->mainMenuId );
echo $this->navigation( $main )->breadcrumbs()->setMinDepth(0);

答案 2 :(得分:0)

这可能不是您需要的全部答案,但它可以让您更进一步。

请参阅:this answer