quarta-feira, 17 de agosto de 2011

Cut off :: Tirando o 'public' do endereço de sua aplicação Zend

Essa foi plageada descaradamente do cologa Naner do forum ZendBrasil, e postei aqui porque vivo esquecendo onde acho essas dicas.

Todo mundo que inicia no Zend se depara com o fato de todas as páginas aparecerem com o endereço

http://meusiteemzend.com.br/public/umapagina

e uma hora ou outra, vai querer que o endereço fique em uma forma "bonita" - as chamadas URL's limpas, assim:

http://meusiteemzend.com.br/umapagina

Para fazer isso é rápido e simples.
Na raiz de seu projeto ( o primeiro acima do public ai ), crie um arquivo 'index.php':

<?php

    define('RUNNING_FROM_ROOT', true);
    include 'public/index.php';
     

Não feche o código com '?>'.
Agora, na mesma pasta raiz, crie um arquivo '.htaccess' com o conteudo:

SetEnv APPLICATION_ENV production

RewriteEngine On
RewriteRule .* index.php


E rode a página. Se deu tudo certo, leia outro post meu, porque foi muito rápido e agora você está com tempo livre. :D


AH, e não se esqueça, se antes você colocava nos links do zend a referencia ao 'public' como '/' somente, agora você deve referenciar como '/public/'.


Referências:


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: