 Jako, że w Zend Framework 1.8 pojawił się nowy komponent do generowania menu, map stron itp. – Zend_Navigation chciałem z niego skorzystać w aktualnym projekcie, aby nie wynajdować koła od nowa.
Jako, że w Zend Framework 1.8 pojawił się nowy komponent do generowania menu, map stron itp. – Zend_Navigation chciałem z niego skorzystać w aktualnym projekcie, aby nie wynajdować koła od nowa.
Ale w przypadku ZF nie jest to takie proste. Prawie wszystko co nowe w frameworku jest marginalnie opisany w dokumentacji. A nawet jeśli lepiej to brak wiążących przykładów (kontroler – widok – helper). Porozrzucane itp. Wciąż wierzę, że kiedyś dokumentacja ZF osiągnie taki poziom jak ezComponents, gdzie opanowanie komponentu Graph zajęło mi kilka minut.
A wystarczyło wszystko zawrzeć w 6 prostych krokach. Ostatecznie menu zawarłem w pliku navigation.xml, mały wycinek:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | <?xml version="1.0" encoding="UTF-8"?> <config>     <nav>         <home>             <label>Strona główna</label>             <controller>index</controller>         </home>         <issue>             <label>Sprawy</label>             <controller> issue </controller>         </issue>     </nav> </config> | 
Tak samo jak <controller/> możemy dodatkowo podać akcję, która ma się wykonać. Ewentualnie możemy podać gotowy link jako <uri/>.
Następnie wystarczy zrobić zasób dla nawigacji:
| 1 2 3 4 5 6 7 8 9 10 11 12 | class Zextend_Application_Resource_Navigation extends Zend_Application_Resource_ResourceAbstract {     public function init()     {         $config = new Zend_Config_Xml ( APPLICATION_PATH . '/configs/navigation.xml', 'nav' );         $container = new Zend_Navigation($config);         Zend_Registry::set('Zend_Navigation', $container);         return $container;     } } | 
Zamiast podawać $config możemy wstawić gotową tablicę phpową, ale przez to zrobiłby się bałagan i trudny dostęp, gdybyśmy chcieli coś zmieniać. W naszym magicznym pliku application.ini dodajemy poniższą linijkę celem ładowania nowego zasobu:
| 1 | resources.navigation = "array()" | 
Dodatkowo w zasobie Acl powiązałem role z menu, dzięki temu nie mamy linków, do których brakuje nam dostępu. Robi się to następująco, u mnie w Zextend_Application_Resource_Acl:
| 1 2 | Zend_View_Helper_Navigation_HelperAbstract::setDefaultAcl($acl); Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole('guest'); | 
Pozostało nam już tylko wyświetlenie naszego menu w widoku/layoucie. Odpowiedni helper automagicznie załaduje sobie nasz rejestr nazwany 'Zend_Navigation’:
| 1 | <?php echo $this->navigation()->menu()->renderMenu(); ?> | 
W ten sposób wygenerujemy następujący kod:
| 1 2 3 4 | <ul class="navigation"> 	<li class="active"><a href="/">Strona główna</a></li> 	<li><a href="/issue">Sprawy</a></li> </ul> | 
Finito 🙂 Można byłoby zrobić samo generowanie ACL i nawigacji bez zabawy z XML, ale przy aktualnym projekcie jest mi to zbędne. W moich delicjach można znaleźć: Zend Framework: Documentation – Navigation i Navigation Helper.
