22
2010
Ajax mit dem ZF und jQuery (Nachtrag zum Screencast)
Da ich bzgl. meines Screencasts gefragt wurde, ob es denn möglich wäre festzustellen ob die Anfrage wirklich per Ajax kommt, um zu verhindern, dass die Action direkt aufgerufen werden kann, folgt hier ein kleiner Nachtrag wie es speziell mit dem ZF und jQuery möglich ist.
Wir nehmen an, dass der AsyncController nur für das Beantworten von Ajaxanfragen verantwortlich sein soll. D.h. dass jeder Request der auf eine Action dieses Controllers gemacht wird, auf seine Art geprüft werden muss. Das machen wir ganz einfach mit Hilfe der Funktion isXmlHttpRequest() des Requestobjekts. Um nicht in jede Action diese Abfrage einbauen zu müssen, schreibt man diese einfach ins init() oder in die preDispatch() Funktion des Controllers.
Hier der angepasste AsyncController.
<?php
class AsyncController extends Zend_Controller_Action
{
public function init ()
{
$this->_helper->viewRenderer->setNoRender();
}
public function preDispatch ()
{
if (!$this->_request->isXmlHttpRequest())
{
die('Diese Aktion kann nicht direkt aufgerufen werden.');
}
}
public function loadCountriesAction ()
{
$countries = array(
1 => array (1 => 'China', 2 => 'Thailand'),
2 => array (3 => 'Tunesien', 4 => 'Marokko'),
3 => array (5 => 'USA', 6 => 'Kanada'),
4 => array (7 => 'Argentinien', 8 => 'Bolivien'),
5 => array (9 => 'Grönland'),
6 => array (10 => 'Deutschland', 11 => 'Belgien'),
7 => array (12 => 'Neuseeland')
);
if (array_key_exists($this->_getParam('continentId'), $countries))
{
echo Zend_Json::encode($countries[$this->_getParam('continentId')]);
} else
{
echo Zend_Json::encode(array());
}
}
}
Es sei noch gesagt, dass nicht jedes JS Framework diesen Header schickt. Ich weiß, dass prototype, mootools und natürlich jQuery diesen Header mitschicken.
Ähnliche Artikel
3 Kommentare Kommentar schreiben
Kommentar schreiben
Letzte Kommentare
- PHP 5.4 – die Neuerungen im Überblick at PHP, SEO, Software, Programmierung bei Kurzschreibweise für Arrays ab PHP 5.4
- Jevo bei Ajax mit dem ZF und jQuery – HOW TO
- Jevo bei Ajax mit dem ZF und jQuery – HOW TO
- Jan bei Ajax mit dem ZF und jQuery – HOW TO
- Wotan bei Ubuntu Panel zurücksetzen / wiederherstellen
von








Eine absolute Sicherheit wird es hier wohl nicht geben, denn immer wenn Javascript im Spiel ist, sollte der Client unter Manipulationsverdacht stehen. Ergo gut überlegen, was man so ajaxt.
)
Kleiner Performance-Tipp: ersetz lieber array_key_exists() durch isset() – das geht schneller
Sofern jemand bei seinem Projekt mit Layouts arbeitet,
(“zf enable layout”)
dann muss neben dem viewRenderer auch das layout deaktiviert werden, sonst gibt’s entsprechende Fehlermeldungen beim Request. Konkret für den AsyncController wird folgende Zeile hinzugefügt, um das Layout zu deaktivieren:
class AsyncController extends Zend_Controller_Action
{
public function init()
{
$this->_helper->viewRenderer->setNoRender();
$this->_helper->layout()->disableLayout();
}
…