Bonjour à tous,

Je souhaite développer une fonction en AJAX, qui par le biais d'une action d'un controller me renvoi une donnée. Plus précisément je souhaite faire un requête count sur une table 'Posts', et en afficher le résultat sur une vue.

Pour cela, voici le code du controller :

<?php
class PostsController extends AppController
{
    public function counterUnread($id){
    // Traitement de la requete
    $this->set('counter', $counter);
}

Et la fonction AJAX :

function counter(id) {
    $.ajax({
        type: 'post',
        url: "posts/counterUnread",
        data: {
            id: id
        },
        dataType: 'html',
        success: function(counter) {
            alert(counter);
        }
    })
}

L'idée est d'afficher dans le 'success' (dans un premier temps) la donnée renvoyée par le controller. Malheuresement le code ne fonctionne pas.

Etant totalement novice en AJAX, je ne pense pas avoir la bonne méthodologie, mais je n'ai rien trouver de probant sur le web pouvant m'aider.

Par avance merci pour votre aide.

4 réponses


ker0x
Réponse acceptée

On va supposer que tu veux retourner le resultat en json

Dans ton PostsController :

public function counterUnread($id)
{
    // Autorise les requêtes ajax sur la méthode
    $this->request->allowMethod(['ajax']);

    // Compte le nombre de Posts
    $count = $this->Posts->find()->where([
        // Tes conditions
    ])->count();

    // On construit la réponse
    $response = [
        'count' => $count
    ];

    // La réponse sera en json
    $this->response->type('json');
    $this->response->body(json_encode($response));

    return $this->response;
}

Puis dans ton JS

$.post('posts/counterUnread', function(response) {
    console.log(response);
    // Ton traitement de la réponse
}, 'json');

Pour comprendre le tout :
http://book.cakephp.org/3.0/en/controllers/request-response.html#Cake\Network\Request::allowMethod
http://book.cakephp.org/3.0/en/orm/query-builder.html#returning-the-total-count-of-records
http://book.cakephp.org/3.0/en/controllers/request-response.html#response
http://jqapi.com/#p=jQuery.post

alexyon
Réponse acceptée

au chargement de la page :

$( document ).ready(function() {
    ton code
});
ker0x
Réponse acceptée

Mon code JS c'est simplement la syntax raccourci de ton $.ajax
En gros çà :

$.ajax({
        type: 'post',
        url: "posts/counterUnread",
        data: {
            id: id
        },
        dataType: 'json',
        success: function(response) {
            alert(response);
        }
   });

peut être écrit comme cela :

$.post('posts/counterUnread', {id:id}, function (response) {
    alert(response);
}, 'json');

Bonjour GyZmO, et merci.

Effectivement cela m'a bien aidé. En retournant mon résultat en JSON, je peux ensuite le traiter de mon success. Par contre je n'ai pas compris ton code JS, quel était son but ?

J'ai une deuxième intérogation maintenant, je souhaite lancer automatiquement ce script au chargement de la page, y a une une méthode particulière pour cela ?