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


alexyon
Auteur
Réponse acceptée

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
Réponse acceptée

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
Auteur
Réponse acceptée

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).

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
Auteur

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 ...