Wannonces : plateforme d'annonces avec messagerie intégrée en PHP

févr. 2025
Web
PHPSQL
Wannonces : plateforme d'annonces avec messagerie intégrée en PHP

Wannonces : plateforme d'annonces avec messagerie intégrée en PHP (février 2025)

Introduction et contexte

Ce projet a été réalisé dans le cadre d'un projet de contrôle continu individuel de deuxième année de BUT Informatique. L'objectif : améliorer une plateforme web d'annonces existante en PHP en y ajoutant une fonctionnalité de messagerie complète.

La fonctionnalité de messagerie a été réalisé en deux jours et demi, soit sous grande contrainte. L'interface n'étant que secondaire, je ne me suis que peu attardé sur celle-ci.

La plateforme initiale permettait de consulter des annonces, mais sans aucun moyen de contacter les auteurs. J'ai donc conçu et implémenté un système de messagerie hiérarchique permettant aux utilisateurs d'échanger autour des annonces publiées.

  • Problématique : Comment permettre aux utilisateurs d'une plateforme d'annonces de communiquer entre eux de manière structurée ?
  • Objectif : Développer un système de messagerie avec réponses imbriquées, tout en respectant l'architecture MVC et les principes de l'architecture propre.

Architecture du projet

Le patron MVC

Le projet suit un patron Modèle-Vue-Contrôleur (MVC) modifié, avec une séparation claire des responsabilités :

  • Modèle (domain/) : Les entités Post, User, Messages et UserPosts représentent les données métier
  • Vue (gui/) : Les classes View* génèrent le HTML affiché à l'utilisateur
  • Contrôleur (control/) : Controllers.php gère les actions utilisateur, Presenter.php prépare les données pour l'affichage
Diagramme de classe

Diagramme de classe UML du projet. Les entités du domaine sont séparées des services et des vues.

Architecture en couches

Le code est organisé en couches distinctes :

📁 Racine du projet

📂 domain/
Entités métier : Post, User...

📂 service/
Logique métier : PostService...

📂 data/
Accès aux données : PDO

📂 control/
Contrôleurs et presenter

📂 gui/
Vues HTML

Cette organisation permet de modifier une couche sans impacter les autres. Par exemple, changer de base de données ne nécessiterait que de modifier DataAccess.php.

Le système de messagerie

Conception de la base de données

J'ai créé une table Messages avec les champs suivants :

  • messageid : identifiant unique
  • postid : lien vers l'annonce concernée
  • senderlogin : auteur du message
  • content : contenu du message
  • date : horodatage
  • parentid : référence au message parent (pour les réponses)

Le champ parentid permet de créer une structure arborescente : un message peut être une réponse à un autre message, formant ainsi des fils de discussion.

Construction de l'arbre de messages

La classe MessageService contient l'algorithme de construction de l'arbre. Le processus se fait en deux passes :

  1. Première passe : création d'un tableau indexé par messageid pour un accès rapide
  2. Deuxième passe : rattachement de chaque message à son parent via parentid

Les messages sans parent (parentid null ou 0) deviennent des messages racines. Cette approche évite les requêtes SQL récursives et fonctionne en O(n).

Affichage hiérarchique

Le Presenter génère le HTML de manière récursive. Chaque niveau d'imbrication reçoit une classe CSS alternée (color-primary / color-secondary) pour distinguer visuellement les niveaux de conversation.

img15.avif

Affichage d'un fil de discussion avec plusieurs niveaux de réponses. L'alternance de couleurs facilite la lecture.

Fonctionnalités implémentées

Authentification

L'application dispose d'un système de connexion basé sur les sessions PHP. Chaque page protégée vérifie la présence d'une session valide avant d'afficher son contenu.

Page de connexion

Page de connexion. L'interface reste sobre et fonctionnelle.

Formulaire de connexion

Formulaire de connexion avec champs login et mot de passe.

Liste des annonces

Après connexion, l'utilisateur accède à la liste des annonces triées par date décroissante. Chaque annonce affiche son titre et son auteur.

Liste des annonces disponibles

Liste des annonces disponibles. Un clic sur le titre ouvre le détail.

Consultation d'une annonce

La page de détail affiche le titre, l'auteur, la date de publication et le contenu complet de l'annonce. Un bouton permet d'accéder aux messages.

Détail d'une annonce

Détail d'une annonce avec les informations de l'auteur et la date formatée en français.

Vue complète d'une annonce

Vue complète d'une annonce avec son contenu.

Création d'annonces

Les utilisateurs connectés peuvent publier de nouvelles annonces via un formulaire dédié.

Formulaire de création d'annonce

Formulaire de création d'annonce avec titre et contenu.

Confirmation après publication d'annonce

Confirmation après publication d'une annonce.

Messagerie par annonce

Chaque annonce dispose de son propre espace de discussion. Les utilisateurs peuvent poster des messages et répondre aux messages existants.

Messagerie d'une annonce

Zone de messagerie d'une annonce. Le formulaire en haut permet de poster un nouveau message.

Message sur une annonce

Envoi d'un message sur une annonce.

Confirmation d'envoi de message

Message envoyé avec confirmation.

Réponses imbriquées

Le système permet de répondre directement à un message. La réponse s'affiche en dessous du message d'origine, avec un décalage visuel.

Bouton de réponse

Bouton de réponse sur un message existant.

Formulaire de réponse

Formulaire de réponse à un message.

Envoi de réponse

Réponse envoyée et affichée sous le message parent.

Fil de discussion

Fil de discussion avec plusieurs réponses imbriquées.

Centralisation des messages

Une page dédiée permet à l'utilisateur de voir tous les messages reçus sur ses annonces, groupés par annonce.

Vue centralisée des messages

Vue centralisée des messages par annonce.

Liste des messages reçus

Liste des messages reçus sur une annonce.

Un menu permet d'accéder aux différentes sections : annonces, création, messages et déconnexion.

Barre de navigation

Barre de navigation avec accès rapide aux fonctionnalités.

Déconnexion

Déconnexion et retour à la page de connexion.

Actions possibles

Les principales actions possibles :

  • Se connecter / se déconnecter
  • Consulter la liste des annonces
  • Consulter le détail d'une annonce
  • Créer une nouvelle annonce
  • Envoyer un message sur une annonce
  • Répondre à un message existant
  • Consulter ses messages reçus

Choix techniques

PDO et requêtes préparées

L'accès à la base de données utilise PDO avec des requêtes préparées pour les opérations d'écriture. Cette approche protège contre les injections SQL.

Formatage des dates

Les dates sont formatées en français directement dans le Presenter, avec un tableau de mois traduits. L'affichage "23 janvier 2025 14:30:00" est plus lisible qu'un timestamp brut.

CSS et lisibilité

Le style utilise une palette de bleus (#406882, #2C5876) sur fond sombre (darkslategray). Les liens dorés (gold) contrastent avec le fond pour rester visibles.

Bilan et compétences

Ce projet m'a permis de consolider plusieurs compétences :

  • Architecture logicielle : mise en pratique du patron MVC et de l'architecture en couches
  • PHP et POO : namespaces, classes, héritage, injection de dépendances
  • Base de données : conception de schéma relationnel, requêtes SQL, PDO
  • Algorithmique : construction d'arbre à partir de données plates, parcours récursif
  • Interface utilisateur : formulaires HTML, sessions, navigation

Le code produit est maintenable et extensible. Ajouter un nouveau type de message ou une fonctionnalité de modération ne nécessiterait que des modifications localisées.