Cake3 Ajax parametre dans URL

Par alexyon, il y a 10 ans


Bonsoir,
la semaine dernière, j'avais reussi à faire mon appel AJAX.
Tout se passe bien en local, malheureusement dès que je mets le site en ligne mon appel AJAX ne fonctionne plus.
car cake me rajoute dans l'url les data et donc me retourne une erreur 500 :

GET http://mondomaine.fr/homes/test?date=2015-10-19&id=1%2C31%2C38%2C45 500 (Internal Server Error) Error: [Cake\Network\Exception\NotFoundException] Not Found Request URL: /homes/test/?date=2015-10-19&id=72%2C74

voici mon appel :

$.ajax({ url: "/homes/test", data : {"date":selection, "id":test}, type : 'GET', dataType : 'json', success : function(response, statut) { } });

5 réponses

Xeta, il y a 10 ans

Hello,
Je voie pas trop le problème là. Tu fait une requête GET donc normal qu'il te rajoute les data dans l'URL.

alexyon, il y a 10 ans

merci Xeta pour ce retour,
et pourtant en faisant un console.log, il me retourne une erreur 500 à cause de DEBUG à false.

GET http://mondmaine.fr/homes/test/?date=2015-09-01&id=1 500 (Internal Server Error)

debug = true ==> OK
debug = false ==> erreur 500

si j'ajoute $this->autorender = false; je n'ai plus l'erreur mais il ne m'envoie pas les résultats ...

alexyon, il y a 10 ans

J'ai trouvé,
voici le code , ca peut toujours aidé ...
j'ai ajouté :

$this->request->allowMethod(['ajax']); $this->autoRender = false; echo json_encode($resultat);

merci Xeta.

Xeta, il y a 10 ans

Oula, on ne met jamais d'echo comme ça dans un Controller avec Cake3.

Pour renvoyer du JSON proprement avec Cake3, il faut utiliser une variabale spéciale _serialize http://book.cakephp.org/3.0/en/views/json-and-xml-views.html#using-data-views-with-the-serialize-key

C'est tout simple et en plus tu n'a pas besoin de créer une vue:

class HomesController extends AppController { //N'OUBLIE PAS CETTE FONCTION, elle est obligatoire. Elle permet d'importer le Component "RequestHandler", //qui est indispensable pour faire fonctionner la variable spécial "_serialize". public function initialize() { parent::initialize(); $this->loadComponent('RequestHandler'); } public function test() { //Si la requête n'est pas en AJAX, alors on affiche une page 404. if (!$this->request->is('ajax')) { throw new \Cake\Network\Exception\NotFoundException(); } //Ici tu fait se que tu as à faire $json = []; $json['date'] = '123456'; $json['error'] = false; $this->set(compact('json')); $this->set('_serialize', 'json'); } }

Et dans le JavaScript :

$.ajax({ url: "/homes/test", data : {"date":selection, "id":test}, type : 'GET', dataType : 'json', success : function(response, statut) { if (response.error === false) { console.log(response.date) // Va afficher "123456" } } });
alexyon, il y a 10 ans

Xeta,
j'ai recopié à l'identique , mais j'ai toujours cette erreur 500 avec un debug à false...
il me retourne cette erreur

Error: [Cake\View\Exception\MissingTemplateException] Template file "Homes/test.ctp" is missing.

sinon avec debug à true, il me retourne bien 123456.
j'ai remrqué que tu ne mettais pas l'autorender à false ...

C'est bon j'ai trouvé, il fallait upgrader cake (j'étais sur cake 3.0.10).