ZF: Zend_Navigation
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:
<?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:
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:
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:
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’:
<?php echo $this->navigation()->menu()->renderMenu(); ?>
W ten sposób wygenerujemy następujący kod:
<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.









webit
27 maj, 2009
„Dodatkowo w zasobie Acl powiązałem role z menu(…)” może jakiś przykład? To powiązanie wydaje się być brakującym ogniwem, do zrozumienia całego wpisu i owych 6. kroków
matipl
27 maj, 2009
Dla mnie logicznie to brzmiało, ale poprawiłem stylistykę.
@webit chodzi o 2 linijki:
Zend_View_Helper_Navigation_HelperAbstract::setDefaultAcl($acl); Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole('guest');herhor
25 cze, 2009
jak wygląda acl dla tego przykładu?! Bez tego ani rusz. Próbuje rozgyźć nawigację razem z acl-em i oddzielnie wszystko ok, a razem ani rusz. Miałem nadzieję, że ten artykuł to rozwiąże ale… brak acl-a. Proszę o uzupełnienie ciekawego helpa.
matipl
26 cze, 2009
@herhor: definicja ACL nie różni się w tym przypadku niczym.
W moim projektach oparta głównie o plik acl.ini
Odpowiednio ładowana za pomocą Zextend_Application_Resource_Acl, do tego mam sprawdzanie praw w Zextend_Controller_Plugin_Acl
Jedyny problem w zend nawigacji jaki może się Ci pojawić to definicja domyślnej roli. Zamiast domyślnego „guest” możesz potrzebować użyć „member”.
W moim wypadku role to: guest, member, admin.
Jakby co zapraszam na stronę kontaktu po namiary na mnie
herhor
26 cze, 2009
Rozgryzłem. Uprawnienia w acl były w porządku. Problem tkwił w definicji $container. jest:
label Strona główna label
controller index controller
a brakło sekcji:
privilege edytuj privilege to jest akcja
resource index resource to jest kontroler
teraz działa znakomicie! Mimo wszystko dzięki za szybką odpowiedź. Ps.
Fajny blog. Będę to częściej wpadał!
Obciąło mi znaki:) więc może dlatego tak trochę mało przejrzyście opisałem sekcje. ach te zabezpieczenia