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).
El resultado del proceso de imprimir una página es el siguiente:
$content
. De esta manera la maqueta de plantilla de
vista puede imprimir el contenido especifico para una página determinada.La tabla 6.5 da un resumen de los métodos que provee la clase ViewModel
para
la composición de páginas:
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.