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.

Ir al siguiente capítulo: Introducción a Zend_Session y Zend_Auth