TigerZF
🌐Español

40.2. Inicio rápido de Zend_Layout

Hay dos casos de uso principales para Zend_Layout: con el MVC de Zend Framework, y sin él.

40.2.1. Scripts de diseño

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>

40.2.2. Uso de Zend_Layout con el MVC de Zend Framework

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.

40.2.3. Uso de Zend_Layout como componente independiente

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();

40.2.4. Ejemplo de diseño

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.