2010-08-16 2 views
2

Я рендеринг элементов верхнего уровня объекта Zend навигации в одном месте, как это:Rendering Активного филиала Зенд навигация без Top Level

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

Как делает дерево навигации со второго уровня на вниз для активной ветки? Я попытался создать частичное, которое обходит объект $this->container, но я не знаю, как определить, является ли текущий элемент текущей активностью. Как только я определил, что это активная ветка, как мне отображать меню? Я делаю это с трудом и пропуская что-то очевидное?

Спасибо!


UPDATE:

Я принял решение, потому что это то, что я использовал, но я также хотел бы дать ответ на мой актуальный вопрос, ради эталонным. ($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 затем может быть использован для отображения подменю.

+0

, откуда появляются страницы с индексами в $ branch ['pages']? – Sejanus

ответ

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

Я надеюсь, что помогает немного.

+1

Ключ, который я отсутствовал, это значение 'true' для функции' isActive() '. Это делает функцию рекурсивной. – Sonny

+1

@ Сонный, всегда что-то простое, не так ли ?! – allnightgrocery

5

Если бы я получил свой вопрос правильно, это то, как я это делаю:

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

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

+0

Это действительно отображает подменю активного меню, но я всегда хотел отобразить его со второго уровня. – Sonny

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

Что произойдет, если вы находитесь на странице, находящейся на третьем уровне? – Sonny

+0

Проверьте это, мне нужно было трехуровневое меню, но с каждым уровнем отдельно. Итак, что я сделал: ' 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. –