TW3 2021-2022 : première session
Votre session est enregistrée : vous n'avez pas le droit de communiquer avec d'autres étudiants ou avec des personnes extérieures, le travail doit être fait SEUL. Vous avez le droit de consulter les documentations des différents langages, les supports de cours, le code que vous avez réalisé lors des TPs ainsi que de faire des recherches google. La seule interdiction consiste à ne communiquer avec personne.
Rendu du devoir (11h30)
Vous devez déposer votre code dans un fichier zip sur ecampus avant 11h30 (attention, ecampus n'acceptera aucun fichier après).

Voici une archive contenant les fichiers nécessaires pour faire le TP :

Télécharger les fichiers du TP

Cet examen est constitué de deux parties indépendantes. S'il y a des problèmes avec dev-NUMETU, vous pouvez utiliser php -S comme vu en cours.

Affichage de notes d'examens

On dispose d'un fichier de notes au format CSV, contenant en première ligne les intitulés des UEs puis la liste des notes de chaque étudiant.e (une personne par ligne).

Pour cet exercice on ne vous demande pas de mettre en place une architecture MVCR.

La page HTML produite par votre programme DOIT être valide avec le validateur du W3C.

Écrire un programme PHP qui lit le fichier CSV donné et affiche une page HTML contenant les résultats des étudiants suivis de la moyenne des notes de l'étudiant.e.

Détails à implémenter :

Exemple de rendu pour l'exercice 1
Exemple de rendu pour l'exercice 1

Application pour choisir des groupes de projets

Pour cet exercice, vous disposez d'une version simplifiée de l'application avec laquelle vous avez choisi vos groupes pour le projet. Le stockage des données est fait avec ObjectFileDB. Le but sera de remplir les trous afin de rendre l'application fonctionnelle à minima.

L'architecture de cette application est légèrement différente de celle vue en TP : c'est le contrôleur qui a une fonction main qui est appelée dans index.php.

Vous ne devez modifier que les endroits dans lesquels figurent un //TODO sauf quand c'est explicitement demandé.

Routeur

Modifiez la fonction route() du routeur pour que la page s'affichant par défaut soit celle listant tous les cours.
Modifiez la fonction route() du routeur pour que lorsque l'on clique sur un cours la page s'affichant soit la liste des projets de ce cours et pour que lorsque l'on clique sur un projet sur cette dernière la page avec la liste des groupes de ce projet s'affiche.

Attention à bien gérer les cas où les id ne sont pas passés en paramètres.

Stockage

Les objets sont stockés dans 4 fichiers qui sont dans le répertoire DB_DIR (par défaut db/), ils sont manipulés dans la classe FileStorage. Vous pouvez réinitialiser ces bases en appelant la fonction statique init de la classe.

Complétez la fonction getStudentByEmail de la classe FileStorage pour qu'elle renvoie l'étudiant avec cet email ou null sinon.
Complétez les fonctions addStudentToGroup et removeStudentFromGroup qui doivent respectivement ajouter et supprimer un étudiant d'un groupe. Il est conseillé d'utiliser la fonction getStudentGroup et de lire les définitions de classes Student et Group avant de commencer à coder. Vous ferez également attention au cas où l'étudiant appartient déjà à un groupe, auquel cas il faut renvoyer une erreur.

Contrôleur

L'application n'est pas faite pour les utilisateurs non connectés, pour simplifier l'exercice, l'utilisateur "connecté" est défini par la méthode setIdentity du controleur et est stocké dans $this->student. Vous pouvez modifier setIdentity à des buts de tests.

Les méthodes addStudentToGroup et removeStudentFromGroup du contrôleur doivent respectivement ajouter et supprimer un étudiant à un groupe, complétez-lez sans vous soucier des droits mentionnés dans les commentaires. Pour addStudentToGroup vous ferez attention au cas où l'utilisateur appartient déjà à un groupe, il faudra alors l'enlever de son groupe précédent avant de l'ajouter à son nouveau groupe.
Vous pourrez tester ces fonctions grâce sur l'étudiant connecté par setIdentity, la vue groupList permettant à l'étudiant connecté de :
Les étudiants ont un statut que vous pouvez récupérer avec la méthode getUserLevel de Student. Vous devrez veiller à ce que les actions autorisées soient différentes en fonction du statut de l'étudiant connecté : seuls les étudiants ayant le statut admin peuvent ajouter ou retirer un autre étudiant d'un groupe. Dans les utilisateurs par défaut, seul Zoro est un admin.

Vue

Créez une nouvelle vue AdminView héritant de View qui sera utilisée quand l'étudiant connecté est un admin, cette vue doit ajouter la possibilité de retirer n'importe quel étudiant de n'importe quel groupe.