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
-
Télécharger cette archive et la décompresser. Étudier la structure du dossier ainsi que les fichiers
Controllers/Controller.phpetUtils/functions.php. -
Créer un fichier
credentials.phpcontenant les variables$dsn,$loginet$mdpavec les valeurs permettant de se connecter à la base de données. Dans le constructeur de la classeModel.php, inclure ce fichier pour permettre la connexion à la base de données (remplacer la valeur duincludede la ligne 26). -
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 fichiersview_begin.phpetview_end.phppour inclure le début et la fin du code HTML. -
Définir le contrôleur
home. Ce contrôleur aura comme unique action l’actionhome(action par défaut) qui consiste à afficher la page d’accueil. Pour cela, le contrôleur inclura la vuehomedéfinie précédemment. -
Modifier le fichier
index.php: ajouter le contrôleurhomeà la liste des contrôleurs et le mettre comme contrôleur par défaut (lignes 7 et 8). -
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
-
Définir le contrôleur
listdont l’actionlast(action par défaut) consiste à afficher les 25 derniers prix nobels décernés. Le rendu HTML devra être similaire à celui du scriptlast25.phpdéfini dans le TP 2. Pour l’affichage, le contrôleur appellera la vuelast(à définir). -
Modifier le routeur
index.phppour ajouter le contrôleurlistdans 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
-
Définir la vue
informationsqui, étant donné les variables$year,$category,$name,$birthdate,$birthplace,$countyet$motivation, affiche toutes les informations d’un prix nobel.Attention : pour chaque valeur
null,???doit être affiché à la place. -
Ajouter au contrôleur
listl’actioninformations. Celle-ci consiste à vérifier qu’il existe un paramètre entier dans l’url de nomid. Si ce n’est pas le cas, le contrôleur termine l’action en affichant une erreur (actionerror). 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. -
Vérifier les résultats des URL suivantes (remplacer à chaque fois
~VOTRE_NUMERO_ETUDIANT/MVC/par le chemin correct) :- http://localhost/~VOTRE_NUMERO_ETUDIANT/MVC/?controller=list (affiche les 25 derniers prix nobels)
- http://localhost/~VOTRE_NUMERO_ETUDIANT/MVC/?controller=list&action=informations (affiche une erreur)
- http://localhost/~VOTRE_NUMERO_ETUDIANT/MVC/?controller=list&action=informations&id=10000 (affiche une erreur)
- http://localhost/~VOTRE_NUMERO_ETUDIANT/MVC/?controller=list&action=informations&id=1 (affiche les informations du prix nobel d’identifiant 1)
-
Modifier la vue
lastpour que les noms des prix nobels correspondent à des liens hypertexte sur l’actioninformationsdu contrôleurlist.
Exercice 4 : Ajout d’un prix nobel
-
Définir le contrôleur
setdont l’actionform_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 vueform_add(à définir). L’affichage doit ressembler à ceci. Lors de la soumission du formulaire via la méthodepost, l’actionaddde ce contrôleur doit être appelée. -
Définir l’action
addqui 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 vuemessage) 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
-
Ajouter l’action
removeau contrôleurset. Avec cette action, le contrôleur vérifie qu’il existe dans l’url un paramètre de nomid. 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 vuemessage, 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é. -
Modifier la vue
lastafin que la table HTML contienne une colonne de plus. Les cases de cette colonne devront appartenir à la classesansBordure. Chaque case contiendra l’imageremove-icon.pngcorrespondant à un lien hypertexte sur l’action suppression du prix nobel dans la base de données. La baliseimgdevra appartenir à la classeicone.
Exercice 6 : Modification d’un prix nobel
-
Définir la vue
form_updateaffichant 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,$countyet$motivationcontenant les informations du prix nobel à modifier ainsi que la variable$categoriescontenant 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
updatedu contrôleurset(défini dans les questions suivantes). La méthode sera la méthodepost. -
Définir l’action
form_updatedu contrôleurset. Cette action détermine s’il existe un paramètre dans l’url de nomidet 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. - Définir l’action
updatedu contrôleursetqui 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 vuemessage) pour indiquer si un prix nobel a été modifié, s’il y a eu une erreur ou si aucun formulaire n’a été soumis. - Modifier la vue
lastafin que la table HTML contienne une colonne de plus. Les cases de cette colonne devront appartenir à la classesansBordure. Chaque case contiendra l’imageedit-icon.pngcorrespondant à un lien hypertexte sur l’action modification du prix nobel dans la base de données. La baliseimgdevra appartenir à la classeicone.
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 :
- http://localhost/~VOTRE_NUMERO_ETUDIANT/MVC/?controller=list&action=pagination&start=1
- http://localhost/~VOTRE_NUMERO_ETUDIANT/MVC/?controller=list&action=pagination&start=2
- http://localhost/~VOTRE_NUMERO_ETUDIANT/MVC/?controller=list&action=pagination&start=3
- http://localhost/~VOTRE_NUMERO_ETUDIANT/MVC/?controller=list&action=pagination&start=4
-
Créer la vue
paginationaffichant 25 prix nobels. Comme cette vue est en grande partie la même quelast, créer une vuelist_nobelaffichant uniquement la table HTML des prix nobels et l’inclure dans les vueslastetpagination. -
Comprendre la méthode
getNobelPrizesWithLimit($offset, $limit)du modèle retournant un tableau contenant les$limitprix 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éthodegetLast(). -
Définir l’action
paginationdu contrôleurlist. Celle-ci vérifie qu’il existe dans l’URL un paramètre de nomstartcorrespondant à 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. -
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.

Exercice 8 : Recherche dans la base de données
-
Comprendre le code de la méthode
findNobelPrizesde la classeModel. 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
$filterscontient la cléname, alors la recherche se limite aux prix nobel dont le nom contient la chaîne$filters["name"]comme sous-chaîne (conditionLIKEen SQL). -
Si le tableau
$filterscontient les clésyearetsignYear, 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
$offsetet$limitet retourne une partie des résultats en fonction de$offsetet$limit(pagination des résultats).Remarque : La méthode
findNobelPrizesretourne les mêmes résultats quegetNobelPrizesWithLimitsi le tableau$filtersest vide. -
-
Définir le contrôleur
searchdont l’actionform(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
selectpour 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 à :

-
Définir l’action
paginationdu contrôleursearch. Celle-ci affiche les résultats de la recherche avec pagination. -
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).