Vistas
Las vistas son ficheros PHP que se envían al cliente web. Antes de enviarlos, se hace una expansión de variables a partir de un array. Es así como se le pasan los datos a la vista.
Vistas directas
Los ficheros vista se ubican en /views y se pueden nombrar como se quiera.
Por ejemplo si tenemos una vista llamada listado.php, para mostrarla usaremos
la siguiente función estática de la clase \zfx\View:
\zfx\View::direct("listado");
No se debe incluir la extensión .php.
Si tenemos una variable llamada $lista que queremos usar en la vista, se pasa
formando parte de un array. La clave del array será el nombre de la variable
resultante en la vista.
$datosVista = array('lista' => $lista);
\zfx\View::direct("listado", $datosVista);
En el ámbito de ejecución PHP del fichero vista tendremos la variable $lista
con los mismos datos que tenía en el controlador.
Se puede establecer una jerarquía de directorios en el directorio
/views para tener las vistas bien organizadas. Esto es útil si tenemos muchas
vistas, diferentes secciones o bien diferentes temas. Ejemplo:
views
|
+----- zona-publica
| |
| +------- index.php
| |
| +------- listado.php
|
+----- zona-privada
|
+----- index.php
|
+----- listado.php
Para mostrar las vistas así organizadas llamamos:
\zfx\View::direct("zona-privada/listado");
Vistas anidadas
Es posible anidar vistas con el fin de crear plantillas que a su vez contienen vistas o bien otras plantillas (y anidarlas nuevamente). Las plantillas (o vistas) anidadas son muy importantes porque permiten la fácil estructuración de las vistas de nuestra aplicación y mejoran la reutilización de código.
Supongamos el caso de que tenemos una plantilla de página genérica que carga todo el javascript y estilo que precisamos y solo cambia el contenido dentro del elemento BODY. La llamaremos paginabase.php y el contenido será similar a este:
<html>
<head><title>...</title><style>...</style><script>...</script>
<body>
<?php $this->section('cuerpo'); ?>
</body>
</html>
Sea contenido1.php una vista en nuestra aplicación que queremos cargar justo en el lugar donde hemos ubicado <?php $this->section('bloque'); ?>.
Supongamos que dicha vista contiene por ejemplo:
<p>Esto es un ejemplo de párrafo</p>
Necesitaremos hacer (en el controlador):
$v = new \\zfx\\View('paginabase.php');
$v->addSection('cuerpo', 'contenido1.php');
$v->show();
El resultado será:
<html>
<head><title>...</title><style>...</style><script>...</script>
<body>
<p>Esto es un ejemplo de párrafo</p>
</body>
</html>
Nótese cómo hemos instanciado un objeto de la clase \zfx\View en lugar de invocar una función estática como se hace con las vistas directas. Para construir y mostrar la vista se usa la función show().
Expansión de datos en vistas anidadas
Tanto en el momento de añadir una sección con addSection() como al mostrar todo con show() se puede especificar listas de variables a expandir:
$datosSeccion = array(...);
$datosVista = array(...);
$v = new View('paginabase.php');
$v->addSection('cuerpo', 'contenido1.php', $datosSeccion);
$v->show($datosVista);
Anidamiento múltiple
Este mecanismo admite anidamiento de secciones. Supongamos que la vista contenido2.php tiene el siguiente código:
<div>Esto es un div... <?php $this->section('bloque-interno'); ?></div>
Entonces, al ejecutar:
$v = new View('paginabase.php');
$v->addSection('cuerpo', 'contenido2.php');
$v->addSection('bloque-interno', 'contenido1.php');
$v->show();
El resultado será:
<html>
<head><title>...</title><style>...</style><script>...</script>
<body>
<div>Esto es un div... <p>Esto es un ejemplo de párrafo</p></div>
</body>
</html>
Encolamiento de secciones
Una característica muy importante del mecanismo de vistas es el encolamiento de secciones. Consiste en añadir a una misma sección múltiples vistas, que serán mostradas secuencialmente.
Supongamos el ejemplo paginabase.php anterior y las siguientes vistas bloque1.php, bloque2.php, bloque3.php:
bloque1.php:
<div>Esto es el bloque 1.</div>
bloque2.php:
<div>Esto es el bloque 2.</div>
bloque3.php:
<div>Esto es el bloque 3.</div>
Añadamos todos los bloques a la misma sección:
$v = new View('paginabase.php');
$v->addSection('cuerpo', 'bloque1.php');
$v->addSection('cuerpo', 'bloque2.php');
$v->addSection('cuerpo', 'bloque3.php');
$v->show();
El resultado será:
<html>
<head><title>...</title><style>...</style><script>...</script>
<body>
<div>Esto es el bloque 1.</div>
<div>Esto es el bloque 2.</div>
<div>Esto es el bloque 3.</div>
</body>
</html>
El encolamiento de secciones es muy útil, por ejemplo, para añadir múltiples ficheros JS y CSS a una plantilla.