【问题标题】:Rendering Active Branch of Zend Navigation Without Top Level在没有顶层的情况下渲染 Zend Navigation 的活动分支
【发布时间】:2010-08-16 19:48:47
【问题描述】:

我在一个地方渲染 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 然后可以用于渲染子菜单。

【问题讨论】:

  • $branch['pages'] 中的索引“pages”从何而来?

标签: php zend-framework zend-navigation


【解决方案1】:

如果我的问题没有错,我就是这样做的:

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

仅呈现当前活动菜单的子菜单。

【讨论】:

  • 这确实渲染了活动菜单的子菜单,但我想总是从第二层向下渲染。
【解决方案2】:

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

$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
        }
      }
    }
  }
}

希望对你有所帮助。

【讨论】:

  • 我缺少的关键是 isActive() 函数的 true 值。它使函数递归。
  • @Sonny,总是很简单,不是吗?!
【解决方案3】:

我是这样做的:

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

【讨论】:

  • 如果您在第三级的页面上会发生什么?
  • 检查一下,我需要一个 3 级菜单,但每个级别都是分开的。所以我所做的是:` navigation()->menu()->setMaxDepth(0); ?> navigation()->menu()->setOnlyActiveBranch(true)->setRenderParents(true)->setMinDepth(1)->setMaxDepth(1 ); ?> navigation()->menu()->setOnlyActiveBranch(true)->setRenderParents(false)->setMinDepth(2)->setMaxDepth(2 ); ?> `我目前正在测试这个,它似乎工作正常,即使在第 3 级活动时也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2022-10-07
  • 2018-04-13
相关资源
最近更新 更多