23 de setembro de 2009
Se você já aprendeu a trabalhar com módulos, a próxima dúvida deve ser como renderizar layouts diferentes para cada um.
Usarei de exemplo a estrutura default e admin.
No seu Bootstrap.php adicione:
//application/Bootstrap.php
protected function _initView()
{
$view = new Zend_View;
$view->setEncoding('UTF-8');
Zend_Layout::startMvc(
array(
'layoutPath' => APPLICATION_PATH . '/default/views/layouts/scripts',
'layout' => 'default', // default deve ser o nome do arquivo. Ex: default.phtml
'pluginClass' => 'App_Plugins_SetLayout' // é aqui onde acontece a mágica
)
);
}
agora em App_Plugins_SetLayout:
<?php
//library/App/Plugins/SetLayout.php
class App_Plugins_SetLayout extends Zend_Layout_Controller_Plugin_Layout
{
// o preDispatch é chamado antes de uma ação ser despachada pelo dispatcher
// com isso, usamos o nosso objeto request e extraimos o nome do módulo
public function preDispatch (Zend_Controller_Request_Abstract $request)
{
switch ($request->getModuleName()) {
case 'admin':
$this->_setupLayout('admin');
}
}
// Dispensa comentários
protected function _setupLayout ($moduleName)
{
$this->getLayout()->setLayoutPath(APPLICATION_PATH . '/' . $moduleName . '/views/layouts/scripts');
$this->getLayout()->setLayout($moduleName);
}
}
Pronto, mas se você testar vai dar erro dizendo que não foi encontrado o seu arquivo de layout, até porque você só setou a estrutura.
Layout default:
<? //application/default/views/layouts/scripts/default.phtml ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="http://127.0.0.1/main.css" /> <title>Layout do Módulo Default</title> </head> <body> <div id="wrapper"> <div id="header"> <h1>Default</h1> </div> <div id="content"> <?// o conteúdo da sua view default será renderizado dentro do $this->layout()->content ?> <?=$this->layout()->content?> </div> </div> </body> </html>
Index default:
<?php
//application/default/controllers/IndexController.php
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$this->view->default = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.';
}
}
View default:
<? //application/default/views/scripts/index/index.phtml ?> <h2> <?=$this->default?> </h2>
Layout admin:
<? //application/admin/views/layouts/scripts/admin.phtml ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="http://127.0.0.1/main.css" /> <title>Layout do Módulo Admin</title> </head> <body> <div id="wrapper"> <div id="header"> <h1>Admin</h1> </div> <div id="content"> <?// o conteúdo da sua view admin será renderizado dentro do $this->layout()->content ?> <?=$this->layout()->content?> </div> </div> </body> </html>
Index admin:
<?php
//application/admin/controllers/IndexController.php
class Admin_IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$this->view->admin = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.';
}
}
View admin:
<? //application/admin/views/scripts/index/index.phtml ?> <h2> <?=$this->admin?> </h2>
Resultado:
Acabei com o trabalho chato de ficar reescrevendo código desnecessário, centralizo em um só arquivo partes do meu site que geralmente não tem alterações como header, sidebar e footer, enfim, você só tem a ganhar.
Tags: PHP, Zend Framework
Olá,
baixei seus arquivos de exemplo e eles funcionam perfeitamente… configurei meu projeto mas parece que ele continua vendo apenas o layout default, sabe o que pode ser?
abraço
então percebi um coisa, quando eu dou um echo dentro do SetLayout, no preDispatch
echo $request->getModuleName();
ele exibe default no nome dos modulos exemplo
usuariodefault
admindefault
defaultdefault
e se no switch mesmo eu colocando o default para completar o nome ele renderiza sempre o layout padrão…
resovi da seguinte forma…
public function preDispatch (Zend_Controller_Request_Abstract $request)
{
$this->_setupLayout($request->getModuleName());
}
vai saber neh..
Tive de mudar várias coisas para adaptar o que já estava desenvolvendo baseado em outras aplicações que ví quando comecei com ZF há algum tempo, mas era exatamente o que eu procurava, valeu.
Gente, é complicado aprender zend assim como é complicado aprender java no início, mas depois de um tempo e de sua assimilação, você vê que não dá mais pra trabalhar sem ele.
Tudo se torna mais fácil, customizável e melhor para criar novos módulos na aplicação.
Simplesmente maravilhoso, sem levar em conta que é feito pela Zend que é a mantenedora do PHP.
Imagine tirando uma certificação Zend, o leque que lhe abrirá profissionalmente e o aprendizado que terá …