Otra forma de solucionarlo es simplemente extender la clase Zend_Controller_Action
Código PHP:
abstract class Mi_Controller_Action extends Zend_Controller_Action
{
/**
* @var instance of view object
*/
protected $_view = null;
/**
* @var string Globale template file to render
*/
protected $_template = 'main.php';
/**
* @var array template vars to be passed to view
*/
protected $_vars = array();
/**
* Bloque Menu ppal
*/
private function getNavigation()
{
/*etc...*/
}
/**
* Bloque comentarios
*/
private function getComments()
{
/*etc...*/
}
/**
* Bloque otro
*/
private function getOtro()
{
/*etc...*/
}
/*......*/
public function __destruct()
{
$this->_view->assign('navigation', $this->getNavigation());
$this->_view->assign('tagcloud', $this->getOtro());
$this->_view->assign('lastcomments', $this->getComments());
print $this->_view->render($this->_template);
}
/*....*/
Luego en cada action:
Código PHP:
$this->_view->assign('subtemplate', 'article/form.php');
Ej:
Código PHP:
class ArticleController extends Mi_Controller_Action
{
private function buildFormAction($params)
{
/*blablabla*/
$this->_view->assign('form_action', 'article/validate/');
//Esto muy importante ya que lo rendea en main.php
$this->_view->assign('subtemplate', 'article/form.php');
}
}
View Main:
Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title><?php echo $this->escape($this->title); ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<base href="http://<?php echo $this->escape($_SERVER['HTTP_HOST']) . $this->escape($this->baseurl); ?>/">
<link href="files/css/styles.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="page">
<div id="header">
<h1><?php echo $this->escape($this->title); ?></h1>
</div>
<div id="main">
<div id="navi">
.....
<div id="content">
<?php $this->render($this->subtemplate); ?>
</div>
</div>
<div id="footer">
Copyright © 2007 - Yo
</div>
</div>
</body>
</html>
Otra forma es crear una clase Page que genere objeto para Header Y/O Footer (Podría ser una clase factory) y se instancia dentro del método $this->init( ) de cada controlador o del controlador padre el cual extenderan los controladores restantes, Luego en cada action la puedes usar EJ: $header->render() o $footer->render().
Espero que sirva.
Saludos.