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.