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.php
etUtils/functions.php
. -
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 classeModel.php
, inclure ce fichier pour permettre la connexion à la base de données (remplacer la valeur duinclude
de 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.php
etview_end.php
pour 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 vuehome
dé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
list
dont 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.php
défini dans le TP 2. Pour l’affichage, le contrôleur appellera la vuelast
(à définir). -
Modifier le routeur
index.php
pour ajouter le contrôleurlist
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
-
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. -
Ajouter au contrôleur
list
l’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
last
pour que les noms des prix nobels correspondent à des liens hypertexte sur l’actioninformations
du contrôleurlist
.
Exercice 4 : Ajout d’un prix nobel
-
Définir le contrôleur
set
dont 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’actionadd
de ce contrôleur doit être appelée. -
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 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
remove
au 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
last
afin que la table HTML contienne une colonne de plus. Les cases de cette colonne devront appartenir à la classesansBordure
. Chaque case contiendra l’imageremove-icon.png
correspondant à un lien hypertexte sur l’action suppression du prix nobel dans la base de données. La baliseimg
devra appartenir à la classeicone
.
Exercice 6 : Modification d’un prix nobel
-
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ôleurset
(défini dans les questions suivantes). La méthode sera la méthodepost
. -
Définir l’action
form_update
du contrôleurset
. Cette action détermine s’il existe un paramètre dans l’url de nomid
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. - Définir l’action
update
du contrôleurset
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 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
last
afin que la table HTML contienne une colonne de plus. Les cases de cette colonne devront appartenir à la classesansBordure
. Chaque case contiendra l’imageedit-icon.png
correspondant à un lien hypertexte sur l’action modification du prix nobel dans la base de données. La baliseimg
devra 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
pagination
affichant 25 prix nobels. Comme cette vue est en grande partie la même quelast
, créer une vuelist_nobel
affichant uniquement la table HTML des prix nobels et l’inclure dans les vueslast
etpagination
. -
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éthodegetLast()
. -
Définir l’action
pagination
du contrôleurlist
. Celle-ci vérifie qu’il existe dans l’URL un paramètre de nomstart
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. -
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
findNobelPrizes
de 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
$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 (conditionLIKE
en SQL). -
Si le tableau
$filters
contient les clésyear
etsignYear
, 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 quegetNobelPrizesWithLimit
si le tableau$filters
est vide. -
-
Définir le contrôleur
search
dont 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
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 à :
-
Définir l’action
pagination
du 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).