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,MessagesetUserPostsreprésentent les données métier - Vue (gui/) : Les classes
View*génèrent le HTML affiché à l'utilisateur - Contrôleur (control/) :
Controllers.phpgère les actions utilisateur,Presenter.phpprépare les données pour l'affichage
Architecture en couches
Le code est organisé en couches distinctes :
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 uniquepostid: lien vers l'annonce concernéesenderlogin: auteur du messagecontent: contenu du messagedate: horodatageparentid: 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 :
- Première passe : création d'un tableau indexé par
messageidpour un accès rapide - 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.

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.
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.
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.
Création d'annonces
Les utilisateurs connectés peuvent publier de nouvelles annonces via un formulaire dédié.
Messagerie par annonce
Chaque annonce dispose de son propre espace de discussion. Les utilisateurs peuvent poster des messages et répondre aux messages existants.
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.
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.
Navigation
Un menu permet d'accéder aux différentes sections : annonces, création, messages et dé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.
Galerie





















Page de connexion - L'interface d'accueil sobre et fonctionnelle





















