Saturday
31
October
autor:
Mateusz Tymek
kategorie:

Zend_Navigation: menu z ikonkami

Zend Framework pozwala na łatwe wyświetlenie systemu nawigacji przy pomocy helpera Zend_View_Helper_Navigation_Menu:

<?php echo $this->navigation()->menu(); ?>

Zgodnie z tym co możemy wyczytać w manualu, powyższy kod wygeneruje menu oparte na tagach <ul> i <li>. W jaki sposób otrzymać coś bardziej skomplikowanego, na przykład menu z ikonami przy każdej pozycji?

Na potrzeby przykładu wyobraźmy sobie menu zdefiniowane w następujący sposób:

<?xml version="1.0" encoding="UTF-8"?>
<configdata>
    <nav>
        <id>main</id>
        <uri>/</uri>
        <pages>

            <index>
                <label>Podsumowanie</label>
                <controller>index</controller>
                <action>index</action>
                <icon>information.png</icon>
            </index>

            <articles>
                <label>Artykuły</label>
                <controller>articles</controller>
                <action>index</action>
                <icon>articles.png</icon>
            </articles>

            <categories>
                <label>Kategorie</label>
                <controller>categories</controller>
                <action>index</action>
                <icon>categories.png</icon>
            </categories>

            <users>
                <label>Użytkownicy</label>
                <controller>users</controller>
                <action>index</action>
                <icon>users.png</icon>
            </users>
        </pages>
    </nav>
</configdata>

Każda pozycja menu ma przyporządkowaną ikonę (nazwę pliku PNG). Obiekt klasy Zend_Navigation tworzymy według instrukcji obsługi:

$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$navigation = new Zend_Navigation($config);

Aby wyświetlić te ikony trzeba utworzyć nowy pomocnik widoku. Nie musimy budować go od podstaw - wykorzystamy klasę Zend_View_Helper_Navigation_Menu jako bazę:

<?php
// IconMenu.php
class Zend_View_Helper_IconMenu extends Zend_View_Helper_Navigation_Menu
{
    protected $_iconPath = '/images/icons';

    public function iconMenu(Zend_Navigation_Container $container = null)
    {
        if (null !== $container) {
            $this->setContainer($container);
        }

        return $this;
    }

    public function htmlify(Zend_Navigation_Page $page)
    {
        // get label and title for translating
        $label = $page->getLabel();
        $title = $page->getTitle();

        // translate label and title?
        if ($this->getUseTranslator() && $t = $this->getTranslator()) {
            if (is_string($label) && !empty($label)) {
                $label = $t->translate($label);
            }
            if (is_string($title) && !empty($title)) {
                $title = $t->translate($title);
            }
        }

        // get attribs for element
        $attribs = array(
            'id'     => $page->getId(),
            'title'  => $title,
            'class'  => $page->getClass()
        );

        // does page have a href?
        if ($href = $page->getHref()) {
            $element = 'a';
            $attribs['href'] = $href;
            $attribs['target'] = $page->getTarget();
        } else {
            $element = 'span';
        }
        
        // dodanie ikonki
        if (null !== $page->icon)
        {
            $icon = '<img src="'.$this->view->baseUrl().$this->_iconPath.'/'.$page->icon.'" alt="" /> ';
        } else {
            $icon = '';
        }

        return '<' . $element . $this->_htmlAttribs($attribs) . '>'
             . $icon
             . $this->view->escape($label)
             . '</' . $element . '>';
    }
}

Z tego kodu najbardziej istotna jest metoda htmlify() która generuje kod HTML danego odnośnika. Skopiowałem ją w całości z klasy bazowej, a następnie wstawiłem kod który dodaje ikonkę (oznaczony komentarzem). Zmienna $_iconPath określa lokalizację ikon na serwerze - w moim przypadku jest to www.domena.tld/images/icons.

Cały kod (plik IconMenu.php) trzeba umieścić w odpowiednim katalogu, aby był dostępny dla klasy Zend_View (np application/view/helpers). Następnie można już wygenerować menu w skrypcie widoku:

<?php echo $this->navigation()->iconMenu(); ?>

Efekt (po dodaniu odpowiednich stylów CSS):

 
Tagi: zend_navigation, ikony
Komentarze
baleon 8 March 2010
Fajne rozwiazanie. A mozna tak zrobic zeby bylo kilka takich blokow menu np3 w jednym widoku?
Podobne artykuły
Skomentuj artykuł

Nazwa użytkownika powinna składać się z conajmniej pięciu liter, cyfr i znaków podkreślenia. Powinna zaczynać się od litery.

Pole wymagane.
Adres e-mail nie zostanie pokazany publicznie.