Рендеринг активной ветки Zend Navigation без верхнего уровня - PullRequest
2 голосов
/ 16 августа 2010

Я визуализирую элементы верхнего уровня объекта 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 ]

5 голосов
/ 01 апреля 2011

Если я правильно понял ваш вопрос, вот как я это делаю:

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

Отображает только подменю текущего активного меню.

4 голосов
/ 20 августа 2010

Я делаю что-то подобное. Моя основная навигация обрабатывается примерно так ...

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

Надеюсь, это немного поможет.

0 голосов
/ 16 декабря 2011

Я делаю это так:

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