Hola,
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:
app2/
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
default.phtml
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>
Los otros tres layouts ( header, body y footer ):
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; ?>
Y aquí como le asigno los valores desde My_Controller_Action:
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
}
}