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.
Le scénario
Section intitulée « Le scénario »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.
Ce que vous devez construire
Section intitulée « Ce que vous devez construire »Deux pages et une structure de projet soignée.
Page d’accueil : index.php
Section intitulée « Page d’accueil : index.php »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.
Page d’un travail : travail.php?travail=<id>
Section intitulée « Page d’un travail : travail.php?travail=<id> »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.
Arrivée sur la page
Section intitulée « Arrivée sur la page »À 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 ;
Affichage des détails et des créneaux
Section intitulée « Affichage des détails et des créneaux »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
Section intitulée « À la soumission »À 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.
Structure de l’outil
Section intitulée « Structure de l’outil »Organisation des pages
Section intitulée « Organisation des pages »- 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.
Organisation du code
Section intitulée « Organisation du code »- 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.
La base de données : DexBD
Section intitulée « La base de données : DexBD »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.
Structure des tables
Section intitulée « Structure des tables »Table cours
Section intitulée « Table cours »| Champ | Type | Contraintes |
|---|---|---|
id | VARCHAR(30) | clé primaire |
titre | VARCHAR(100) | obligatoire |
Table travaux
Section intitulée « Table travaux »| Champ | Type | Contraintes |
|---|---|---|
id | VARCHAR(30) | clé primaire |
cours_id | VARCHAR(30) | obligatoire, référence cours(id) |
titre | VARCHAR(150) | obligatoire |
description | TEXT | obligatoire |
type | VARCHAR(20) | obligatoire |
disponible | DATE | obligatoire |
remise | DATETIME | obligatoire |
ouvert | BOOLEAN | obligatoire |
Table creneaux
Section intitulée « Table creneaux »| Champ | Type | Contraintes |
|---|---|---|
id | VARCHAR(30) | clé primaire |
travail_id | VARCHAR(30) | obligatoire, référence travaux(id) |
debut | DATETIME | obligatoire |
fin | DATETIME | obligatoire |
Table disponibilites
Section intitulée « Table disponibilites »| Champ | Type | Contraintes |
|---|---|---|
id | INT | clé primaire, auto-incrémentée |
travail_id | VARCHAR(30) | obligatoire, référence travaux(id) |
creneau_id | VARCHAR(30) | obligatoire, référence creneaux(id) |
etudiant | VARCHAR(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.
Jeu de données initial
Section intitulée « Jeu de données initial »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.
id | Titre |
|---|---|
serveur | Développement côté serveur |
bdd | Bases de données |
integration | Projet d’intégration |
id | Cours | Titre | Description | Type | Disponible | Remise | ouvert |
|---|---|---|---|---|---|---|---|
srv-tp1 | serveur | TP1 — Catalogue de produits | Construire une première application PHP permettant d’afficher et de filtrer un catalogue. | individuel | 2026-09-01 | 2026-09-20 23:59 | false |
srv-tp2 | serveur | TP2 — API de réservation | Développer une application côté serveur qui enregistre des réservations et expose les données nécessaires à l’interface. | equipe | 2026-09-21 | 2026-10-18 23:59 | true |
bdd-lab2 | bdd | Laboratoire 2 — Requêtes SQL | Écrire et tester des requêtes SQL sur une base de données relationnelle fournie. | individuel | 2026-09-28 | 2026-10-12 23:59 | true |
bdd-tp1 | bdd | TP1 — Modélisation d’une bibliothèque | Concevoir un modèle relationnel et produire le script SQL permettant de créer la base de données. | equipe | 2026-10-05 | 2026-10-25 23:59 | true |
int-sprint1 | integration | Sprint 1 — Prototype fonctionnel | Produire une première version fonctionnelle du projet et préparer une démonstration à l’équipe enseignante. | equipe | 2026-09-15 | 2026-10-09 23:59 | true |
Créneaux proposés
Section intitulée « Créneaux proposés »travail_id | id du créneau | Début | Fin |
|---|---|---|---|
srv-tp1 | srv-tp1-01 | 2026-09-15 18:00 | 2026-09-15 19:30 |
srv-tp1 | srv-tp1-02 | 2026-09-16 12:00 | 2026-09-16 13:30 |
srv-tp1 | srv-tp1-03 | 2026-09-17 17:00 | 2026-09-17 18:30 |
srv-tp2 | srv-tp2-01 | 2026-10-05 18:00 | 2026-10-05 19:30 |
srv-tp2 | srv-tp2-02 | 2026-10-06 12:00 | 2026-10-06 13:30 |
srv-tp2 | srv-tp2-03 | 2026-10-07 17:00 | 2026-10-07 18:30 |
bdd-lab2 | bdd-lab2-01 | 2026-10-01 16:00 | 2026-10-01 17:30 |
bdd-lab2 | bdd-lab2-02 | 2026-10-02 12:00 | 2026-10-02 13:30 |
bdd-lab2 | bdd-lab2-03 | 2026-10-04 10:00 | 2026-10-04 11:30 |
bdd-tp1 | bdd-tp1-01 | 2026-10-13 18:00 | 2026-10-13 19:30 |
bdd-tp1 | bdd-tp1-02 | 2026-10-14 12:00 | 2026-10-14 13:30 |
bdd-tp1 | bdd-tp1-03 | 2026-10-15 17:00 | 2026-10-15 18:30 |
int-sprint1 | int-s1-01 | 2026-09-29 18:00 | 2026-09-29 20:00 |
int-sprint1 | int-s1-02 | 2026-09-30 17:00 | 2026-09-30 19:00 |
int-sprint1 | int-s1-03 | 2026-10-01 18:00 | 2026-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.
La conception orientée objet
Section intitulée « La conception orientée objet »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.
<?phpclass 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.
Accès aux disponibilités
Section intitulée « Accès aux disponibilités »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.
Contraintes techniques
Section intitulée « Contraintes techniques »- Base de données obligatoire : les cours, travaux, créneaux et disponibilités sont conservés dans
DexBDet 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
Plateformequi 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.
Livrables
Section intitulée « Livrables »- Une archive (
.zipou.rar) du projet, prête à déposer danshtdocs, contenant le code, le fichier de connexion et vos classes. - 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. - Un court
READMEexpliquant la mise en place : démarrer MySQL, exécuterinit.php(sur une base nomméeDexBD), puis l’usage de l’outil.