Hay dos casos de uso principales para Zend_Layout: con el
MVC de Zend Framework, y sin él.
En ambos casos, sin embargo, necesitará crear un script de diseño. Los scripts de diseño
simplemente utilizan Zend_View (o cualquier implementación de vista
que esté usando). Las variables de diseño se registran con un placeholder de
Zend_Layout,
y se puede acceder a ellas a través del ayudante placeholder o obteniéndolas
como propiedades de objeto del objeto layout mediante el ayudante layout.
Como ejemplo:
<!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>My Site</title>
</head>
<body>
<?php
// fetch 'content' key using layout helper:
echo $this->layout()->content;
// fetch 'foo' key using placeholder helper:
echo $this->placeholder('Zend_Layout')->foo;
// fetch layout object and retrieve various keys from it:
$layout = $this->layout();
echo $layout->bar;
echo $layout->baz;
?>
</body>
</html>
Debido a que Zend_Layout utiliza Zend_View para
el renderizado, también puede usar cualquier ayudante de vista registrado, y también
tiene acceso a cualquier variable de vista asignada previamente. Son particularmente
útiles los diversos ayudantes
placeholder, ya que le permiten
recuperar contenido para áreas como la sección <head>,
la navegación, etc.:
<!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" />
<?php echo $this->headTitle() ?>
<?php echo $this->headScript() ?>
<?php echo $this->headStyle() ?>
</head>
<body>
<?php echo $this->render('header.phtml') ?>
<div id="nav"><?php echo $this->placeholder('nav') ?></div>
<div id="content"><?php echo $this->layout()->content ?></div>
<?php echo $this->render('footer.phtml') ?>
</body>
</html>
Zend_Controller ofrece un rico conjunto de funcionalidades para
su extensión a través de sus plugins del
controlador frontal y ayudantes de
controlador de acción. Zend_View también tiene ayudantes. Zend_Layout
aprovecha estos diversos puntos de extensión cuando se usa con los componentes
MVC.
Zend_Layout::startMvc() crea una instancia de
Zend_Layout con cualquier configuración opcional que
proporcione. Luego registra un plugin de controlador frontal que renderiza el
diseño con cualquier contenido de la aplicación una vez que el bucle de dispatch ha
terminado, y registra un ayudante de acción para permitir el acceso al objeto layout
desde sus controladores de acción. Además, en cualquier momento puede obtener
la instancia de diseño desde dentro de un script de vista usando el
ayudante de vista Layout.
Primero, veamos cómo inicializar Zend_Layout para usarlo con
el MVC:
// In your bootstrap: Zend_Layout::startMvc();
startMvc() puede recibir un array opcional de opciones o un
objeto Zend_Config para personalizar la instancia; estas
opciones se detallan en esta sección.
En un controlador de acción, puede entonces acceder a la instancia de layout como un ayudante de acción:
class FooController extends Zend_Controller_Action
{
public function barAction()
{
// disable layouts for this action:
$this->_helper->layout->disableLayout();
}
public function bazAction()
{
// use different layout script with this action:
$this->_helper->layout->setLayout('foobaz');
};
}
En sus scripts de vista, puede entonces acceder al objeto layout a través del
ayudante de vista Layout. Este ayudante de vista es ligeramente
diferente de otros en que no toma argumentos, y devuelve un
objeto en lugar de un valor de tipo cadena. Esto le permite llamar
inmediatamente a métodos sobre el objeto layout:
<?php $this->layout()->setLayout('foo'); // set alternate layout ?>
En cualquier momento, puede obtener la instancia de Zend_Layout
registrada con el MVC mediante el método estático
getMvcInstance():
// Returns null if startMvc() has not first been called $layout = Zend_Layout::getMvcInstance();
Finalmente, el plugin de controlador frontal de Zend_Layout tiene una
característica importante además de renderizar el diseño: recupera
todos los segmentos con nombre del objeto respuesta y los asigna como
variables de layout, asignando el segmento 'default' a la variable
'content'. Esto le permite acceder al contenido de su aplicación y
renderizarlo en sus scripts de vista.
Como ejemplo, supongamos que su código primero llega a
FooController::indexAction(), que renderiza algo de
contenido al segmento de respuesta por defecto, y luego reenvía a
NavController::menuAction(), que renderiza contenido al
segmento de respuesta 'nav'. Finalmente, reenvía a
CommentController::fetchAction() y obtiene algunos
comentarios, pero los renderiza también al segmento de respuesta por defecto
(lo que añade contenido a ese segmento). Su script de vista podría entonces
renderizar cada uno por separado:
<body>
<!-- renders /nav/menu -->
<div id="nav"><?php echo $this->layout()->nav ?></div>
<!-- renders /foo/index + /comment/fetch -->
<div id="content"><?php echo $this->layout()->content ?></div>
</body>
Esta característica es particularmente útil cuando se usa en conjunto con el ayudante de acción ActionStack y el plugin, que puede usar para configurar una pila de acciones a través de las cuales iterar, y así crear páginas basadas en widgets.
Como componente independiente, Zend_Layout no ofrece tantas
características ni tanta comodidad como cuando se usa con el MVC.
Sin embargo, todavía tiene dos beneficios principales:
Ámbito de las variables de layout.
Aislamiento del script de vista de layout respecto a otros scripts de vista.
Cuando se usa como componente independiente, simplemente instancie el objeto layout, use los diversos accesores para establecer el estado, establezca variables como propiedades del objeto, y renderice el layout:
$layout = new Zend_Layout();
// Set a layout script path:
$layout->setLayoutPath('/path/to/layouts');
// set some variables:
$layout->content = $content;
$layout->nav = $nav;
// choose a different layout script:
$layout->setLayout('foo');
// render final layout
echo $layout->render();
A veces una imagen vale más que mil palabras. Lo siguiente es un script de diseño de ejemplo que muestra cómo podría encajar todo.
El orden real de los elementos puede variar, dependiendo del CSS que haya configurado; por ejemplo, si está usando posicionamiento absoluto, puede ser capaz de mostrar la navegación más adelante en el documento, pero aun así aparecer en la parte superior; lo mismo podría decirse de la barra lateral o el encabezado. Sin embargo, la mecánica real de obtener el contenido sigue siendo la misma.