msgbartop
Lógica na Cabeça
msgbarbottom

Zend Framework renderizando layouts diferentes

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:

zend-framework-renderizando-layouts-diferentes01

zend-framework-renderizando-layouts-diferentes02

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.

Download do exemplo.

Share and Enjoy:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Twitter
  • Rec6
  • RSS

Tags: ,

4 Comentários

  1. |

    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

    ResponderResponder
  2. |

    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…

    ResponderResponder
  3. |

    resovi da seguinte forma…

    public function preDispatch (Zend_Controller_Request_Abstract $request)
    {
    $this->_setupLayout($request->getModuleName());
    }

    vai saber neh..

    ResponderResponder
  4. |

    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á …

    ResponderResponder

Deixe um comentário