ViewHelpers en Zend Framework 2

Los ViewHelpers son uno de los componentes que más me gusta usar de Zend Framework. Se trata de pequeñas clases que, como su nombre en inglés lo indican, sirven como asistentes en las vistas. Generalmente estarán vinculadas a funciones de salida por pantalla, pero también pueden tener un poco de lógica y articular alguna función más elaborada y vinculada con aspectos más importantes del sistema como por ejemplo la autorización con Acl.

Usando el ViewHelper

Vamos a ver un ejemplo simple del uso de un ViewHelper. Pondré como ejemplo una aplicación que estoy desarrollando actualmente.

Tengo planteado un state pattern para una entidad llamada Incident. Por lo tanto, cada Incident tiene un estado diferente. Los estados posibles son: New, Contacted, InProcess, TechnicalReportPending y Closed.

En una parte del sistema mi intención es mostrar un listado con todos los Incidents que tomo de la base de datos. La idea es que según el estado que tiene cada uno, se muestre un ícono y una leyenda. Por supuesto, para un mismo estado, se debe ver una misma leyenda y un mismo ícono.

Con una imagen se va a entender mejor lo que estoy tratando de explicar.

view helper zf2

¿Cómo se logra esto en HTML usando un ViewHelper de Zend Framework 2?

Veamos el archivo .phtml asociado a esta vista. En este caso, el código corresponde a la última columna de la tabla. Tengan en cuenta que esta porción de código está encerrada en un bucle que aquí omití. Es decir que el siguiente código se ejecuta cuatro veces para este ejemplo particular.

La llamada al ViewHelper es el $this->displayState(). El método displayState recibe el id del estado actual del Incident y devuelve el ícono y la leyenda correspondiente a ese estado. O sea, devuelve un código HTML para poder mostrarse correctamente en la vista.

En este caso particular, la celda se compone del siguiente HTML, utilizando los fantásticos íconos de Font Awesome. Este sería el ejemplo del estado Contacted.

Como ven, la utilización del ViewHelper es sencilla y el resultado, interesante. Piensen que podríamos meter parte de la lógica de la vista en una clase y delegarle la tarea de hacer algo en particular.

La clase ViewHelper

El uso está claro, ahora la pregunta es: ¿Cómo es esa clase que nos permite hacer la tarea que necesitamos?

Nuestro propio ViewHelper tiene que heredar de AbstractHelper y sobreescribir el método __invoke().

La clase es extremadamente sencilla. Los ids de los estados están como atributos estáticos privados, pero podrían estar también como constantes de clase o podrían traerse de otro objeto o incluso de la base de datos. Se recibe por parámetro el id del estado y luego lo que se tiene no es más que un switch que según el estado, arma la estructura HTML necesaria y la devuelve. Si el estado que llega por parámetro es inválido se lanza una excepción.

Nada complicado.

Algo que me gusta mucho de este tipo de clases es que se pueden desarrollar de manera muy fácil y divertida mediante TDD.

Esta sería la clase de prueba. Noten como se puede instanciar normalmente la clase y llamar directamente al método __invoke, más allá del uso que le dimos anteriormente en la vista.

Registrar el ViewHelper

Lo que nos queda pendiente es registrar el ViewHelper para poder utilizarlo en la vista como vimos al principio. Para ello, hay que acceder al module.config.php y buscar la clave view_helpers en el array de retorno. Allí hay que agregar nuestro ViewHelper dentro de invokables. Noten que el nombre de la clave que usamos aquí es luego el nombre del método con el que deberemos llamarlo en la vista. En este caso displayState.

Y eso es todo. Espero escriban muchos ViewHelpers, con sus respectivos tests y sus vidas como programadores sean más eficientes.

¡Hasta la próxima!

Soy programador web y me desempeño como Líder Técnico y de Proyectos en Polar Bear Development. Trabajo con tecnologías como PHP, Javascript, MySQL y HTML5 para el desarrollo de sitios y sistemas web. Me especializo en Zend Framework 2 y otros frameworks MVC, como también en WordPress y otros CMS. Lidero equipos de desarrolladores trabajando con Scrum. Vivo en Buenos Aires, Argentina.
 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*