Bonjour,
Je suis entrain de faire un système de messagerie privée sur un espace membre, mais j'ai quelque difficulté, je voudrais que si le sujet d'un message à l'envoie est le même lors d'une réponse, un autre sujet ne se crée pas, mais que le sujet devienne gras pour signifier une réponse.Comment je dois faire ce système?je dois comparer les sujets lors d'un envoie et celui de réception?
Merci d'avance pour vos explications.

5 réponses


Bonjour,
Vite faite comme ça, je ferais un appel à la base de donnée pour vérifier si un message avec le même sujet ete envoyé au même utilisateur existe déjà au moment d'envoyer le message. Dans la table contenant les messages privés, j'imagine que tu dois avoir un champs type boolean qui dit si le message a été lu ou non. Dans ce cas, il suffit de remettre ce champ à 0 (false) pour qu'il s'affiche comme un nouveau message entrant.
Après, un système de conversation pourrait être un peu plus optimisé, mais il faudra faire un peu de modifications dans ta base de donnée.

Bonne soirée,
Arkantos

wenz
Auteur

ok Merci, mais c'est possible de m'expliquer un peu en détail le système de conversation un peu plus optimisé, merci

Pour un système de topics, c'est à dire de fil de discussion tu peux faire comme suit :

Extrait schéma des tables :
users(id, username, ...)
mp_messages(id, subject, content, from_id, to_id, from_status, to_status, parent_id)

from_id & to_id contiennent des id d'user.
from_status & to_status sont le status du topic pour le user correspondant (soit from ou to)

Exemple de contenu de la table mp_messages

1, 'premier mp', 'contenu du premier mp', 1, 2, 'readed', 'unread', null
2, 'premier mp', '1ere reponse au premier mp', 2, 1, null, null, 1
2, 'premier mp', 'Autre réponse possible au premier mp', 1, 2, null, null, 1

Ensuite il faut créer une vue (SQL) pour te simplfier la vie. Tu peux faire sans mais c'est galère je trouve.

CREATE VIEW mp_messages_view as
  SELECT
    t1.id           AS id,
    t1.subject      AS subject,
    t1.content      AS content,
    t1.from_id      AS from_id,
    t1.to_id        AS to_id
    t1.from_status  AS from_status
    t1.to_status    AS to_status
    t1.parent_id    AS parent_id
  FROM
    mp_messages t1

  UNION

  SELECT
    t2.id           AS id,
    t2.subject      AS subject,
    t2.content      AS content,
    t2.from_id      AS to_id,
    t2.to_id        AS from_id
    t2.from_status  AS to_status
    t2.to_status    AS from_status
    t2.parent_id    AS parent_id
  FROM
    mp_messages t2;
');

L'essentiel ici, c'est le UNION : j'ai inversé les champs préfixés from je les ai préfixés à to. Comme ça quand tu fais une requête

SELECT * FROM mp_messages_view where to_id = 1 and parent_id = null

Tu as la liste de tous les messages, que le user soit l'expéditeur ou le receveur dans to_id avec le bon statut dans to_status.

En gros

  • pour lister les messages : tu utilises la vue SQL avec les conditions
    • to_id = utilisateur connecté
    • parent_id => null (pour ne récupérer que les topics)
  • quand un utilisateur créé un message, pense à renseigné :
    • from_id => id de l'expéditeur
    • to_id => id du destinataire
    • from_status => statut du message pour l'expéditeur, ici read
    • to_status => statut du message pour le destinataire, ici unread
  • quand un utilisateur répond à un message, pense à renseigné :
    • from_id => id de l'expéditeur
    • to_id => id du destinataire
    • from_status => statut du message pour l'expéditeur, ici null
    • to_status => statut du message pour le destinataire, ici null
    • parent_id => id du parent
    • IMPORTANT tu dois modifier sur l'entrée du parent les status
    • from_status => unread
    • to_status => read

Je ne sais pas si c'est claire, dis moi :)

Bonjour,

Alors, l'idée serait par exemple d'avoir une table "conversations" et une table "messages" (tu les appelles comme tu veux, c'est juste pour l'exemple) ressemblant à ceci (il te faute également une table "users" que tu dois déjà avoir) :
Conversations : id, subject, users_id, last_message_date
Messages : id, conversation_id, user_id, content, created_at, viewed
Users : id, (...)
Quand tu crées un nouveau message, il faut falloir tester si les utilisateurs ont déjà communiqués entre eux (si oui, leurs deux ID sont stockées dans conversations.users_id). Si oui, il faut créer un nouveau message avec messages.conversation_id qui a l'ID dans la conversation (au pasage, mettre à jour le champs conversation.last_message_date). Si non, il faut créer une nouvelle conversation et puis créer un nouveau message au sein de cette conversation.
Pour tester les valeurs de lu/non-l, le champ message.viewed est là.

Voilà qui peut déjà te donner des pistes. Le système peu bien sûr être amélioré voire repensé, mais le but ici est de te donner une idée générale du fonctionnement, à toi maintenant d'y réfléchir et d'y apporté tes améliorations.

Bonne chance,
Arkantos

PS: il y a un tas d'autre façon de créer un système de conversation, si tu en trouves une qui te plait plus, n'hésite pas à l'utilisée !

wenz
Auteur

merci pour vos réponse, connected je suis partant pour ta solution mais c'est encore un peu flou, tu peux être un peu explicite merci