Ce TP correspond à la troisième partie du cours de PHP. Il concerne la génération de pages Web en utilisant l’architecture MVC. Dans ce TP, nous développons un site Web similaire à celui développé dans le TP 2 mais en utilisant cette fois-ci l’architecture MVC.

Les 5 premiers exercices du TP 2 doivent impérativement être finis avant de commencer ce TP.

Exercice 1 : Page d’accueil

  1. Télécharger cette archive et la décompresser. Étudier la structure du dossier ainsi que les fichiers Controllers/Controller.php et Utils/functions.php.

  2. Créer un fichier credentials.php contenant les variables $dsn, $login et $mdp avec les valeurs permettant de se connecter à la base de données. Dans le constructeur de la classe Model.php, inclure ce fichier pour permettre la connexion à la base de données (remplacer la valeur du include de la ligne 26).

  3. Définir la vue home. Cette vue correspond au code de la page d’accueil du TP 2. Pour afficher le nombre de prix nobels dans la base, la vue affichera la variable $nb_nobels. La vue utilisera les fichiers view_begin.php et view_end.php pour inclure le début et la fin du code HTML.

  4. Définir le contrôleur home. Ce contrôleur aura comme unique action l’action home (action par défaut) qui consiste à afficher la page d’accueil. Pour cela, le contrôleur inclura la vue home définie précédemment.

  5. Modifier le fichier index.php : ajouter le contrôleur home à la liste des contrôleurs et le mettre comme contrôleur par défaut (lignes 7 et 8).

  6. Vérifier que la page d’accueil s’affiche correctement avec les 4 URLS suivantes (remplacer à chaque fois ~VOTRE_NUMERO_ETUDIANT/MVC/ par le chemin correct) :

Exercice 2 : Affichage des 25 derniers prix nobels

  1. Définir le contrôleur list dont l’action last (action par défaut) consiste à afficher les 25 derniers prix nobels décernés. Le rendu HTML devra être similaire à celui du script last25.php défini dans le TP 2. Pour l’affichage, le contrôleur appellera la vue last (à définir).

  2. Modifier le routeur index.php pour ajouter le contrôleur list dans la liste des contrôleurs. Vérifier que les deux pages Web (la page d’accueil et la page affichant les 25 derniers prix nobels) s’affichent correctement.

Exercice 3 : Informations concernant un prix nobel

  1. Définir la vue informations qui, étant donné les variables $year, $category, $name, $birthdate, $birthplace, $county et $motivation, affiche toutes les informations d’un prix nobel.

    Attention : pour chaque valeur null, ??? doit être affiché à la place.

  2. Ajouter au contrôleur list l’action informations. Celle-ci consiste à vérifier qu’il existe un paramètre entier dans l’url de nom id. Si ce n’est pas le cas, le contrôleur termine l’action en affichant une erreur (action error). Autrement, le contrôleur vérifie s’il existe un prix nobel dans la base de données ayant cet identifiant. Il affiche alors soit les informations relatives (informations) à ce prix nobel ou une page d’erreur.

  3. Vérifier les résultats des URL suivantes (remplacer à chaque fois ~VOTRE_NUMERO_ETUDIANT/MVC/ par le chemin correct) :

  4. Modifier la vue last pour que les noms des prix nobels correspondent à des liens hypertexte sur l’action informations du contrôleur list.

Exercice 4 : Ajout d’un prix nobel

  1. Définir le contrôleur set dont l’action form_add (action par défaut) consiste à afficher le formulaire d’ajout d’un prix nobel dans la base de données. Le contrôleur utilisera pour cela la vue form_add (à définir). L’affichage doit ressembler à ceci. Lors de la soumission du formulaire via la méthode post, l’action add de ce contrôleur doit être appelée.

  2. Définir l’action add qui ajoute un prix nobel dans la base de données. Cet ajout n’est fait que si

    • $_POST["name"] est défini et n’est pas une chaîne vide ou constituée uniquement d’espaces,
    • $_POST["category"] est défini et n’est pas une chaîne vide ou constituée uniquement d’espaces,
    • $_POST["year"] est défini et correspond à un nombre entier strictement positif.

    Lors de l’ajout, si certaines valeurs ne sont pas précisées, la valeur par défaut est null. Dans tous les cas, le contrôleur affiche un message (en utilisant la vue message) pour indiquer si un prix nobel a été ajouté, s’il y a eu une erreur ou si aucun formulaire n’a été soumis.

Exercice 5 : Suppression d’un prix nobel

  1. Ajouter l’action remove au contrôleur set. Avec cette action, le contrôleur vérifie qu’il existe dans l’url un paramètre de nom id. Si c’est le cas et si sa valeur correspond à l’identifiant d’un prix nobel dans la base, le contrôleur supprime ce prix nobel. Dans tous les cas, en utilisant la vue message, le contrôleur indique s’il n’y avait pas de paramètre, s’il ne correspondait pas à un prix nobel ou si un prix nobel a été supprimé.

  2. Modifier la vue last afin que la table HTML contienne une colonne de plus. Les cases de cette colonne devront appartenir à la classe sansBordure. Chaque case contiendra l’image remove-icon.png correspondant à un lien hypertexte sur l’action suppression du prix nobel dans la base de données. La balise img devra appartenir à la classe icone.

Exercice 6 : Modification d’un prix nobel

  1. Définir la vue form_update affichant un formulaire permettant de modifier les informations d’un prix nobel. On supposera que l’on dispose des variables $id, $year, $category, $name, $birthdate, $birthplace, $county et $motivation contenant les informations du prix nobel à modifier ainsi que la variable $categories contenant les différentes catégories de prix nobel. Les informations du prix nobel devront être affichées comme valeur par défaut des différents champs de saisie.

    Attention : Lors de la soumission du formulaire, l’identifiant sera transmis comme un paramètre caché.

    Remarque : L’action appelée lors de la soumission du formulaire sera l’action update du contrôleur set (défini dans les questions suivantes). La méthode sera la méthode post.

  2. Définir l’action form_update du contrôleur set. Cette action détermine s’il existe un paramètre dans l’url de nom id et s’il correspond à un identifiant d’un prix nobel dans la base de données. Si c’est le cas, l’action affiche le formulaire de modification des informations du prix nobel. Dans le cas contraire, il affiche une erreur.

  3. Définir l’action update du contrôleur set qui modifie les informations du prix nobel. Les modifications ne seront faites que si
    • $_POST["id"] est défini et correspond à un nombre entier strictement positif,
    • $_POST["name"] est défini et n’est pas une chaîne vide ou constituée uniquement d’espaces,
    • $_POST["category"] est défini et n’est pas une chaîne vide ou constituée uniquement d’espaces,
    • $_POST["year"] est défini et correspond à un nombre entier strictement positif.

    Si certaines valeurs ne sont pas précisées, la valeur par défaut est null. Dans tous les cas, le contrôleur affiche un message (en utilisant la vue message) pour indiquer si un prix nobel a été modifié, s’il y a eu une erreur ou si aucun formulaire n’a été soumis.

  4. Modifier la vue last afin que la table HTML contienne une colonne de plus. Les cases de cette colonne devront appartenir à la classe sansBordure. Chaque case contiendra l’image edit-icon.png correspondant à un lien hypertexte sur l’action modification du prix nobel dans la base de données. La balise img devra appartenir à la classe icone.

Exercice 7 : Pagination de l’affichage de tous les prix nobels

Le but de cet exercice est d’afficher tous les prix nobels de la base de données. Vu le nombre, cet affichage sera paginé, avec 25 prix nobels affichés sur chaque page (L’affichage des prix nobels sera similaire à l’affichage des résultats de différents moteurs de recherche).

Cet affichage se fera via l’action pagination du contrôleur list. Cette action affichera une page de prix nobels. Le numéro de la page devra être donné dans l’URL par le paramètre start. Si la base contient 80 prix nobels, les URLs affichant les résultats devront être :

  1. Créer la vue pagination affichant 25 prix nobels. Comme cette vue est en grande partie la même que last, créer une vue list_nobel affichant uniquement la table HTML des prix nobels et l’inclure dans les vues last et pagination.

  2. Comprendre la méthode getNobelPrizesWithLimit($offset, $limit) du modèle retournant un tableau contenant les $limit prix nobels de la base à partir du numéro $offset.

    Remarque : La récupération des résultats se fait selon l’ordre décroissant des dates d’attribution des prix nobels. Ainsi, getNobelPrizesWithLimit(0,25) retourne le même tableau que que la méthode getLast().

  3. Définir l’action pagination du contrôleur list. Celle-ci vérifie qu’il existe dans l’URL un paramètre de nom start correspondant à un entier strictement positif (Si ce n’est pas le cas, elle prend la valeur 1). Elle affiche alors la page de prix nobels correspondante ou un message d’erreur si cette page n’existe pas.

  4. Ajouter dans la vue les liens des différentes pages (comme pour le moteur de recherche google) sous la liste des 25 prix nobels affichés. Si la page affichée est la page de résultats numéro 2, alors la liste doit ressembler à ceci.

Liens

Exercice 8 : Recherche dans la base de données

  1. Comprendre le code de la méthode findNobelPrizes de la classe Model. Cette méthode permet de rechercher les prix nobels selon certains critères. Pour cela, la méthode prend en paramètre un tableau $filters.

    • Si le tableau $filters contient la clé name, alors la recherche se limite aux prix nobel dont le nom contient la chaîne $filters["name"] comme sous-chaîne (condition LIKE en SQL).

    • Si le tableau $filters contient les clés year et signYear, et si $filters["signYear"] est égal à <=, >=, ou ==, alors la recherche se limite aux prix nobel dont l’année d’attribution est inférieure ou égale, supérieure ou égale ou égale à l’année $filters["year"].

    La méthode prend également en paramètre deux entiers $offset et $limit et retourne une partie des résultats en fonction de $offset et $limit (pagination des résultats).

    Remarque : La méthode findNobelPrizes retourne les mêmes résultats que getNobelPrizesWithLimit si le tableau $filters est vide.

  2. Définir le contrôleur search dont l’action form (action par défaut) affiche un formulaire de recherche. Celui-ci doit contenir :

    • un champ de type texte pour rechercher selon le nom,
    • un champ de type select pour choisir parmi <=, >= ou ==,
    • un champ de type texte pour entrer une année. Ce champ et le précédent doivent permettre d’effectuer une recherche selon l’année d’attribution du prix nobel.

    Le formulaire doit ressembler à :

    Formulaire de recherche

  3. Définir l’action pagination du contrôleur search. Celle-ci affiche les résultats de la recherche avec pagination.

  4. Modifier le code pour permettre de chercher également selon les catégories (0, 1 ou plusieurs catégories peuvent être utilisées dans la recherche).