Każdy, kto chociaż raz musiał dodać menu i breadcrumbs do strony internetowej, wie jak niewdzięczne jest to zadanie. Można je wykonać na dwa sposoby – ręcznie (i modyfikować za każdym razem, gdy w strukturze strony zajdą jakieś zmiany) lub przy pomocy skryptu. W tym drugim przypadku należy napisać/znaleźć odpowiedni skrypt, który będzie prosty w użyciu oraz utrzymaniu. Rozwiązaniem takim jest właśnie Zend_Navigation.
Na początek muszę napisać, że Zend_Navigation nie jest rozwiązaniem wszystkich problemów. Zend_Navigation zostało tak napisane, by ułatwić tworzenie standardowych menu. Każde odstępstwo od standardowego menu spowoduje, że będziemy musieli sporo się nagimnastykować, by nasze menu wyglądało i działało tak jak powinno.
Dzisiaj pokażę w jaki sposób stworzyć proste dwupoziomowe menu oraz breadcrumbs.
Do konfiguracji naszej nawigacji można użyć XML, ini lub PHP. Ja wybrałem PHP.
Plik konfiguracyjny zawiera informacje o tym, jakie elementy naszej strony mają się znaleźć w menu i breadcrumbs oraz na jaki adres ma wskazywać konkretny element.
Zaczniemy od stworzenia pliku navigation.php w katalogu configs. Do pliku należy wpisać tablicę o poniższej postaci:

<?php
return array(
 array(
  'label' => 'Strona główna',
  'module' => 'default',
  'controller' => 'index',
  'action' => 'index',
  'pages' => array(
   array(
    'label' => 'Kontakt',
    'module' => 'default',
    'controller' => 'index',
    'action' => 'contact'
   ),
   array(
    'label' => 'O mnie',
    'module' => 'default',
    'controller' => 'index',
    'action' => 'aboutme'
   )
  )
 ),
 array(
  'label' => 'Użytkownicy',
  'module' => 'default',
  'controller' => 'user',
  'action' => 'index',
  'pages' => array(
   array(
    'label' => 'Lista',
    'module' => 'default',
    'controller' => 'user',
    'action' => 'list'
   ),
   array(
    'label' => 'Dodaj',
    'module' => 'default',
    'controller' => 'user',
    'action' => 'add'
   )
  )
 )
);

Sądzę, że nie wymaga ona dodatkowych wyjaśnień, ponieważ wszystko widać jak na dłoni, ale na wszelki wypadek opiszę klucze tablicy.

  • label – wyświetlana nazwa elementu menu/breadcrumb
  • module, controller, action – nazwa modułu, kontrolera oraz akcji, które utworzą link
  • pages – tablica podstron

Pełną listę kluczy można znaleźć w dokumentacji.

Kolejnym krokiem jest inicjalizacja nawigacji. Dobrym miejscem na to jest bootstrap. Należy dodać do niego nowy zasób (ja zrobiłem to w postaci metody), a w nim utworzyć obiekt Zend_Navigation. Do obiektu przekazujemy tablicę z konfiguracją, a całość do helpera widoku.

protected function _initNavigation()
{
 $this->bootstrap('layout');
 $layout = $this->getResource('layout');
 $view = $layout->getView();

 $config = require APPLICATION_PATH . '/configs/navigation.php';
 $navigation = new Zend_Navigation($config);
 $view->navigation($navigation);
}

Ostatnim krokiem jest modyfikacja pliku layout.phtml tak, by korzystał z naszej nawigacji.

<?php echo $this->doctype(); ?>
<html> 
<head>
 <?php echo $this->headMeta(); ?>
 <?php echo $this->headTitle(); ?>
 <?php echo $this->headLink(); ?>
 <?php echo $this->headStyle(); ?>
 <?php echo $this->headScript(); ?>
</head>
<body>
 <div id="main-menu">
  <?php echo $this->navigation()->menu()->setMaxDepth(0) ?>
  <div class="clear"></div>
 </div>
 <div id="breadcrumbs">
  <?php echo $this->navigation()->breadcrumbs()
           ->setMinDepth(0)
           ->setSeparator(' &raquo; ') ?>
 </div>
 
 <div id="sub-menu" class="left">
  <?php echo $this->navigation()->menu()->renderSubMenu() ?>
 </div>
 <div id="content" class="left">
  <?php echo $this->layout()->content; ?>
 </div>
 <div class="clear"></div>

</body>
</html>

W powyższym przykładzie, menu zostało podzielone na dwie części – menu główne, znajdujące się na górze strony oraz menu boczne, umiejscowione na lewo od treści dokumentu. Pod menu górnym znajdują się breadcrumbs.

Za wygenerowanie menu odpowiada helper menu(). Jeśli zostanie wywołany bez żadnych parametrów, zostanie utworzone pełne drzewo menu. W naszym przypadku użyta została metoda setMaxDepth(), która jako parametr przyjmuje maksymalną ilość zagnieżdżeń, do której będzie generowane menu. Ponieważ na górze ma się znaleźć menu zawierające jedynie główne elementy, ilość zagnieżdżeń została ustalona na 0. Za menu boczne odpowiada metoda renderSubMenu(). Jej zadaniem jest wygenerować gałąź menu dla aktywnego elementu nadrzędnego. Innymi słowy, metoda ta generuje tylko te elementy menu, które znajdują się w tablicy pages, aktualnego elementu głównego.

Okruszki chleba są generowane przez helper breadcrumbs(). Podobnie jak w przypadku menu, mamy możliwość modyfikacji wyglądu i zachowania okruszków. Najpierw musimy ustalić minimalną głębokość, od której okruszki będą wyświetlane. Ustawienie jej na 0 spowoduje, że breadcrumbs będzie pokazywał ścieżkę od głównego elementu. Na koniec zmieniamy separator oddzielający poszczególne okruszki od siebie – setSeparator(‚ &raquo; ‚).

Jedyne co pozostało, to dodać style, by menu i breadcrumbs dobrze się prezentowały.

Jak widać dzięki zastosowaniu Zend_Navigation bardzo ułatwiło nam pracę. Ale to nie wszystko co potrafi Zend_Navigation. Oprócz menu i breadcrumbs, można wygenerować jeszcze mapę strony (jak to się robi, pozostawiam wam do zbadania). Ponadto helpery Zend_Navigation można zintegrować z Zend_Acl, dzięki czemu otrzymamy “inteligentne” menu, które będzie dbało o sprawdzenie uprawnień. Ale o tym napiszę przy okazji omawiania Zend_Acl.