Como podeis ver, en esta aplicación hay un Layout llamado "default.phtml" que contiene el render de tres vistas header, body y footer.phtml
Estos 3 archivos, dentro tienen variables del layout tipo: $this->layout()->loginForm; o $this->layout()->headerMenú
Una vez las variables de layout están dispuestas les asigno vistas, esta asignación de las variables la estoy haciendo desde My_Controller_Action (extendiendo Zend_controller_Action para conseguir un comportamiento igual en todos los controladores)
Pero no acabo de aclararme muy bién sobre como usar el render, ya que este coge las vistas del mismo directorio en que fue llamado el script...
He probado asignando variables al objeto layout y con el getResponse. Pero así tendré que ir cambiando para cada vista el setBasePath() en función de donde se encuentren ???
No puede hacerse de una forma un poco más... limpia ?? Que me recomiendan ???
Gracias !!!
Mejor les pongo los códigos:
Código:
default.phtmlapp2/ config/ config.ini layouts/ default.phtml header.phtml body.phtml footer.phtml models/ modules/ default/ controllers/ IndexController.php views/ filters/ helpers/ scripts/ index/ index.phtml users/ controllers/ AuthController.php views/ filters/ helpers/ scripts/ auth/ index.phtml Bootstrap.php
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>app2</title>
<base href="http://localhost/app2/" />
</head>
<body>
<div id="content">
<?php
echo $this->render('header.phtml');
echo $this->render('body.phtml');
echo $this->render('footer.phtml');
?>
</div>
</body>
</html>
Código PHP:
// header.phtml
<div id="header">
<h2>HEADER VIEW</h2>
<?php
if (!$this->layout()->user) {
echo $this->layout()->loginForm;
} else {
echo "Bienvenido";
}
?>
<?php echo $this->layout()->headerMenu; ?>
</div>
// body.phtml
<?php echo $this->layout()->content; ?>
// footer.phtml
<?php echo $this->layout()->footer; ?>
Código PHP:
<?php
abstract class My_Controller_Action extends Zend_Controller_Action
{
public function preDispatch()
{
$this->view->baseUrl = $this->_request->getBaseUrl();
}
public function init()
{
parent::init();
// Probé a asignar algunas variables al objeto layout
$view = Zend_Layout::getMvcInstance();
$view->user = Zend_Auth::getInstance()->hasIdentity();
$view->headerMenu = "headerMenu";
$view->footer = "footer";
// También probé mediante $response->append
$response = $this->getResponse();
$view = new Zend_View();
$view->setBasePath(APPLICATION_PATH . '/modules/users/views');
$response->append('loginForm', $view->render('auth/index.phtml'));
// Las dos formas funcionan correctamente
// Pero no me parece que sigan "buenas maneras" esas formas de hacer
}
}