Trabalhando com layouts diferentes por módulo no Zend Framework
Fala galera, tudo certo?
A ideia deste artigo surgiu de uma dúvida que apareceu no fórum iMasters, sobre como trabalhar com layouts diferentes e com os módulos do Zend Framework.
Começando, vamos imaginar uma estrutura simples com 2 módulos (default e admin). Vamos criar a estrutura com o Zend Tool.
Criando o projeto:
zf create project example
Agora, criando os módulos:
cd example zf create module default zf create module admin zf create controller Index -m default zf create controller Index -m admin
Com isto, criamos os módulos default e admin, criando também o controller Index em cada um deles.
Certo, mas e o layout? Agora, vamos fazer os ajustes no application.ini para conseguirmos trabalhar com layouts por módulos. Vamos lá.
application.ini
[production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 phpSettings.date.timezone = "America/Sao_Paulo" resources.frontController.params.displayExceptions = 0 resources.locale.default = "pt_BR" ; layouts resources.layout.layout = "layout" ; include path includePaths.library = APPLICATION_PATH "/../library" appnamespace = "Application" ; bootstrap bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" ; front controller resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.modules[]= "" resources.frontController.defaultModule = "default" resources.frontController.prefixDefaultModule = "true" resources.frontController.actionHelperPaths.App_Action_Helper = "App/Helpers/Action" ; view resources.view.doctype = "HTML5" resources.view.encoding = "UTF-8" resources.view.charset = "UTF-8" resources.view.helperPath.App_View_Helper = "App/Helpers/View" [staging : production] [testing : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1 [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1
A “mágica”
Agora, vamos à mágica… (ok, não tem mágica, mas é bem legal
). Criamos um arquivo chamado layout.phtml para cada módulo e deixamos ele dentro da pasta raiz da view do respectivo módulo. Por exemplo, para o módulo default, o arquivo fica em /application/modules/default/views/scripts/layout.phtml e tem, por exemplo, o seguinte conteúdo:
<?php echo $this->doctype()?>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<?php
$this->headTitle()->append('Layout e módulos - Zend Framework');
$this->headTitle()->setSeparator(' - ');
echo $this->headTitle(),PHP_EOL;
$this->headMeta()->headMeta ('Matias Rezende', 'author');
$this->headLink()->setSeparator(PHP_EOL)
->prependStylesheet($this->baseUrl('estilos/estilo.css'));
$this->headScript ()->setSeparator(PHP_EOL)
->prependFile ($this->baseUrl('scripts/jquery/jquery-1.6.1.min.js') );
echo $this->headMeta(),PHP_EOL;
echo $this->headLink(),PHP_EOL;
echo $this->headScript();
?>
</head>
<body>
<div id="wrapper">
<div id="content">
<h1>Modulo default</h1>
<?php echo $this->layout()->content;?>
</div><!-- /content -->
</div><!-- /wrapper -->
</body>
</html>
Para o módulo admin (/application/modules/admin/views/scripts/layout.phtml), colocamos o conteúdo abaixo (mesma estrutura com a mudança apenas no texto que aparece no H1 – apenas para diferenciar):
<?php echo $this->doctype()?>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<?php
$this->headTitle()->append('Layout e módulos - Zend Framework');
$this->headTitle()->setSeparator(' - ');
echo $this->headTitle(),PHP_EOL;
$this->headMeta()->headMeta ('Matias Rezende', 'author');
$this->headLink()->setSeparator(PHP_EOL)
->prependStylesheet($this->baseUrl('estilos/estilo.css'));
$this->headScript ()->setSeparator(PHP_EOL)
->prependFile ($this->baseUrl('scripts/jquery/jquery-1.6.1.min.js') );
echo $this->headMeta(),PHP_EOL;
echo $this->headLink(),PHP_EOL;
echo $this->headScript();
?>
</head>
<body>
<div id="wrapper">
<div id="content">
<h1>Modulo admin</h1>
<?php echo $this->layout()->content;?>
</div><!-- /content -->
</div><!-- /wrapper -->
</body>
</html>
Pronto!!!! Agora, vamos explicar o que fizemos no application.ini:
Explicando passo a passo
; layouts resources.layout.layout = "layout"
Aqui dissemos que o nome do arquivo de layout vai ser layout.phtml. Pode ser qualquer nome que você quiser (base, mainView…), desde que modifique o nome do arquivo também.
; front controller resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.modules[]= "" resources.frontController.defaultModule = "default" resources.frontController.prefixDefaultModule = "true"
Configuração básica para trabalhar com módulos. Primeiro definimos a pasta dos módulos. Depois dissemos que existe mais de um módulo. Posteriormente definimos que o primeiro módulo é o default. Na última linha, definimos que o nome dos controllers terá o prefixo (Default_IndexController). Prefiro deixar assim porque ao criar um controller pelo Zend Tool ele cria com o prefixo. Para não ter que editar arquivo por arquivo, prefiro deixar assim mesmo.
Espero que tenham gostado. Se gostou, comente e compartilhe!!!



Excelente artigo Carlos, parabéns!
Fico feliz que o tópico que eu criei lá no fórum do iMasters tenha inspirado você a criar este artigo, pois certamente irá ajudar muita gente que como eu está dando seus primeiros passos com o ZF.
Eu particularmente não conhecia o seu blog, acabei de ver que tem bastante conteúdo relacionado ao ZF, com certeza irei aproveitar bastante.
Um abraço!
Ótimo artigo, Carlos. Obrigado.
Tenho uma dúvida. No application.ini vc colocou:
resources.frontController.defaultModule = “default”
Como vc disse, o zend tool coloca o prefixo do módulo nos controllers certo?
E como fica para os demais módulos? Pois neste caso resolvemos apenas a questão do módulo default.
Obrigado!
Na verdade nesta linha eu defini que o módulo de nome default é o módulo padrão, não tendo relação com o prefixo do módulo.
A linha que fala sobre prefixo (resources.frontController.prefixDefaultModule = “true”) é apenas para o módulo default, já que, por padrão, o ZF não adiciona o prefixo AO MÓDULO DEFAULT. A todos os outros módulos ele adiciona o prefixo por padrão e não precisamos modificar nada.
Compreendeu? Se tiver mais dúvida, só perguntar.
Perfeito!
Obrigado!
Olá! Ótima dica! Mas acho que seria interessante explicar o porquê disso funcionar.
A camada de visualização do Zend Framework possui alguns caminhos de pesquisa de arquivos. Quando estamos trabalhando em módulos, o ZF procura primeiramente dentro do diretório raiz da visualização dentro do módulo e depois em outros pontos do aplicativo. Por isso essa configuração funcionou.
Eu particularmente prefiro utilizar outra estrutura, onde existe um subdiretório dentro de cada módulo que especifica o layout adaptado para aquela ponto. Porém um amigo meu utiliza todos os layouts dentro do próprio diretório de aplicativo, modificando alguns caminhos lá dentro.
Muito boa a iniciativa!
Abraços,
parabéns pelo artigo!! tinha visto outros sobre o emsmo assunto, mas o seu fio o mais claro e coerente!!
PARABENS E OBRIGADO PELA AJUDA!!!
cara, muito bacana!! agora consegui entender!!!
se eu ja estava com zf layout habilitado eu tenho que desabilitar pra funcionar??? pq nao esta funcionando!!!
abraços
esquece cara, consegui!! era um problema entre a “cadeira ” e o “teclado”, sabe?? hahaha.obrigado.foi de grande ajuda
Muito bom seus tutoriais você vai disponibilizar as fontes deles….
Os códigos estão todos nos posts mesmo. Você acha necessário ter o código para fazer o download? Nunca pensei nisto, nem via a necessidade.
Olá Matias!
Muito bom seu blog!
Estou com um problema ao tentar chamar uma classe dentro do layout.phtml.
Preciso utilizar algo assim:
Util::RetornarAlgumaCoisa();
Essa Util por sua vez se encontra em library/Util.php
No netbeans até aparece quando começo a digitar, porém quando vou rodar o código o erro é claro:
Fatal error: Class ‘Util not found in C:\xampp\htdocs\…\application\modules\default\views\scripts\layout.phtml on line 50