21 set2011

Trabalhando com layouts diferentes por módulo no Zend Framework

por Matias Rezende

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 :D ). 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!!!

11 respostas para “Trabalhando com layouts diferentes por módulo no Zend Framework”

  • Leonardo Cesar Teixeira

    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. :D

    Um abraço!

  • Frederico

    Ó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!

    • Matias Rezende

      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.

  • 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,

  • felipe gama

    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!!!

  • felipe gama

    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

  • felipe gama

    esquece cara, consegui!! era um problema entre a “cadeira ” e o “teclado”, sabe?? hahaha.obrigado.foi de grande ajuda

  • Danillo

    Muito bom seus tutoriais você vai disponibilizar as fontes deles….

    • Matias Rezende

      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

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>