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.
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
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
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 !
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