Page 1 sur 1

Chat en ajax, message du plus récent au plus vieux ?

Posté : 03 sept. 2007, 14:23
par SIlvox
Bonjour à tous,

Je viens à vous car je rencontre un petit probleme, je m'explique.

J'ai ajouté un tchat en ajax pour mon projet ( tchat tiré du site du zéro car rien ne sert de réinventer la roue ^^ ) et donc voici le probleme tout mon tchat s'affiche de haut en bas, c'est à dire les messages les plus anciens en haut et ceux les plus vieux en bas, tous ceci regroupé dans une zone avec un scroll pour faire defiler la discution.

Mon probleme viens donc de l'affichage, je souhaiterais que les messages les plus récents se situe en haut et non en bas, j'ai pensé à écrire les messages du tchat les plus récent en premier dans mon fichier chat.txt, mais ceci ne fait qu'effacer les messages précendent.

Auriez un moyen pour réaliser ce que je souhaite ? ( message le plus récent en haut, et le plus vieux en bas ?
Voici une partie du code qui lit et écrit dans le fichier .
function afficher()
{
        $reponse = new xajaxResponse();//Création d'une instance de xajaxResponse pour traiter les réponses serveur
        $reponse->setCharEncoding('ISO-8859-1');//On indique le jeu de caractères utilisé
        $chat = '';//Initialisation de la variable $chat
        $fichier_texte = fopen('./chat.txt', 'r+');//On ouvre notre fichier texte en lecture seule
        $chat = fgets($fichier_texte);//On lit notre fichier et on le stocke dans la variable $chat
        fclose($fichier_texte);//On ferme notre fichier texte   
        $reponse->addAssign("block", "innerHTML", $chat);//Enfin, on change le contenu du div block par le contenu de $chat
        return $reponse->getXML();
		}

//
//Notre fonction PHP envoyer pour envoyer un message
//

function envoyer($message)
{
        $heure = date("H");
        $minute = date("i");
        $pseudo=$_SESSION['pseudo'];
        $reponse = new xajaxResponse();//Création d'une instance de xajaxResponse pour traiter les réponses serveur
        $reponse->setCharEncoding('ISO-8859-1');//On indique le jeu de caractères utilisé
        $fichier_texte = fopen('./chat.txt', 'a');//On ouvre notre fichier texte en ecriture seule
        fwrite($fichier_texte,('<span class="Style2"><strong>['.$heure .':'.$minute.'] ' . htmlentities($pseudo) . ':</span>&nbsp</strong><span class="Style1">' . htmlentities($message) . '</span><br />'));//On stocke dans notre fichier
        fclose($fichier_texte);//On ferme notre fichier texte
        $reponse->addAssign("message", "value", "");//On vide le champ contenant le message du posteur
        $reponse->addScript("xajax_afficher();");//On appelle la fonction afficher pour afficher les messages et que le posteur voit son message à l'écran
        return $reponse->getXML();
}

Suivi de ce qui permet de l'afficher
  <div id="block" class="barrechat" align="left"></div>
          <form action="">
          <div>
          <label><span class="Style2">Message :</span> <input type="text" size="45" style="color:#7c7b7b; background-color:#f2ecca;" id="message" /></label><br><input type="submit" value="Envoyer" onclick="xajax_envoyer(document.getElementById('message').value); return false;" />
          </div>
          </form>
<script type="text/javascript">
    refresh();//On appelle la fonction refresh() pour lancer le script
</script> </td>
Il ya quelque morceaux de code encore entre tous sa comme l'ouverture de la librairie ajax etc... mais je ne pense pas que cela soit nécessaire le mettre .

Merci

Posté : 03 sept. 2007, 14:30
par Gaap
dans ton fopen je changerais "a" par "w" ou "r+" qui place ton pointeur en début de fichier et non a la fin du coup tout ce que tu ecris sera au début de ton fichier txt donc en premier

Posté : 03 sept. 2007, 14:38
par Ryle
C'est pas vraiment habituel pour un chat d'avoir le dernier message en haut.. m'enfin bon..

Il n'y a pas vraiment de tri effectuer, le chat se contente d'afficher le contenu du fichier "chat.txt". Les derniers messages étant ajoutés à la fin (avec append) ils se retrouvent naturellement en bas.

Il te faut donc lire le fichier, placer les différentes lignes dans un tableau, inverser le tout (ou bien les inverser au fur et à mesure de la lecture) et retourner le résultat :)

@Gaap : si tu ouvres un fichier avec r+, ce que tu ajoutes au début du fichier ne va pas écraser ce qui était déjà présent ?

Posté : 03 sept. 2007, 14:39
par SIlvox
Merci de ta réponse,

J'ai donc essayé r+, mais sa ne semble pas fonctionner, cela me remplace le message précedent par celui posté ( et si nouveau plus court, il affiche des balises qui servent à affiché les styles du message ).
Et le w, lui efface tout ce qu'il y'avais avant pour mettre le nouveau message .

Peut être ai-je mal expliqué mon probléme, mais merci en tous cas

Posté : 03 sept. 2007, 14:53
par Invité
Il te faut donc lire le fichier, placer les différentes lignes dans un tableau, inverser le tout (ou bien les inverser au fur et à mesure de la lecture) et retourner le résultat :)
Je ne connais pas les fonctions nécessaire à cela mais j'ai recherché un petit peu,
pour placer les différentes lignes dans un tableau, est ce bien la fonction explode() ?
Et pour inverser le tout je pense que c'est la fonction array_reverse ?

Meric pour ton aide :)

Posté : 03 sept. 2007, 15:21
par Ryle
Tu as la fonction file() qui sera plus simple à utiliser pour ouvrir et lire le fichier et te renvoi directement un tableau :)

et effectivement array_reverse() te permet de le retourner :)

Posté : 03 sept. 2007, 15:37
par Invité
Merci, j'ai donc essayé ceci
function afficher()
{
        $reponse = new xajaxResponse();//Création d'une instance de xajaxResponse pour traiter les réponses serveur
        $reponse->setCharEncoding('ISO-8859-1');//On indique le jeu de caractères utilisé
$lines = file ('chat.txt');
$result = array_reverse ($lines);
$colon = implode($result);
$reponse->addAssign("block", "innerHTML", $colon);//Enfin, on change le contenu du div block par le contenu de $chat
        return $reponse->getXML();

		}
Mais cela me donne toujours les messages du plus vieux au plus récent au lieu de l'inverse.
Peut etre que j'ai oublié quelque chose ?

Posté : 03 sept. 2007, 15:39
par Gaap
@Gaap : si tu ouvres un fichier avec r+, ce que tu ajoutes au début du fichier ne va pas écraser ce qui était déjà présent ?
autant pour moi, j'avais squizzer le fait de conserver l'historique du chat dans mon esprit dsl... :?


grillé

Posté : 03 sept. 2007, 15:45
par Gaap
Mais cela me donne toujours les messages du plus vieux au plus récent au lieu de l'inverse.
Peut etre que j'ai oublié quelque chose ?
au lieu du file() fais un file_get_contents() sans trie, car le file se base sur les lignes \n\r pour faire son tableau et je vois que tu colles tout a la suite sans retour chariot a chaque insertion.

donc tu fais ton file_get_contents($file)...

$texte = $messageenvoye + le résultat de ton file_get_contents($file)

puis tu réinjectes le tout


mon avis perso, tu fais un chat en fichier tu vas vite avoir des lenteurs, j'ai testé chat fichier et chat base de données et il n'y a pas photo a 20ko tu commences a avoir des lenteurs d'ouverture et de lecture de fichier...

Posté : 03 sept. 2007, 15:47
par Ryle
Peut etre que j'ai oublié quelque chose ?
Il te manque effectivement un paramètre à ta fonction implode() pour recoller ensemble les lignes du tableau.. tu devrais d'ailleurs avoir un message d'erreur...

Posté : 03 sept. 2007, 16:11
par Invité
Bon et bien merci beaucoup à vous, sa ma permis de faire ce que je souhaitais.

Voici le code qui fonctionne ( on sait jamais sa peut servir à quelqu'un d'autre )
function afficher()
{
        $reponse = new xajaxResponse();//Création d'une instance de xajaxResponse pour traiter les réponses serveur
        $reponse->setCharEncoding('ISO-8859-1');//On indique le jeu de caractères utilisé
        $lines = file ('chat.txt');
        $result = array_reverse ($lines);
        $colon = implode($result); 
        $reponse->addAssign("block", "innerHTML", $colon);//Enfin, on change le contenu du div block par le contenu de $chat
        return $reponse->getXML();
        } 
//
//Notre fonction PHP envoyer pour envoyer un message
//

function envoyer($message)
{
        $heure = date("H");
        $minute = date("i");
        $pseudo=$_SESSION['pseudo'];
        $reponse = new xajaxResponse();//Création d'une instance de xajaxResponse pour traiter les réponses serveur
        $reponse->setCharEncoding('ISO-8859-1');//On indique le jeu de caractères utilisé
        $fichier_texte = fopen('chat.txt', 'a');//On ouvre notre fichier texte en ecriture seule
        fwrite($fichier_texte,('<strong><span class="Style2">['.$heure .':'.$minute.'] ' . htmlentities($pseudo) . ':</span>&nbsp</strong><span class="Style1">' . htmlentities($message) . '</span><br />'."\n"));//On stocke dans notre fichier
        fclose($fichier_texte);//On ferme notre fichier texte
        $reponse->addAssign("message", "value", "");//On vide le champ contenant le message du posteur
        $reponse->addScript("xajax_afficher();");//On appelle la fonction afficher pour afficher les messages et que le posteur voit son message à l'écran
        return $reponse->getXML();

}
mon avis perso, tu fais un chat en fichier tu vas vite avoir des lenteurs, j'ai testé chat fichier et chat base de données et il n'y a pas photo a 20ko tu commences a avoir des lenteurs d'ouverture et de lecture de fichier...
Effectivement j'en suis conscient, mais etant donné que je ne compte pas sauvegardé tous les messages dans les meme fichiers, je pense que sa poura allez ^^ enfin je verrais bien ^^

Merci à vous :P

Re: Chat en ajax, message du plus récent au plus vieux ?

Posté : 25 avr. 2012, 16:49
par Luffy
Bonjour, ce sujet m'interesse grandement :) Je cherche de partout mais je ne trouve rien d'autre que ce post :(

Si quelqu'un pourrait m'aider ce serait super sympas car justement je veux afficher les derniers messages en haut et non en bas comme c le cas avec mon code!

Voici le code js :

Code : Tout sélectionner

var url="tchatAjax.php"; var lastid=0; var timer = setInterval(getMessages,5000); var ctimer = setInterval(getConnected,10000); $(function(){ getConnected(); $("#tchatform form").submit(function(){ clearInterval(timer) showLoader("#tchatform"); var message = $("#tchatform form input").val(); $.post(url,{action:"addMessage",message:message},function(data){ if(data.erreur=="ok"){ getMessages(); $("#tchatform form input").val(""); } else{ alert(data.erreur); } timer = setInterval(getMessages,5000); hideLoader(); },"json"); return false; }) }); function getMessages(){ $.post(url,{action:"getMessages",lastid:lastid},function(data){ if(data.erreur=="ok"){ $("#tchat").append(data.result); lastid=data.lastid; } else{ alert(data.erreur); } },"json"); return false; } function getConnected(){ $.post(url,{action:"getConnected"},function(data){ if(data.erreur=="ok"){ $("#connected").empty().append(data.result); } else{ alert(data.erreur); } },"json"); return false; } function showLoader(div){ $(div).append('<div class="loader"></div>'); $(".loader").fadeTo(500,0.6); } function hideLoader(){ $(".loader").fadeOut(500,function(){ $(".loader").remove(); }); }
Et voici le code PHP qui lit les messages ajax :

Code : Tout sélectionner

/** *Actio : getMessages *Permet l'affichage des derniers messages **/ if($_POST["action"] =="getMessages"){ $rangcouleur = array( "1" => "admin", "2" => "supmodo", "3" => "modo", "4" => "vip", "5" => "uploader", "6" => "power", "7" => "user", ); $lastid = floor($lastid); $message = ($_POST["action"]); $sql = ("SELECT Shoutbox.id, Shoutbox.pseudo, Shoutbox.message, Shoutbox.date, users.role_id FROM Shoutbox LEFT JOIN users ON users.NiCK = Shoutbox.pseudo WHERE Shoutbox.id>$lastid ORDER BY Shoutbox.date DESC"); $req = $PDO->query($sql); $d["lastid"] = $lastid; $d["result"] = ""; while ($data = $req->fetch(PDO::FETCH_ASSOC)){ $d["result"].= '<p><span class="'.$rangcouleur[$data["role_id"]].'">'.($data["pseudo"]).'</span> ('.date("d/m/Y H:i:s",$data["date"]).') : '.str_replace( ":)", '<img src="images/nice.png" alt=":)">',''.str_replace( ":(", '<img src="sad.gif" alt=":(">',''.str_replace( ":d", '<img src="images/grin.png" alt=":d">',''.str_replace( ":f", '<img src="images/f.png" alt=":f">',''.str_replace( ":p", '<img src="images/ouf.png" alt=":p">',''.str_replace( ":g", '<img src="images/sceptique.png" alt=":g">',''.str_replace( ":o", '<img src="images/OO.png" alt=":o">',''.str_replace( ":a", '<img src="images/Amour.png" alt=":a">',''.str_replace( ":v", '<img src="images/angry.png" alt=":v">',''.str_replace( ":Murey", '<img src="images/Murey.png" alt=":Murey">',''.str_replace( "XD", '<img src="images/XD.png" alt="XD">',''.str_replace( ":z", '<img src="images/z.png" alt=":z">',''.str_replace( ":smoke", '<img src="images/smoke.png" alt=":smoke">',''.str_replace( ":i", '<img src="images/i.png" alt=":i">',''.str_replace( ";^^", '<img src="images/;^^.png" alt=";^^">',''.str_replace( "OMG", '<img src="images/omg.png" alt="OMG">',''.str_replace( ":y", '<img src="images/yo.png" alt=":y">',''.str_replace( ":wave", '<img src="wavenoir.gif" alt=":wave">',''.str_replace( ";)", '<img src="wink.gif" alt=";)">',''.str_replace( ":suck", '<img src="smiley suce.gif" alt=":suce">',''.str_replace( ":Ange", '<img src="innocent.gif" alt=":Ange">',''.str_replace( ":'(", '<img src="cry.gif" alt=":\'(">',''.str_replace( ":blush", '<img src="blushnoir.gif" alt=":blush">',''.str_replace( ":love:", '<img src="love.gif" alt=":love:">',''.str_replace( ":k", '<img src="kissnoir.gif" alt=":k">',''.str_replace( "OO", '<img src="w00t.gif" alt="OO">',''.str_replace( ":woot:", '<img src="w000t.gif" alt=":woot:">',''.str_replace( ":lol:", '<img src="laugh.gif" alt=":lol:">',''.str_replace( ":-/", '<img src="confused.gif" alt=":-/">',htmlentities(utf8_decode($data["message"]))))))))))))))))))))))))))))))).'</p>'; $d["lastid"] = $data["id"]; } $d["erreur"]="ok"; }
Bon alors dedans il y a des str_replace pour les smileys et un array pour les class de mes couleurs afin que leurs pseudos apparaissent dans leurs couleurs respectives, mais cela ne gêne en rien mon code, le tchat marche tres bien, je cherche juste a inverser les messages, donc le plus recent en haut et le plus vieux en bas :)

Merci à ceux qui m'aideront, je suis paumé...

Re: Chat en ajax, message du plus récent au plus vieux ?

Posté : 25 avr. 2012, 21:04
par Ryle
Je ne suis pas forcément convaincu que ta façon re remplacer les smileys soit la plus clair et la plus maintenable qu'on puisse envisager, mais ce n'est pas le propos :)

Pour ton problème de tri, j'aurais tendance à dire qu'il faut juste remplacer [javascript]$("#tchat").append(data.result);[/javascript]par [javascript]$("#tchat").prepend(data.result);[/javascript]de façon à ce que les messages que tu récupères côté php soit placé "avant" les messages précédents, au lieu d'après...

A tester :)