Garçon, os menus :: Como criar multiplos menus com Zend_Navigation

No momento que escrevo estas linhas estou ciente que não falei p*$$@ nenhuma sobre Zend Navigation e a criação de menus, mas como na net tá lotado de tutoriais que já falam sobre isso, deixarei pra outro dia pra fazer minha própria versão.

Por hora, quero falar sobre o segundo passo sobre menu : como criar 2 menus. Ambicioso não ?

Para nosso tutorial, usaremos o seguinte arquivo XML para menus em '/application/configs/menus.xml' :


	




    
        
            #
    

    
        
	    #
    





    
        
	    #
    

    
        
            #
    

    
	
  	    #
    






Onde 'nav1' e 'nav2' são dois menus diferentes e independentes que queremos usar onde quisermos quando quisermos.

Para realizar tal intento, criamos no '/application/Bootstrap.php' o inicializador de menus:

...

// Inicializa os menus de navegação.
protected function _initNavigation(){
					
    $nav1Config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/menu.xml', 'nav1');
    $navigation1 = new Zend_Navigation($nav1Config);
    Zend_Registry::set('Navigation1', $navigation1);

    $nav2Config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/menu.xml', 'nav2');
    $navigation2 = new Zend_Navigation($nav2Config);		
    Zend_Registry::set('Navigation2', $navigation2);

}

...


Coloque na action do controller da sua página a declaração

public function indexAction(){

    $Navigation1 = Zend_Registry::get('Navigation1');
    $this->view->navigation1 = $Navigation1;

    $Navigation2 = Zend_Registry::get('Navigation2');
    $this->view->navigation2 = $Navigation2;
    
}


E finalmente, na view de sua página coloque:

Menu nav1

<?php $options1 = array('ulClass' => 'menu1'); print $this->navigation()->menu()->renderMenu($this->navigation1, $options1); ?>

Menu nav2

<?php $options2 = array('ulClass' => 'menu2'); print $this->navigation()->menu()->renderMenu($this->navigation2, $options2); ?>

Os '$optionsN' é um extra que coloquei no tutorial para você poder definir classes para cada menu separadamente, uma reles mãozinha para ajudar a fazer seu design :D

E se tudo deu certo, vai aparecer cada menu do xml separadamente, com seus própios itens, com sua própria classe, e você pode colocar na view que quiser e quando quiser.

Agora, essa solução é pra quando você quer acrescentar menus de uma forma particular em certas páginas.
Um jeito de deixar a solução "global", inclusive pra ser usado com 'zend_layout', basta fazer no 'Bootstrap.php'

...

// Inicializa os menus de navegação.
protected function _initNavigation(){
					
    $nav1Config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/menu.xml', 'nav1');
    $navigation1 = new Zend_Navigation($nav1Config);
    Zend_Registry::set('Navigation1', $navigation1);

    $nav2Config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/menu.xml', 'nav2');
    $navigation2 = new Zend_Navigation($nav2Config);		
    Zend_Registry::set('Navigation2', $navigation2);

    // Até aqui não muda nada. Você apenas precisará acrescentar umas 
    // variáveis para mandar para a view :
    $view->navigation1 = Zend_Registry::get('Navigation1');
    $view->navigation2 = Zend_Registry::get('Navigation2');

}

...


e pronto, basta colocar as linhas

...

Meu menu 1

<?php print $this->navigation()->menu()->renderMenu($this->navigation1); ?>

Meu menu 2

<?php print $this->navigation()->menu()->renderMenu($this->navigation2); ?> ...

com ou sem o '$optionsN' em qualquer view ou no layout que será renderizado o menu que você deseja.

Percebam que a técnica pode ser estendida para quantos menus desejar também,basta ir acrescentando um 'nav3', 'nav4', etc ; e ir seguindo o padrão aqui.


Simples, né ?



Referências:



Comentários