在没有顶层的情况下渲染Zend导航的活动分支

时间:2010-08-16 19:48:47

标签: php zend-framework zend-navigation

我在一个地方渲染Zend Navigation对象的顶级元素,如下所示:

echo $this->navigation()->menu()->setMaxDepth(0);

如何从活动分支的第二级渲染导航树?我已经尝试创建一个循环$this->container对象的部分,但我不知道如何确定我当前的项是否是活动分支。一旦我确定它是活动分支,我该如何渲染菜单?我这么做的很难,并且遗漏了一些明显的东西吗?

谢谢!


更新

我接受了一个解决方案,因为这是我使用的,但我也想提供我的实际问题的答案,以供参考。 ($this是视图对象)

// Find the active branch, at a depth of one
$branch = $this->navigation()->findActive($this->nav, 1, 1);
if (0 == count($branch)) {
    // no active branch, find the default branch
    $pages = $this->nav->findById('default-branch')->getPages();
} else {
    $pages = $branch['page']->getPages();
}
$this->subNav = new Zend_Navigation($pages);
然后可以使用

$this->subNav来渲染子菜单。

3 个答案:

答案 0 :(得分:5)

如果我的问题是对的,我就是这样做的:

print $this->navigation()->menu()->renderMenu(null, array(
    'minDepth' => 1,
    'maxDepth' => 1,
    'onlyActiveBranch' => true,
    'renderParents' => false));

仅渲染当前活动菜单的子菜单。

答案 1 :(得分:4)

我做了类似的事情。我的主导航处理是这样的......

$this->navigation()->menu()->setPartial('tabs.phtml');
echo $this->navigation()->menu()->render();

然后在我的tabs.phtml中迭代容器就像这样......

if (count($this->container)) {
  foreach($this->container as $page) {
    if ($page->isVisible()) {
      if ($page->isActive(true)) {
        $subcontainer = $page->getPages();
        foreach($subcontainer as $subpage) {
          // echo my link
        }
      }
    }
  }
}

我希望有所帮助。

答案 2 :(得分:0)

我是这样做的:

<?php

// Render top-level elements
echo $this->navigation()->menu()->setMaxDepth(0);

// Render 2nd level elements for active element
echo $this->navigation()->menu()
        ->setOnlyActiveBranch(true)
        ->setRenderParents(false)
        ->setMinDepth(1);

?>

但这不是一个好的解决方案。每个级别更好一个单独的菜单:

<!-- level 1 -->
<?php echo $this->navigation()->menu()->setMaxDepth(0); ?>


<!-- level 2 -->
<?php echo $this->navigation()->menu()->setOnlyActiveBranch(true)->setRenderParents(true)->setMinDepth(1)->setMaxDepth(1); ?>



<!-- level 3 -->
<?php echo $this->navigation()->menu()->setOnlyActiveBranch(true)->setRenderParents(false)->setMinDepth(2)->setMaxDepth(2); ?>