2013-02-12 16 views
6

powiedzieć, że mam następujący nawigacja:Zend Framework 2 Nawigacja Sub-Sub menu

Home 
Internal 
    Folders 
     New Folder 
    Configuration 
     Categories 
      New 
     Tags 
      New 
     Options 
      New 
    Contact 
External 

Kod użyłem w moim layout.phtml pokazania tego menu:

$internal = $this->navigation('navigation')->findOneByLabel('Internal'); 
echo $this->navigation('navigation') 
      ->menu() 
      ->setUlClass('nav nav-list') 
      ->setMaxDepth(1) 
      ->renderMenu($internal); 

więc to pokazuje tak:

Folders 
    New Folder 
Configuration 
    Categories 
    Tags 
    Options 
Contact 

Obecnie dostaję przyzwoity menu, pokazano wszystkie rodziców i pierwsze dzieciaki, więc „nowy” NAVIGA nigdy się nie wyświetla.

Jednakże, jeśli jestem na stronie „Kategorie” Chcę pokazać swoje dzieciaki też, więc „Nowy” w „kategorie” powinny być widoczne, jak następuje:

Folders 
    New Folder 
Configuration 
    Categories 
     New 
    Tags 
    Options 
Contact 

I próbowałem wielu sposobów na wypróbowanie tego i sprawdziłem wszystkie opcje (setMinDepth, setMaxDepth, renderSubMenu, setParentMenu), które możesz nadać menu w layout.phtml, bez powodzenia. Jest to "nowy" zawarty lub nieuwzględniony, nie jest czymś pośrednim.

Dokumentacja dotycząca ZF2 nie daje mi nic o tym, jak uzyskać dostęp do tego podmenu, z wyjątkiem częściowego.

Czy częściowa jest jedyną opcją dla tego?

Z góry dziękuję!

Odpowiedz

1

W przypadku niewielkiego projektu jakiś czas temu zrobiłem coś naprawdę szybkiego. Planowaliśmy oczyścić kod i umożliwić jego konfigurację, ale nigdy nie dotarliśmy do kolejnego projektu, w którym wymagaliśmy tego samego.

TL; DR: Nie można użyć normalnego helpera widoku zf2, ale należy wyszukać stronę "najwyższego poziomu", która ma zostać wyświetlona (zawartość wewnętrzna w twoim przypadku) i wyświetlić menu poniżej tej strony.

<?php 

namespace Application\View\Helper; 

use Zend\View\Helper\AbstractHelper; 

class SubNavigation extends AbstractHelper 
{ 
    public function __invoke($class = null) 
    { 
     $view = $this->getView(); 
     $menu = $view->navigation()->menu(); 

     $container = $view->navigation()->getContainer(); 
     $active = $view->navigation()->setRenderInvisible(true)->findActive($container); 

     if (!$active) { 
      return; 
     } 

     $container = $active['page']; 
     $depth  = $active['depth']; 

     while (0 !== $depth) { 
      $container = $container->getParent(); 
      $depth--; 
     } 

     $visible = $container->isVisible(); 
     $html = $menu->setContainer($container->setVisible(true)) 
         ->setUlClass('') 
         ->setOnlyActiveBranch(false) 
         ->setMinDepth(null) 
         ->setMaxDepth(null) 
         ->render(); 

     $container->setVisible($visible); 

     if (strlen($html)) { 
      return sprintf('<ul %s><li%s><a href="%s">%s</a>%s</li></ul>', 
        (null !== $class) ? ' class="' . $class . '"' : null, 
        ($container->isActive())? ' class="active"' : null, 
        $container->getHref(), 
        $container->getLabel(), 
        $html); 
     } 
    } 
} 

Pogląd ten pomocnik sprawia, że ​​„wewnętrzny” jako najlepszy punkt-menu w wywołaniu sprintf(), ale można łatwo zmienić to zachowanie. Możesz po prostu echo $html, a następnie to, czego faktycznie potrzebujesz.

+0

Dzięki, pomogło! :) – Bananam00n

+0

FYI, włączyłem do biblioteki Soflomo \ Common tego pomocnika kilka dni temu. Upewnij się, że polegasz na co najmniej 0.3.1: https://github.com/Soflomo/Common –