Bonjour,

J'ai suivis le tutoriel pour crée un Tchat en Ajax avec PHP.
J'ai voulu l'adapter à CakePHP.
J'ai donc crée ma table « tchats », le contrôleur, le modèle et la vue « index.php ».
Mais je bloque sur la partie Ajax pour insérer un message.

Dans le fichier « tchats.js », j'ai modifié la variable « url » comme ceci :

var url = "<?php echo $this->webroot . $this->params'tchats']; ?>/add";

Et dans ma fonction « add » de mon contrôleur « Tchats » :

function add() {
        print("ok");
            if($_POST"action"]=="addMessage"){
            $message = mysql_escape_string($message);
            $sql = "INSERT INTO messages(pseudo,message,date) VALUES ('$pseudo','$message',".time().")";
            mysql_query($sql) or die(mysql_error());
            $d"erreur"] ="ok";
        }
    }

Alors je ne sais pas si il faut procéder ainsi.

Si vous pouviez m'en dire sur la façon de procéder avec l'Ajax et CakePHP, en rapport avec le tutoriel sur le Tchat en Ajax avec PHP.

Merci à vous.

8 réponses


Bonjour, pas de code php dans un fichier js à part il sera jamais interpreté, définie la variable au sein de la page html dans un script placé avant l'appel du script qui gére ton tchat

Dans ta fonction "add", tu fais du simplement un save avec la méthode CakePHP et non du PHP "à l'ancienne".

DexX
Auteur

Oui mais, c'est chose faite et cela fonctionne mais maintenant j'aimerais ajouter le message en Ajax. Pour éviter de devoir rafraichir la page.

Après tu fais du Ajax comme "à l'ancienne".

$.post('tchat/add', function(data) {
  $('div').load(tchat/messsages);
});

Le tchat/add correspond à l'url de ta fonction. Par défaut ce doit être celle-ci sauf si tu as changé l'url via le routing.

Tu peux aussi te rendre sur le site du zéro, allez je suis gentil je donne l'url du chapitre correspondant.

DexX
Auteur

Merci de ton aide, voilà comment j'ai procédé :

Mon fichier chat.js :

$(document).ready(function() {
    $.post('chats/add', function(data) {
        alert("ok");
        $('#chatForm').load(chats/salons);
    });
});

Dans ma vue :

<div id="chatForm">
                    <?php echo $this->Form->create('Chat', array(
                        'action' => 'add',
                            'inputDefaults' => array(
                                'label' => false
                            )
                        )); 
                    ?>
                    <?php echo $this->Form->hidden('date', array('value' => date('Y-m-d H:i:s'))); ?>
                    <?php echo $this->Form->hidden('user_id', array('value' => AuthComponent::user('id'))); ?>
                    <?php echo $this->Form->hidden('salon_id', array('value' => $salon'Salon']'id'])); ?>
                    <?php echo $this->Form->textarea('message', array('class' => 'textareaChat')); ?><br />
                    <?php
                        $options = array(
                            'label' => 'Valider',
                            'value' => 'Valider',
                            'class' => 'btn btn-primary'
                        );
                    ?>
                    <?php echo $this->Form->end($options); ?>
                </div>

Ma fonction add :

public function add() {
        $this->autoRender = false;
        $this->Chat->save($this->params'data']);
    }

Ma fonction salons :

public function salons($id = null) {
        $this->loadModel('User');
        if(!$id) {
            throw new NotFoundException('Aucune salon ne correspond à cet ID');
        }
        $this->User->id = AuthComponent::user('id');
        $this->User->saveField('connectedChat', 1);
        $chats = $this->Chat->find('all', array(
            'conditions' => array('Chat.salon_id' => $id),
            'recursive' => 1
        ));
        $data'salon'] = $this->Chat->Salon->find('first', array('conditions' => array('Salon.id' => $id)));
        $data'chats'] = $chats;
        $this->set($data);
    }

Quand j'envoie un message, cela l'ajoute bien dans la base de données mais sa me redirige sur une page blanche.
Quand je retourne sur la page du chat, le message s'affiche bien.
Mais du coup, je dois faire une redirection, ce qui n'est pas correct ?

La vue qui affiche le chat avec les messages est chats/salons/:id.
J'ajoute avec chats/add.

Il doit pas y avoir de redirection , il faut renvoyer le message au javascript pour pouvoir l'inserérer en js dans la page après.
pour ça :

dans ta fonction add:
echo json_encode($this->params'data'];

tu les recupère dans data coté js

DexX
Auteur

J'ai regardé un peu oui, merci.

Voilà mon fichier .js :

// Variables
var url = "chats/";
$(document).ready(function() {
    getConnected();
});
function getConnected() {
    $.post(url,{action:"getConnected"}, function(data) {
        alert("ok");
        if(data.erreur == "ok") {
            $("#fifa-logged").empty().append(data.result);
        }
        else {
            alert(data.erreur);
        }
    }, "json");
    return false;
}

Dans ChatsController, ma fonction getConnected() :

public function getConnected() {
        $this->loadModel('ChatsOnline');
        $data'connected'] = $this->ChatsOnline->find('all');
        $data"erreur"] = "ok";
        echo json_encode($data);
    }

Quand j'actualise ma page, mon alert("ok") après $.post ne s'affiche pas, donc j'ai l'impression que mon URL n'est pas bonne.

bonjour,
c'est normal,
le controller peut pas déviner tout seul qu'il doit appeler l'action contenu dans l'objet javascript que tu envois...

$.post(url+"getConnected",{}, function(data) {

ça devrait être mieux