AJAX, jQuery, JSON et Zend Framework
Bon c'est une ébauche, et ça mérite d'être approfondi, mais voici comment je fais de l'ajax avec toutes ces choses qui sont dans le titre :)
D'abord il faut que jQuery soit compatible JSON. En dépit du fait que la doc stipule qu'on peut directement utiliser JSON, j'ai pas réussit a le faire fonctionner ... Et j'ai regardé dans le code, pour moi, c'est pas possible que ça fonctionne comme ça ... un simple eval ne fera jamais de parse JSON ...
Bref si on va voir sur le site consacré à JSON, on peut trouver une libraire JSON pour javascript qui a l'inconvénient de plomber le navigateur quand elle est utilisé avec jQuery ...
En cherchant bien on tombe sur des mecs qui on fait un plugin jQuery qui parse le json ... (je copie le code tout en bas on sait jamais ...) donc utilisé ensemble ça donne a peut prêt ça :
var json_str = $.toJSON(value) var value = $.parseJSON(json_str, [safe])
Ce qui est plutot sympa ...
Ensuite j'ai développé un objet ZF qui va permettre de récupérer le contenu d'un controlleur/action en ajax... Rien de bien extraordinaire juste un wrappeur qui reconstruit une URL :
var ZF = { call: function(controller, action, params) { controller = controller || 'Index'; action = action || 'index'; params = params || {}; var url = window.location.protocol + '//' + window.location.host + window.location.pathname; url += controller + "/"; url += action; console.log(url); return $.ajax({'url': url, 'async': false, 'data': params}).responseText; }, getJSON: function(controller, action, params) { var content = ZF.call(controller, action, params); return $.parseJSON(content); } }
Voila on s'en sert comme ça :
//pour du plain/text var content = ZF.call(); // => call sur Index/index var content = ZF.call('Moncontrolleur', 'monAction', {p1:'param1', p2:'param2'}); //pour du json var jsonContent = ZF.getJSON('Moncontrolleur', 'monAction', {p1:'param1', p2:'param2'});
Donc voila c'est pas plus compliqué que ça ... Après ça il suffit de définir un controlleur dédié à l'AJAX par exemple, ou même des actions ajax spécifiques dans certain controlleurs ... mais disons qu'on peut utiliser le framework assez simplement du coup !
A savoir qu'une action dans le framework peut se définir comme ceci du coup :
public function monAction() { echo Zend_Json::encode($this->getObject()); $this->_helper->viewRenderer->setNoRender(); }
Voila ça désactive l'autorender ... chose qu'on peut faire assez facilement dans le init de cette manière :
protected function _init() { if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { $this->_ajax = true; $this->_helper->viewRenderer->setNoRender(); } }
Voila après ça, il faut se servir de tout ça pour faire quelque chose de correct et la ... c'est long et surtout ... c'est a vous de faire !!! :D
PS: Code du json.jquery.js
(function ($) { var m = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }, s = { 'array': function (x) { var a = ['['], b, f, i, l = x.length, v; for (i = 0; i < l; i += 1) { v = x[i]; f = s[typeof v]; if (f) { v = f(v); if (typeof v == 'string') { if (b) { a[a.length] = ','; } a[a.length] = v; b = true; } } } a[a.length] = ']'; return a.join(''); }, 'boolean': function (x) { return String(x); }, 'null': function (x) { return "null"; }, 'number': function (x) { return isFinite(x) ? String(x) : 'null'; }, 'object': function (x) { if (x) { if (x instanceof Array) { return s.array(x); } var a = ['{'], b, f, i, v; for (i in x) { v = x[i]; f = s[typeof v]; if (f) { v = f(v); if (typeof v == 'string') { if (b) { a[a.length] = ','; } a.push(s.string(i), ':', v); b = true; } } } a[a.length] = '}'; return a.join(''); } return 'null'; }, 'string': function (x) { if (/["\\\x00-\x1f]/.test(x)) { x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) { var c = m[b]; if (c) { return c; } c = b.charCodeAt(); return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); }); } return '"' + x + '"'; } }; $.toJSON = function(v) { var f = isNaN(v) ? s[typeof v] : s['number']; if (f) return f(v); }; $.parseJSON = function(v, safe) { if (safe === undefined) safe = $.parseJSON.safe; if (safe && !/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(v)) return undefined; return eval('('+v+')'); }; $.parseJSON.safe = false; })(jQuery);

Comments
Juste comme ça j'ai pas bien suivi... pourquoi jQuery ?
Parce que jQuery c'est bien ...
va voir sur leur site, essaye de t'en servir, c'est rapide, intuitif et complet ... J'ai préféré utiliser jQuery que prototype, scriptaculous, dojo et autres ...
Y'a plein de plugins, on peut étendre comme on veut, enfin un outil bien sympa!
Ya mootools qui est sympa aussi, mais bon j'ai pas assez de temps pour tous les tester non plus :)
Je vais tater on verra bien. prototype me semble plus simple mais bon
prototype plus simple que jQuery ???
Non serieusement, plus complet, ok, mais "simple" ?
Au niveau de la logique Prototype utilise un modèle traditionnel, avec une api traditionnelle, une doc traditionnelle ... L'outil est sympa mais beaucoup plus simple a prendre en main que jQuery. J'ai pas eu de problèmes particuliers parce que j'ai de suite accroché avec la manière de faire, mais le modèle chainé de jQuery est moins courant donc plus difficile a apréhender selon moi ...
Quant au plus complet, Prototype ne fait rien du tout ... a part son modèl de classes, ses fonctions assez pratiques de droite et de gauche ... y'a rien ... jQuery c'est un moteur qu'on étend a l'infini selon les besoins ... c'est quand même plus full-featured que Prototype ...