A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

6.10. Los Modelos de Vista y la Composición de Páginas

Antes cuando escribimos los métodos de acción para las clases controladoras usamos la clase ViewModel como un contenedor de variables para pasar las variables desde el controlador a la plantilla de vista y, además, usamos el ViewModel para sobrescribir el nombre de la plantilla de vista por defecto.

Pero, en realidad la clase ViewModel es más que solo un contenedor de variables y un medio para cambiar el nombre de la plantilla. De hecho, está muy relacionada a la maqueta y a la composición de la página.

La tercera mayor capacidad de la clase de vista de modelo es que permite combinar varios modelos de vista en una estructura de árbol. Cada modelo de vista tiene en el árbol un nombre de plantilla de vista asociado y datos que se pueden pasar a la plantilla de vista para controlar el proceso de impresión.

Esta característica es usada internamente por Zend Framework 3 cuando "combina" la maqueta de plantilla de vista y las plantillas de vista asociadas en el el método de acción del controlador. ZF3 crea internamente el modelo de vista para la maqueta de plantilla y le asigna el nombre de la plantilla de vista layout/layout. Cuando el método de acción del controlador regresa el objeto ViewModel este objeto es adjuntado como un hijo a la maqueta del modelo de vista (ver figura 6.12 para un ejemplo).

Figura 6.12. Modelos de vista anidados en una estructura tipo árbol Figura 6.12. Modelos de vista anidados en una estructura tipo árbol

El resultado del proceso de imprimir una página es el siguiente:

La tabla 6.5 da un resumen de los métodos que provee la clase ViewModel para la composición de páginas:

Tabla 6.5. Los métodos de la clase ViewModel para la composición de la página
Método Descripción
addChild() Agrega un hijo al modelo de vista.
getChildren() Trae la lista de los modelos de vista hijos.
hasChildren() Comprueba si el modelo de vista tiene un hijo o no.
clearChildren() Remueve todos los modelos de vista hijos.
count() Regresa el número de modelos de vista hijos.
getIterator() Regresa el iterador para los modelos de vista hijos.
setTerminal() Coloca la bandera terminal.
terminate() Comprueba si el modelo de vista es el terminal.
setCaptureTo() Coloca el nombre de la variable que captura la salida.
setAppend() Coloca la bandera añadir.
isAppend() Comprueba si está añadido este modelo de vista u otro.

Daremos una breve descripción de los métodos que se presentaron en la tabla de arriba.

Los métodos addChild(), getChild(), hasChildren() y clearChildren() se usan respectivamente para agregar un modelo de vista hijo a uno padre, recuperar el arreglo de los modelos de vista adjuntados, probar si el modelo de vista es una hoja (no tiene hijos) y separar todos los hijos.

El método setCaptureTo() permite establecer la variable en la plantilla de vista padre en la que se inyecta el código HTML producido por la plantilla de vista hija. Si dos models de vista hijos usan la misma variable el segundo sobrescribirá al primero. El método setAppend() se puede usar cuando necesitamos inyectar los resultados de dos o más plantillas de vista dentro de una solo variable comodín. La siguiente plantilla de vista impresa se añadirá al contenido existente de la variable.

Un modelo de vista se puede marcar como terminal con el método setTerminal(). El método setTerminal toma un solo parámetro como bandera. Si es true, el modelo de vista se considera como terminal (padre) y el mecanismo de impresión regresa la salida de la plantilla de vista a la aplicación, de lo contrario sus padres también se imprimen. El método terminate() comprueba si el modelo de vista es terminal o no

El método setTerminal() es muy útil en algunas situaciones porque con su ayuda podemos desactivar la impresión de la maqueta de plantilla de vista. Si regresamos desde el controlador el modelo de vista marcado como terminal, la maqueta no se aplicará. Esto se puede usar, por ejemplo, cuando queremos cargar parte de la página asíncronamente usando una petición AJAX 18 y necesitamos insertar su código HTML en el árbol DOM de una página existente.

18) AJAX (acrónimo para Asynchronous JavaScript and XML) es una capacidad provista por los navegadores modernos que se puede usar para enviar datos y recuperar datos de un servidor asíncronamente (en segundo plano) sin interferir con la impresión ni con el comportamiento de la página.


Top