Aller au contenu

TP2 — Dex : coordonner les rencontres d'étude d'un cours

Les cours requièrent souvent de réaliser des travaux en équipe. Cependant, les plateformes populaires pour la distribution du matériel de cours, comme Moodle ou Omnivox, ne proposent pas toujours d’outils facilitant la coordination des rencontres. Les étudiants doivent alors trouver eux-mêmes un moyen d’échanger leurs disponibilités et de planifier leurs rencontres d’équipe.

Ce travail pratique (TP) vise à construire Dex, un outil qui s’intègre aux plateformes de cours pour aider les étudiants à s’organiser. À partir des travaux à faire, il permet de coordonner des rencontres d’étude et de travail d’équipe, dans l’esprit d’un outil simple comme when2meet. Pour un travail donné, chaque étudiant indique ses créneaux libres, et l’outil met en évidence le moment qui convient au plus grand nombre.

Chaque cours possède une liste de travaux à faire : des travaux pratiques, des laboratoires, un projet d’équipe. Chaque travail a un titre, une description, un type (individuel ou en équipe), une date de disponibilité et une date de remise. Ces informations proviennent de la plateforme du cours. La plateforme sera simulée dans ce travail.

Un étudiant ouvre l’outil, choisit un travail en filtrant optionnellement les cours, puis il saisit son nom et coche les créneaux où il est libre. La page affiche alors, pour chaque créneau, combien d’étudiants sont disponibles et lesquels, puis désigne le meilleur moment. Chacun voit les réponses des autres.

Deux pages et une structure de projet soignée.

Elle affiche la liste des travaux ouverts (titre, type, date de remise), regroupés par cours. Chaque entrée possède un lien qui mène à sa page de coordination. La page possède également un filtre de cours, positionné avant la liste des travaux, qui permet de limiter l’affichage au cours choisi. Si aucun cours n’est sélectionné, tous les travaux ouverts de tous les cours sont affichés.

Cette page joue deux rôles : elle affiche les détails du travail et les créneaux proposés et elle permet à un étudiant de soumettre ses disponibilités.

À l’arrivée sur la page, il faut valider que le travail existe dans la base de données. Si le travail n’existe pas, rediriger l’utilisateur vers la page d’accueil ;

Si le travail existe, la page doit:

  • afficher les informations complètes du travail (titre, description, remise) et les créneaux proposés ;
  • présenter un formulaire pour indiquer ses disponibilités : le nom de l’étudiant et une case à cocher par créneau ;

À la soumission du formulaire :

  • valider la saisie : nom obligatoire, au moins un créneau choisi et identifiants de créneaux appartenant bien au travail courant, puis enregistrer les disponibilités en base de données ;
  • retenir le nom de l’étudiant courant en session, préremplir le formulaire lors de son retour et lui permettre de modifier ses réponses ;
  • afficher la grille agrégée (par créneau : le nombre et la liste des étudiants disponibles) et mettre en évidence le ou les meilleurs créneaux. En cas d’égalité, tous les créneaux ayant le nombre maximal de disponibilités sont considérés comme meilleurs.
  • Chaque page partage le même en-tête et le même pied de page.
  • L’en-tête possède un logo (nom de l’outil) qui mène à l’accueil et affiche le nom du dernier utilisateur (conservé en session).
  • Le pied de page contient le nom de l’outil, votre nom et les droits d’auteur associés à la plateforme.
  • Un fichier distinct pour la connexion à la base de données.
  • Les classes demandées plus bas.
  • Le script d’initialisation de la base de données.

Toutes les données utilisées par Dex sont conservées dans la base de données DexBD. Elle contient les cours et travaux provenant de la plateforme simulée, les créneaux proposés et les disponibilités saisies dans Dex.

Vous devez fournir un script PHP d’initialisation (init.php) qui se connecte à DexBD avec PDO, crée les tables décrites ci-dessous et insère le jeu de données initial fourni dans l’énoncé.

Le script doit pouvoir être relancé sans produire d’erreurs ni dupliquer les données initiales.

ChampTypeContraintes
idVARCHAR(30)clé primaire
titreVARCHAR(100)obligatoire
ChampTypeContraintes
idVARCHAR(30)clé primaire
cours_idVARCHAR(30)obligatoire, référence cours(id)
titreVARCHAR(150)obligatoire
descriptionTEXTobligatoire
typeVARCHAR(20)obligatoire
disponibleDATEobligatoire
remiseDATETIMEobligatoire
ouvertBOOLEANobligatoire
ChampTypeContraintes
idVARCHAR(30)clé primaire
travail_idVARCHAR(30)obligatoire, référence travaux(id)
debutDATETIMEobligatoire
finDATETIMEobligatoire
ChampTypeContraintes
idINTclé primaire, auto-incrémentée
travail_idVARCHAR(30)obligatoire, référence travaux(id)
creneau_idVARCHAR(30)obligatoire, référence creneaux(id)
etudiantVARCHAR(100)obligatoire

Une combinaison (travail_id, creneau_id, etudiant) doit être unique afin qu’un étudiant ne puisse pas apparaître deux fois pour le même créneau d’un même travail.

Lorsqu’un étudiant modifie sa réponse, ses anciennes disponibilités pour ce travail sont remplacées par les nouvelles.

Les données suivantes simulent les informations qui seraient normalement obtenues à partir d’une plateforme de cours. Elles doivent être insérées dans DexBD par votre script init.php.

Les étudiants ne font pas partie du jeu de données initial : dans Dex, ils s’identifient simplement par leur nom lorsqu’ils soumettent leurs disponibilités.

idTitre
serveurDéveloppement côté serveur
bddBases de données
integrationProjet d’intégration
idCoursTitreDescriptionTypeDisponibleRemiseouvert
srv-tp1serveurTP1 — Catalogue de produitsConstruire une première application PHP permettant d’afficher et de filtrer un catalogue.individuel2026-09-012026-09-20 23:59false
srv-tp2serveurTP2 — API de réservationDévelopper une application côté serveur qui enregistre des réservations et expose les données nécessaires à l’interface.equipe2026-09-212026-10-18 23:59true
bdd-lab2bddLaboratoire 2 — Requêtes SQLÉcrire et tester des requêtes SQL sur une base de données relationnelle fournie.individuel2026-09-282026-10-12 23:59true
bdd-tp1bddTP1 — Modélisation d’une bibliothèqueConcevoir un modèle relationnel et produire le script SQL permettant de créer la base de données.equipe2026-10-052026-10-25 23:59true
int-sprint1integrationSprint 1 — Prototype fonctionnelProduire une première version fonctionnelle du projet et préparer une démonstration à l’équipe enseignante.equipe2026-09-152026-10-09 23:59true
travail_idid du créneauDébutFin
srv-tp1srv-tp1-012026-09-15 18:002026-09-15 19:30
srv-tp1srv-tp1-022026-09-16 12:002026-09-16 13:30
srv-tp1srv-tp1-032026-09-17 17:002026-09-17 18:30
srv-tp2srv-tp2-012026-10-05 18:002026-10-05 19:30
srv-tp2srv-tp2-022026-10-06 12:002026-10-06 13:30
srv-tp2srv-tp2-032026-10-07 17:002026-10-07 18:30
bdd-lab2bdd-lab2-012026-10-01 16:002026-10-01 17:30
bdd-lab2bdd-lab2-022026-10-02 12:002026-10-02 13:30
bdd-lab2bdd-lab2-032026-10-04 10:002026-10-04 11:30
bdd-tp1bdd-tp1-012026-10-13 18:002026-10-13 19:30
bdd-tp1bdd-tp1-022026-10-14 12:002026-10-14 13:30
bdd-tp1bdd-tp1-032026-10-15 17:002026-10-15 18:30
int-sprint1int-s1-012026-09-29 18:002026-09-29 20:00
int-sprint1int-s1-022026-09-30 17:002026-09-30 19:00
int-sprint1int-s1-032026-10-01 18:002026-10-01 20:00

Le champ ouvert est fourni dans les données initiales. Vous n’avez pas à calculer l’état d’un travail à partir des dates : la page d’accueil affiche uniquement les travaux pour lesquels ouvert vaut true.

Les identifiants (id) des cours, travaux et créneaux doivent être utilisés tels quels.

Le TP vous introduit à la programmation orientée objet en isolant l’accès aux informations de la plateforme dans une classe Plateforme.

La classe reçoit l’objet PDO dans son constructeur et effectue les requêtes nécessaires pour récupérer les cours, les travaux et leurs créneaux. Les pages index.php et travail.php ne devraient donc pas contenir directement les requêtes SQL liées à ces données.

<?php
class Plateforme
{
private PDO $pdo;
public function __construct(PDO $pdo)
{
// conserver la connexion à la base de données
}
public function cours(): array
{
// retourne la liste des cours
}
public function travaux(?string $cours = null): array
{
// retourne les travaux ouverts, avec filtre de cours optionnel
}
public function travail(string $id): ?array
{
// retourne un travail particulier ou NULL s'il n'existe pas
}
public function creneaux(string $travailId): array
{
// retourne les créneaux associés à un travail
}
}

La classe Plateforme représente ici l’accès aux données qui proviendraient normalement de la plateforme de cours. Dans ce TP, ces données sont simulées par les tables cours, travaux et creneaux de DexBD.

Créez également une classe qui encapsule l’accès aux disponibilités enregistrées dans DexBD. Le nom de la classe est libre (Disponibilites, DisponibiliteRepository, etc.), mais le reste de l’application ne devrait pas exécuter directement les requêtes SQL liées aux disponibilités.

Cette classe doit au minimum permettre de :

  • récupérer les disponibilités enregistrées pour un travail ;
  • remplacer les disponibilités d’un étudiant pour un travail lorsqu’il soumet de nouveau le formulaire.

Elle reçoit l’objet PDO dans son constructeur et utilise des requêtes préparées.

  • Base de données obligatoire : les cours, travaux, créneaux et disponibilités sont conservés dans DexBD et accessibles avec PDO.
  • Un script PHP d’initialisation (init.php) qui crée les quatre tables, établit leurs relations et insère le jeu de données initial. Il doit pouvoir être relancé sans produire de doublons ni d’erreurs.
  • Requêtes préparées pour toute requête contenant des données provenant de l’utilisateur.
  • Orienté objet : une classe Plateforme qui encapsule l’accès aux cours, travaux et créneaux, et une classe qui encapsule l’accès aux disponibilités.
  • Session pour retenir l’étudiant courant.
  • Échappement systématique de toute sortie (htmlspecialchars) et requêtes préparées contre l’injection SQL.
  • Structure de projet propre : en-tête, pied et navigation partagés par include.
  1. Une archive (.zip ou .rar) du projet, prête à déposer dans htdocs, contenant le code, le fichier de connexion et vos classes.
  2. Le script PHP d’initialisation de la base (init.php), incluant la création des tables et l’insertion du jeu de données initial.
  3. Un court README expliquant la mise en place : démarrer MySQL, exécuter init.php (sur une base nommée DexBD), puis l’usage de l’outil.