L3 MIASHS – Programmation web – TD 5-6 1/4 L3 MIASHS – Année 2019-2020 Programm

L3 MIASHS – Programmation web – TD 5-6 1/4 L3 MIASHS – Année 2019-2020 Programmation web TD n° 5-6 : Mise à jour de base de données, gabarits et architecture MVC J. Darmont (http://eric.univ-lyon2.fr/jdarmont/), 30/10/19 L’objectif de ce TD est de créer une interface de consultation et de saisie/suppression des données de la table MATIERE créée au TD n° 4 qui respecte l’architecture MVC. Page web modèle : http://eric.univ-lyon2.fr/jdarmont/docs/web/td56.php Vue – Étape 1 1. Copier/coller le gabarit td4.tpl.html créé lors du TD n° 4 sous le noms td56tab.tpl.html. Y ajouter un lien « Nouvelle matière » sous le tableau d’affichage. L’URL cible du lien est un champ nommé {cible} concaténé au paramètre « ?suivant=form_ajout » (« ? » indique un paramétrage en fin d’URL, « suivant » est le nom du paramètre et « form_ajout » sa valeur). L’idée est qu’après avoir cliqué sur le lien, on effectue une action « form_ajout » qui affiche un formulaire d’ajout de matière. 2. Créer un nouveau gabarit nommé td56form.tpl.html contenant un formulaire dont la description suit. a. URL cible (attribut « action ») : champ {cible}, méthode : get b. Champ caché de nom « suivant » et de valeur le champ {suivant} (cf. question 1) c. Champ texte de nom « codemat » de taille 3 et de taille maximum 3 d. Champ texte de nom « libelle » de taille 20 et de taille maximum 20 e. Champ texte de nom « coef » de taille 3 et de taille maximum 3 f. Boutons « reset » et « submit » Modèle – Étape 1 3. Créer un nouveau fichier nommé td56modele.class.php. Y inclure le fichier td4.class.php. 4. Créer une classe nommée Requete56 qui hérite de la classe Requete définie dans le TD n° 4. Il s’agit d’y surcharger la méthode afficherTab() : a. copier/coller la méthode afficherTab() de la classe Requete dans la classe Requete56 ; b. remplacer dans la méthode afficherTab() de la classe Requete56 la référence à td4.tpl.html par td56tab.tpl.html ; c. ajouter à la méthode afficherTab() de la classe Requete56, juste avant l’appel à la méthode pparse(), l’assignation à la variable {cible} de l’URL de la page courante (variable d’environnement $_SERVER["PHP_SELF"]). L3 MIASHS – Programmation web – TD 5-6 2/4 5. Créer une classe AccesMatiere contenant deux attributs privés $pdo (identifiant de connexion) et $qmat (objet de classe Requete56), un constructeur qui initialise $this->pdo à un paramètre $param_pdo et $this->qmat à la requête qui affiche la liste des matières (s’inspirer fortement de la création de la requête $qmat dans le script td4.php). 6. Ajouter à la classe AccesMatiere une méthode publique nommée liste() qui exécute la requête $this-qmat puis affiche le résultat (s’inspirer de nouveau de l’exécution et de l’affichage de la requête $qmat dans le script td4.php). On teste, enfin ! – Étape 1 7. Créer un nouveau script nommé td56.php. Y inclure les fichiers entete.inc.html, connect.inc.php, td6modele.class.php et pied.inc.html. 8. Reproduire depuis le script td4.php la structure « try/catch » avant l’inclusion de pied.inc.html, avec uniquement la partie création de l’objet PDO et initialisation de la gestion des erreurs dans la partie « try ». 9. Dans la partie « try », après la création de l’objet PDO, créer un objet $accmat de classe AccesMatiere et appeler la méthode liste() pour $accmat. 10. Téléverser les fichiers td56tab.tpl.html, td56form.tpl.html, td56modele.class.php et td56.php sur le serveur phpetu. 11. Tester l’affichage de la liste des matières en vous connectant sur td56.php. Résultat ? 12. Passer les attributs de la classe Requete dans td4.class.php de la visibilité privée à la visibilité protégée. Tester de nouveau l’affichage de la liste des matières. Une fois que cela fonctionne, supprimer l’appel à liste(). Modèle – Étape 2 13. Dans td56modele.class.php, ajouter à la classe AccesMatiere une méthode publique nommée ajouterMatiere() prenant en paramètres un code matière, un libellé et un coefficient. Cette méthode doit insérer les valeurs transmises par les paramètres dans la table MATIERE (utiliser une requête paramétrée). Contrôleur – Étape 1 14. Dans un nouveau script td56controleur.class.php, créer une classe Appli contenant une méthode publique nommée formulaire() qui prend en paramètre l’action suivante. Cette méthode doit afficher le L3 MIASHS – Programmation web – TD 5-6 3/4 gabarit de formulaire td56form.tpl.html en associant au champ « cible » $_SERVER["PHP_SELF"] et au champ « suivant » le paramètre « action suivante » de la méthode. 15. Ajouter à la classe Appli une méthode publique nommée moteur() prenant en paramètre un objet $accmat de classe AccesMatiere. Dans la méthode moteur(), définir une variable $action égale à l’action suivante demandée par l’utilisateur ($_GET["suivant"]) si cette dernière est définie, ou à une chaîne vide sinon. Pour cela, utiliser la fonction PHP isset(), qui retourne true si la variable passée en paramètre est définie. 16. Toujours dans la méthode moteur(), définir un « switch » sur la variable $action. a. Si l’action est « form_ajout », appeler la méthode formulaire() avec le paramètre « ajout » (qui représente l’action suivante). b. Si l’action est « ajout », appeler la méthode ajouterMatiere() pour $accmat en lui passant en paramètres les données transmises depuis le formulaire à l’aide de la méthode « get » (codemat, libelle et coef). Appeler ensuite la méthode liste() pour $accmat. c. L’action par défaut est l’affichage de la liste des matières, effectué en appelant la méthode liste() pour $accmat. Test – Étape 2 17. Dans le script td56.php, inclure td56controleur.class.php après td56modele.class.php. 18. Dans la partie « try », après la création de l’objet $accmat, créer un objet $appli de classe Appli en lui passant en paramètre l’identifiant de connexion. Appeler ensuite la méthode moteur() pour $appli avec comme paramètre l’objet $accmat préalablement défini. 19. Téléverser td56modele.class.php, td56controleur.class.php et td56.php sur le serveur phpetu. Tester l’ajout de quelques matières. 20. Dans td56controleur.class.php, rendre la méthode formulaire() privée. Téléverser td56controleur.class.php sur le serveur phpetu. Tester. Commentaire ? Vue – Étape 2 21. Dans le gabarit td56tab.tpl.html, ajouter aux lignes du tableau une cellule <td></td> contenant un lien « Effacer ». L’URL cible est le champ {cible} assorti des paramètres « ?suivant=suppr&codemat={ligne.codemat} » (code de la matière courante). Modèle – Étape 3 22. Dans td56modele.class.php, modifier la méthode afficherTab() de la classe Requete56, ligne « $gab->assign_block_vars("ligne", array("rien" => "")); », en remplaçant dans l’assignation « rien » par « codemat » (ce qui correspond au champ {ligne.codemat} du gabarit td56tab.tpl.html) et la chaîne vide qui suit par la valeur de codemat dans le résultat de la requête (ex. $ligne["codemat"]). L3 MIASHS – Programmation web – TD 5-6 4/4 23. Ajouter à la classe AccesMatiere une méthode publique nommée supprimerMatiere() prenant en paramètre un code matière. Cette méthode doit supprimer dans la table MATIERE le n-uplet correspondant au code matière (utiliser une requête paramétrée). Contrôleur – Étape 2 24. Dans td56controleur.class.php, ajouter l’option suivante au switch de la méthode moteur(). Si la page suivante est « suppr », appeler la méthode supprimerMatiere() pour $accmat en lui passant en paramètre le code de matière transmis par l’URL. Appeler ensuite la méthode liste() pour $accmat. Test – Étape 3 25. Téléverser td56tab.tpl.html, td56modele.class.php et td56controleur.class.php sur le serveur phpetu. 26. À partir de la page td56.php, tester la suppression de quelques matières. 27. Vérifier la validité du code HTML et CSS de tous les éléments de l’application (affichage de la table MATIERE et formulaire de saisie/modification, notamment). 28. L’utilisation de la méthode « get » est-elle la plus sûre ? Comment remédier à ses inconvénients ? 29. Récapituler en commentaire les fichiers qui appartiennent au modèle, à la vue et au contrôleur, respectivement. L3 MIASHS – Programmation web – TD 5-6 5/4 Correction : Modèle <?php // td56modele.class.php require("td4.class.php"); class Requete56 extends Requete { public function afficherTab() { // Définition du gabarit $gab = new Template("./"); $gab->set_filenames(array("body" => "td56tab.tpl.html")); // Légende $gab->assign_vars(array("nom" => $this->nom)); // Données foreach ($this->data as $ligne) { // boucle <tr> $gab->assign_block_vars("ligne", array("codemat" => $ligne["codemat"])); foreach($ligne as $val) // boucle <td> $gab->assign_block_vars("ligne.attribut", array("valeur" => $val)); } // Lien ajout/suppression de matière $gab->assign_vars(array("cible" => $_SERVER["PHP_SELF"])); // Affichage du gabarit $gab->pparse("body"); } } class AccesMatiere { private $pdo; // Identifiant de connexion private $qmat; // Requête liste des matières function __construct($param_pdo) { $this->pdo = $param_pdo; $this->qmat = new Requete56($this->pdo, "Liste des matières", "SELECT * FROM MATIERE"); } public function liste() { $this->qmat->executer(); $this->qmat->afficherTab(); } public function ajouterMatiere($codemat, $libelle, $coef) { $res = $this->pdo->prepare("INSERT INTO MATIERE VALUES(?, ?, ?)"); $res->execute([$codemat, $libelle, $coef]); } public function supprimerMatiere($codemat) { $res = $this->pdo->prepare("DELETE FROM MATIERE WHERE codemat = ?"); $res->execute([$codemat]); } } ?> L3 MIASHS – Programmation web – TD 5-6 6/4 Correction : Vue Fichiers entete.inc.html et pied.inc.html <!-- td56tab.tpl.html --> <table> <caption>{nom}</caption> <!-- BEGIN ligne --> <tr> <!-- BEGIN attribut --> <td>{ligne.attribut.valeur}</td> <!-- END attribut --> <td><a href="{cible}?suivant=suppr&codemat={ligne.codemat}"> Effacer</a></td> </tr> <!-- END ligne --> </table> <p><a href="{cible}?suivant=form_ajout">Nouvelle matière</a></p> <hr /> <!-- td56form.tpl.html --> <form action="{cible}" method="get"> <fieldset> <input type="hidden" name="suivant" value="{suivant}" /> <p> <label for="codemat">Code matière</label> <input type="text" id="codemat" name="codemat" size="3" maxlength="3" /> </p> <p> <label for="libelle">Libellé</label> <input type="text" id="libelle" name="libelle" size="20" maxlength="20" /> </p> <p> <label uploads/S4/ l3miashs-progweb-td56-unprotected.pdf

  • 31
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Jui 23, 2021
  • Catégorie Law / Droit
  • Langue French
  • Taille du fichier 0.0693MB