I want to share a couple of features I use to handle AJAX requests in projects based on Zend Framework.
1. AJAX request handling
What: some parts of your application can be not loaded if currect request is AJAX.
Why: you don’t need views, templates, some routes — so you can add an AJAX check in your Initializer or bootstrap file and avoid loading not necessary things.
How: Zend Request object has a isXmlHttpRequest
methodX-Requested-With
‘ header, which is sent by jQuery, Prototype, Scriptaculous, YUI and MochiKit frameworks.
2. AJAX Controller
Most AJAX controller’s methods I saw had an exit()
inside to not to output Zend’s template — it is a work-around. The proper way to do so is to tell to Zend not to load anything. One step forward is to create an abstract Controller class and inherit all you AJAX classes from it:
/library/Koodix/Controller/Ajax/Action.php
:
<?php
require_once 'Zend/Controller/Action.php';
abstract class Koodix_Controller_Ajax_Action
extends Zend_Controller_Action
{
public function init() {
//disable the standard layout output
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender();
}
public function postDispatch() {
//envelope and output json field
if( !empty( $this->json ) ) {
echo json_encode( $this->json );
}
}
}
/application/modules/default/controllers/AjaxController.php
:
<?php
class AjaxController extends Koodix_Controller_Ajax_Action
{
// bla-bla-bla
Take a look at postDispatch
method — idea behind it is to convert to JSON and output anything that is set to json
field of your controller. If you want to send JSON data in special header (and not in body, like it’s done in my example), you can do it in this method.