1. Trang chủ
  2. » Công Nghệ Thông Tin

Pratique de MySQL et PHP- P60 ppt

5 104 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 214,09 KB

Nội dung

6.4 Structure d’une application MVC : le modèle 273 // Parcours des attributs pour créer la requête foreach ($this−>schema as $nom => $options) { // Liste des noms d ’ attributs + liste des valeurs ( attention aux ’) $noms .= $virgule . $nom; $valeur = $this−>bd−>prepareChaine($this−>donnees [$nom]) ; $valeurs .= $virgule . " ’$valeur ’"; // A partir de la seconde fois , on sépare par des virgules $virgule= " ,"; } $requete = "INSERT INTO $this−>nom_table($noms) VALUES ( $valeurs) "; $this−>bd−>execRequete ($requete ) ; } La fonction de mise à jour est similaire ; je vous laisse la consulter dans le code lui-même. Nous voici équipés avec un cadre pré-établi pour réaliser la partie Modèle d’une application. Outre l’intérêt de disposer de fonctionnalités prêtes à l’emploi, ce qui peut déjà économiser du développement, cette approche a aussi le mérite de normaliser les méthodes de programmation, avec gain de temps là encore quand on consulte le code. 6.4.2 Un exemple complet de saisie et validation de données Montrons pour conclure ce chapitre comment réaliser une fonctionnalité complète MVC, incluant une partie Modèle pour communiquer avec la base de données. L’exemple choisi est celui de l’inscription d’un internaute sur le site. On demande de saisir ses données personnelles dans un formulaire, y compris un mot de passe d’accès au site, pour lequel on demande une double saisie. La validation de ce formulaire entraîne une insertion dans la base. La figure 6.8 montre le formulaire d’inscription. Figure 6.8 — Formulaire d’inscription sur le site 274 Chapitre 6. Architecture du site: le pattern MVC Le contrôleur en charge des fonctionnalités d’inscription est inscription. L’ac- tion par défaut (index) affiche le formulaire de la figure 6.8. Voici son code. function index () { // On affecte le titre et on charge le contenu $this−>vue−>titre_page = "Inscription"; $this−>vue−>setFile ("contenu" , " inscription . tpl ") ; // On instancie la classe TableBD sur ’Internaute ’ $tbl_inter = new Internaute ($this−>bd ) ; // Production du formulaire en insertion $this−>vue−>formulaire = $tbl_inter−>formulaire(TableBD :: INS_BD , "inscription", "enregistrer"); echo $this−>vue−>render("page") ; } On instancie un objet $tbl_inter de la classe Internaute (le fichier Internaute.php se trouve dans application/modeles). Cette classe est une sous-classe de TableBD, hérite de toutes ses fonctionnalités et en redéfinit quelques-unes pour s’adapter aux spécificités de manipulation des données de la table Internaute. La première particularité est le constructeur. Comme on sait sur quelle table s’appuie la classe, on peut passer son nom « en dur » au constructeur de TableBD, ce qui donne le code ci-dessous. class Internaute extends TableBD { // Le constructeur de la classe . On appelle // simplement le constructeur de la super− classe. // en lui passant le nom de la table visée. function __construct($bd) { // Appel du constructeur de IhmBD parent :: __construct("Internaute" , $bd) ; } La seconde particularité est le formulaire de saisie. On ne peut pas se contenter du formulaire générique proposé par TableBD car il faut demander deux fois le mot de passe à l’utilisateur afin d’avoir confirmation qu’il n’a pas commis d’erreur de saisie. Il faut donc redéfinir dans Internaute la méthode Formulaire() qui vient remplacer (« surcharger » est le terme juste) celle héritée de TableBD. Nous avons déjà vu à plusieurs reprises comment produire des formulaires de saisie, je vous laisse consulter cette méthode dans le code. Rappelons que dans une application de base de données, une grande partie des formulaires est destinée à effectuer des opérations d’insertion ou de mise à jour sur les tables. Bien entendu, il faut éviter d’utiliser un formulaire distinct pour chacune 6.4 Structure d’une application MVC : le modèle 275 de ces opérations et nous utilisons donc la technique détaillée dans le chapitre 2, page 78, pour adapter la présentation des champs en fonction du type d’opération effectué. Passons à la mise à jour. Ici encore les fonctions génériques fournies par TableBD ne suffisent pas. C’est notamment le cas de la méthode controle() qui comprend de nombreux contrôles complémentaires de ceux effectués dans la méthode générique. La complémentarité implique que la méthode de la super-classe doit être appelée en plus des contrôles ajoutés dans la méthode spécialisée. Cela se fait en plaçant expli- citement un appel parent::controle dans le code, comme montré ci-dessous : function controle () { // Initialisation de la liste des messages d’erreur $this−>erreurs = array () ; // On vér if ie que les champs importants ont été saisis if ($this−>donnees[ ’email ’]=="") $this−>erreurs [] = "Vous devez saisir votre e−mail !" ; else if (!$this−>controleEmail($this−>donnees[ ’email ’]) ) $this−>erreurs [] = "Votre e−mail doit être de la forme xxx@yyy [. zzz ] ! " ; // Contrôle sur le mot de passe if (isSet ($this−>donnees[ ’mot_de_passe ’]) ) { if ($this−>donnees[ ’mot_de_passe ’]=="" or $_POST[ ’conf_passe ’]=="" or $_POST[ ’conf_passe ’ ] != $this−>donnees [ ’ mot_de_passe ’ ]) $this−>erreurs [] .= "Vous devez saisir un mot de passe " . " et le confirmer à l ’identique!" ; } if (! isSet ($this−>donnees [ ’ region ’ ]) or empty ($this−>donnees [ ’region ’])) $this−>erreurs [] .= "Vous devez saisir votre région !" ; if ($this−>donnees [ ’annee_naissance ’]=="") $this−>erreurs [] .= "Votre année de naisance est incorrecte!"; if ($this−>donnees [ ’prenom ’ ]==" " ) $this−>erreurs [] .= "Vous devez sai s i r votre prénom ! " ; if ($this−>donnees [ ’nom’]=="") $this−>erreurs [] .= "Vous devez saisir votre nom !" ; // Appel aux contrôles de la méthode générique parent :: controle() ; if ( count($this−>erreurs) > 0) { return false ; } else { return true ; } } 276 Chapitre 6. Architecture du site: le pattern MVC On peut toujours ajouter ou raffiner des contrôles. Vous pouvez vous reporter à la section consacrée à la validation des formulaires, page 86, pour un exposé des différentes vérifications nécessaires. Une autre méthode modifiée par rapport à la méthode générique est insertion(). Le seul ajout est le hachage du mot de passe avec la fonction MD5, afin de ne pas l’insérer en clair dans la base. function insertion() { // On insère le mot de passe haché $this−>donnees[ ’mot_de_passe ’] = md5 ($this−>donnees [ ’ mot_de_passe ’ ]) ; // Il ne reste plus qu’à appeler la méthode d’ insertion héritée parent :: insertion() ; } Pour finir, voici l’action enregistrer du contrôleur Inscription. C’est cette action qui est appelée quand on valide le formulaire. function enregistrer () { // Idem que précédemment $this−>vue−>titre_page = "Résultat de votre inscription"; $tbl_inter = new Internaute ($this−>bd ) ; // On crée un objet à partir des données du tableau HTTP $tbl_inter−>nouveau($_POST) ; // Contrôle des variables passées en POST if ( $tbl_inter−>controle () == false){ $messages = $tbl_inter −>messages () ; // Erreur de saisie détectée : on affiche le message // et on réaffiche le formulaire avec les valeurs saisies $this−>vue−>contenu = "<b>$messages </b>\n" . $tbl_inter−>formulaire (TableBD::INS_BD, "inscription", "enregistrer"); } else { // On va quand même v éri fier que cet email n’ est pas déjà // inséré if ($inter = $tbl_inter−>chercheLigne($_POST)) { $this−>vue−>contenu = "Un internaute avec cet email existe déjà " . $tbl_inter −>formulaire (TableBD::INS_BD, "inscription " , "enregistrer"); } else { $tbl_inter−>insertion(); 6.4 Structure d’une application MVC : le modèle 277 // Message de confirmation $this−>vue−>contenu = "Vous êtes bien enregistré avec l ’ email " . "<b>$tbl_inter −>email </b>. Bienvenue!< br /> " . "Vous pouvez maintenant vous connecter au site . " ; } } // Finalement , on affiche la vue comme d’habitude echo $this−>vue−>render("page"); } Après initialisation d’une instance de la classe Internaute, l’action débute par l’exécution de la méthode controle(). Si une erreur est détectée, un message est constitué et on réaffiche le formulaire en reprenant, pour valeurs par défaut, les saisies présentes dans le tableau $_POST. Sinon, on vérifie que l’e-mail n’existe pas déjà, puis on insère. 6.4.3 Pour conclure Ce dernier exemple a montré de manière complète l’interaction des trois composants du MVC. La structuration en contrôleurs et actions permet de situer facilement le déroulement d’une suite d’actions (ici, saisie, mise à jour) et fournit une initialisation de l’environnement (comme la connexion à la base) qui épargne au programmeur les instructions répétitives. La vue est en charge de la sortie HTML, et on constate que les actions ne contiennent plus aucune balise HTML. Le modèle, au moins dans la prise en compte de la persistance, fournit encore des fonctionnalités toutes prêtes qui limitent la taille du code et facilitent sa compréhension. Convaincu(e) ? Comme tout concept un peu avancé, le MVC demande un peu de pratique et un délai d’assimilation. Cet effort en vaut vraiment la peine, et ce chapitre avait pour but de vous proposer une introduction la plus douce possible, tout en montrant une implantation réaliste. Prenez le temps d’analyser soigneusement la fonctionnalité d’inscription pour bien comprendre les interactions entre les différents composants. Le découpage induit par le MVC est logique, cohérent, et mène à des fragments de code tout à fait maîtrisables par leur taille et leur complexité limitée. Le reste du site est constitué d’actions qui peuvent s’étudier isolément, indépen- damment les unes des autres et indépendamment du contexte MVC. Encore une fois, récupérez le code du site, étudiez-le et modifiez-le. Quand vous aurez assimilé les principes, vous pourrez passer à des fonctionnalités plus poussées et à des frameworks de développement plus robustes. En ce qui concerne la complexité du développement MVC, il faut prendre conscience que les objets Internaute manipulés pour l’inscription sont très simples et correspondent à la situation élémentaire où la correspondance établie par le modèle associe un objet (instance de la classe Internaute) à une seule ligne d’une table (Internaute). C’est un cas de mapping (correspondance entre deux représenta- tions) trivial. Vous trouverez dans le code du site une version plus complexe d’un . l’intérêt de disposer de fonctionnalités prêtes à l’emploi, ce qui peut déjà économiser du développement, cette approche a aussi le mérite de normaliser les méthodes de programmation, avec gain de temps. héritée de TableBD. Nous avons déjà vu à plusieurs reprises comment produire des formulaires de saisie, je vous laisse consulter cette méthode dans le code. Rappelons que dans une application de base. notamment le cas de la méthode controle() qui comprend de nombreux contrôles complémentaires de ceux effectués dans la méthode générique. La complémentarité implique que la méthode de la super-classe

Ngày đăng: 06/07/2014, 00:20

TỪ KHÓA LIÊN QUAN