Zend Framework mit Ajax

Donnerstag, März 13th, 2008


Ich hab vor kurzem den neuen Action_Helper im ZF ausprobiert, und muss mal sagen, dass es eine gute Lösung ist um saubere Ajax Applikationen zu schreiben.
Beim ersten Anlauf bekam ich einen Fehler ‘Context “ajax” does not exist’. Obwoll ich immer die initContext(‘html’) aufgerufen habe, kam es immer zu diesem Fehler. Dann hab nochmal die Ajax URL angeschaut und hab festgestellt, dass es falscher Pfad war.

/mudule/controller/action/format/ajax

Das format/ajax war komplett hier Falsch, richtig ist fromat/html zu schreiben, aber die Templates werden mit ajax Prefix bennant.

So jetzt mal zu der ganzen Geschichte. Ich schreib Sie in kleinen Schritten.

Zum Anfang müsst ihr kurz wissen, dass Helper AjaxContext die Zend_Controller_Action_Helper_ContextSwitch um eine kleine Funktion erweitert, welche im header den XmlHttpRequest sucht um sicher zu gehen das es sich um Ajax Aufruf handelt.

1.
Man startet den Front_Controller.

$frontController = Zend_Controller_Front::getInstance()

Erzeugt den AjaxContext Helper und legt ihn in den Broker rein:

$ajaxContext = new Zend_Controller_Action_Helper_AjaxContext();
Zend_Controller_Action_HelperBroker::addHelper($ajaxContext);

Nach diesen Schritten könnt ihr euren Dispatcher starten:

$frontController->dispatch();

2.
Jetzt kommen wir zu dem Controller und der Action:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class IndexController extends Zend_Controller_Action
{
   public $ajaxable = array(
   'index' => array('html'),  // nur ajax
   'go' => array('json','xml') // json  mit xml
   );
 
   public function preDispatch()
   {
      $this->_helper->ajaxContext()->initContext();
   }
 
   public function indexAction()
   {}
 
   public function goAction()
   {}
 
}

3.
Als Letztes legen wir die Templates fest. Je nach Format wird auch ensprechen die prefix angehängt index.ajax.phtml oder go.xml.phtml.

  views/
    scripts/
      index.xml.phtml
      go.xml.phtml
      go.json.phtml

Und am ende müsst ihr Ajax am besten in jQuery oder Prototype die URL aufrufen:

/controller/index/format/html
/controller/go/format/xml
/controller/go/format/json

So das war mal eine kurze einführung. Den Rest müsst ihr jetzt mal selbt ausprobieren oder einfach mal bei Google suchen ;)