Guía Zend: Integración con AJAX
Hoy por hoy trabajar con AJAX es algo cotidiano, por eso como no podía ser de otra manera ZF nos facilita mucho las cosas y hace que del lado del servidor el trabajo sea el mínimo indispensable. Cuando trabajamos con AJAX queremos, por un lado, identificar las peticiones que fueron hechas por XMLHttpRequest, y por otro, retornar los datos en el formato que nos sea mas conveniente (HTML, JSON, XML, etc).
Para esto, ZF cuenta con dos action helpers, el primero es el ContextSwitch, cuyo objetivo es facilitarnos el retornar los datos en diferentes formatos. El otro es el AjaxContext, que es una implementación especial del ContextSwich, que como su nombre indica, nos ayuda a identificar los XmlHttpRequests y actuar en consecuencia.
Cuando se activa un cambio de contexto, el helper realiza las siguiente acciones:
- Deshabilita el layout.
- Setea un sufijo alternativo para las vistas, de esta manera, cada contexto ejecutará una vista diferente.
- Setea el header content-type según el formato solicitado.
Activar el ContextSwich
Supongamos que tenemos un action llamado list el cual queremos que también retorne contenido en XML, y otro llamado comments y queremos que pueda retornar en xml y json. La opción “fea” es crear un action diferente para cada tipo de dato, pero como en realidad todos los actions devuelven la misma información sólo que en diferente formato, lo que hacemos es cambiar solo la vista.
Entonces otra vez, la opción mala es seleccionar manualmente que vista renderizar, por lo cual tendríamos en todos nuestros actions unos horribles if’s o switch’s que rendericen la vista adecuada, y la opción correcta es tener un action helper que se encargue de identificar cuando hay que renderizar otra vista y haga el cambio. Esto es lo que hace el ContextSwitch, por lo que en vez de crear un nuevo action simplemente le agregamos los contextos adecuados a los ya existentes:
class IndexController extends Zend_Controller_Action { public function init() { $contextSwitch = $this->_helper->getHelper('contextSwitch'); $contextSwitch->addActionContext('list', 'xml') ->addActionContext('comments', array('xml', 'json')) ->initContext(); } }
El ejemplo es bastante claro y conciso por lo que solamente hay un par de cosas por explicar. Como vimos en el articulo sobre action helpers, $this->_helper es el HelperBroker, al que le pedimos que nos de el helper ContextSwitch, y luego a este le agregamos los distintos contextos a los que va a responder cada action.
El ContextSwitch lo inicializamos con el método initContext(). Se suele poner en el init para inicializarlo en forma general para todos los actions del controlador. Lo único que faltaría es activar el contexto que deseamos. Para esto tenemos que pasar por GET la variable “format” con el formato elegido, por ejemplo “xml”.
Ahora cuando ejecutemos /index/list, obtendremos la vista normal, es decir list.phtml, pero cuando entremos a /index/list?format=xml se ejecutará la vista list.xml.phml que creará el XML correspondiente.
Contextos por default
Por defecto ZF incluye los contextos XML y JSON. Los dos funcionan en forma similar, con la diferencia que en el contexto JSON la vista (comments.json.phtml) no es obligatoria, ya que automáticamente se encodearán todas las variables de la vista y se responderá el contenido generado.
Especificando contextos existentes
En el ejemplo anterior vimos que para relacionar un contexto a un action usamos el método addActionContext, sin embargo también hay otra forma de hacerlo que a mi parecer es un poco más clara, especificando los contextos en el atributo $contexts del controlador. Veamos un ejemplo similar al anterior:
class IndexController extends Zend_Controller_Action { public $contexts = array( 'list' => array('xml'), 'comments' => array('xml', 'json') ); public function init() { $this->_helper->getHelper('contextSwitch')->initContext(); } }
AjaxContext
Como dijimos este helper extiende al ContextSwitch, por lo que su funcionamiento es prácticamente igual, salvo algunas pequeñas diferencias. Por un lado, los contextos no se especifican en el atributo $contexts sino en $ajaxable.
Hay que tener en cuenta que este contexto solo se activará si el request es un XmlHttpRequest, por lo que aunque pasemos la variable format por GET, si el request no fue hecho por AJAX no funcionará. Por último, se agrega el formato HTML, cuyas vistas tendrán el sufijo “ajax.phtml”.Dicho esto veamos un ejemplo, veremos que su uso es prácticamente igual al del ContextSwitch:
class IndexController extends Zend_Controller_Action { public $ajaxable = array( 'list' => array('html'), 'comments' => array('html') ); public function init() { $this->_helper->getHelper('ajaxContext')->initContext(); } public function listAction() { } public function commentsAction() { } }
Continuando con la guía:
Esto es todo, como vemos es muy simple y el código queda muy limpio. Zend se encarga del trabajo sucio (deshabilitar el layout, setear una vista diferente), nosotros solamente tenemos que inicializar el helper y poco más.
[…] Souto para Maestros del Web.Agrega tu comentario | Enlace permanente al […]
Enhorabuena. No tenía ni idea de la existencia de estos helpers. Con la cantidad de veces que he utilizado la opción “mala”…
[…] Guía Zend: Integración con AJAX […]
por fin una guia de ajax que medio entiendo
Puedo ayudar en algo mas para que la entiendas por completo? 😛 cualquier duda puedes comentarla y lo vemos! 😀
[…] Integración con AJAX […]
[…] Guía Zend: Integración con AJAX […]
como puedo actualizar mi base de datos automaticamente.
tengo un formulario de inscripcion y quiero que se anade los datos automaticamente a mi base de datos.
Hola , muy buena la exlicación.
Queria saber si no hay algun ejemplo completo para poder ver el manejo de solicitudes bajo Ajax.
Para poder manejar mi aplicación entera bajo ajax.
Gracias .
Saludos
Hola
Tienes muy buenas ayudas.
Pero tengo un problema, ya que segui todo este tutorial para ajax y cuando hago la llamada ajax me carga tambien el layout.
Estoy ocupandolo con el ajaxable.
Saludos!
Y como se hace la llamada ajax desde la vista que hace la petición a listAction ??