Bonjour,

j'aimerais savoir comment créer un système de commentaire imbriqué, c'est à dire que l'on puisse répondre à un commentaire déjà posté. Ce système est mise en place sur ce site mais je ne vois pas comment il fonctionne. Il est certainement question de jointure mais çà a l'air compliqué.
vous avez une idée ?

Merci d'avance.

10 réponses


tottosche
Réponse acceptée

Tu extrais tes données de ta BDD et les places dans ta variable $donnees ensuite t'affiches la variable $message qui n'a jamais été initialisée tu devrais faire un echo $donnees'message']

ensuite pour la seconde boucle, dans ta requête SQL tu écris parent_id=$data_comments'id'] alors que tu devrais faire : parent_id=$donnees'id'] et récupérer le tout dans une variable avec un autre nom que $donnee par exemple $commentaire_imbrique et tu affiche le message avec echo $commentaire_imbrique'message]'

Voyons voir... Tu pourrais créer une table reply_comments. Dans cette table tu listerais les réponses aux commentaires, et dans la boucle des commentaires, tu vas chercher toutes les réponses au commentaire qui ont l'ID du commentaire parcouru par la boucle :)

En espérant avoir été assez clair :)

EDIT ---------------
Oups je viens de constater que c'est plus ou moins la même solution que Lakh92 sauf qu'il ne faut pas crée un nouvelle table, un nouveau champ est suffisant, surtout qu'il est possible qu'un commentaire ai la même ID qu'on post!!
------------------

Moi ce que je ferais c'est rajouter une colonne "parent_id"

Tu listes tout les commentaires appartenant au post visité (ex id = 5) et qui on le parent_id = 0.
Pour chaque commentaire afficher (ex id = 37), chercher tout les commentaires appartenant au post (post_id = 5) et qui on parent_id = a l'id du commentaire imprimer (parent_id = 37).
Ce qui est pratique avec ce systeme, c'est que tu peux aller de plus en plus loins (avoir plus d'un imbrication)

SELECT * FROM comments 
WHERE post_id=(id du post) AND parent_id=0

SELECT * FROM comments 
WHERE post_id=(id du post) AND parent_id=$data_comments'id']

N'ésite pas a me demander si t'as besoin d'un meilleur example de code ;)

berg
Auteur

Merci pour ta réponse.
Ton explication doit certainement marché mais je t'avouerai que je n'ai pas tout compris.

il faut créer un champ input qui a pour valeur id_parent. On récupère la valeur parent_id du commentaire où l'on a cliqué, Si id_parent est nul (on ne répond pas à un commentaire), on le garde nul, si il a une valeur (on répond à un commentaire), on incrémente cette valeur de un.

En gros, le fonctionnement est-il le suivant ?

commentaire[id=5,id_parent=0]
-> commentaire[id=6,id_parent=5]
--> commentaire[id=7,id_parent=6]
commentaire[id=8,id_parent=0]

je pense avoir compris çà je vais essayer de le tester.

Effectivement l'utilisateur aura lui deux choix

Soit répondre au post, soit répondre a un commentaire du post.

Je te conseillerai de faire comme Grafikart, un formulaire a la fin avec un <input> de type hidden de nom "parent" initialisé a 0

Si l'utilisateur clic sur le boutton pour répondre une commentaire, avec jQuery (ou ce que tu veux) attribue la valeur de l'id du commentaire a la valeur du <input>
(et puis pour etre plus clair tu peu aussi ajouter la div du commentaire auquel il repond)

Ensuite a l'envoie le formulaire sur la mm page, le post_id tu le récupere avec la variable $_GET (dans d'url vu qu'il envoie au même URL) et pour parent c'est dans la variable $_POST envoyé par le formulaire

Sinon pour l'hiérarchie, il me semble que ta capté le truc

berg
Auteur

j'ai juste un problème pour afficher les commentaires avec l'incrémentation à l'infini.

voici en gros ce que donne le code mais je n'arrive pas bien à cerner les boucles while.

SELECT * FROM comments WHERE post_id=(id du post) AND parent_id=0 
while ($donnees = mysql_fetch_array($retour))            
{
echo $message;
SELECT * FROM comments WHERE post_id=(id du post) AND parent_id=$data_comments'id'] 
while ($donnees = mysql_fetch_array($retour))            
{
echo $message;
}
}

je pense qu'il faudrait faire appel à chaque fois à une fonction par exemple message_imbriqué() et cela dans une boucle mais je ne vois pas trop en détail...

berg
Auteur

merci bien je suis parvenu à créer mon système de news imbriqué grâce à tes aides. Merci bien !

j'ai suivé ces etapes ,mais j'ai un problémme pendant la supprition (comment je supprime se sous commentaire si il a deux ou trois sous commentaires par un commentaire parent)

@Ibrahim Issouani: Déjà bonjour pour commencer (un peu de politesse), ensuite @Graf' a fait un tuto sur le sujet il y a 1 mois http://www.grafikart.fr/tutoriels/php/commentaires-reponses-627/ c'est en GROS sur la page d'accueil.

ah oui bonjour d'abord, j'ai vue la vidéo mais pour moi je travail avec cake php j'ai essayé de passer id pour supprimer ,seulement le dernier qui le supprime toujours.