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

Pratique de MySQL et PHP- P65 pot

5 193 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 226,52 KB

Nội dung

298 Chapitre 7. Production du site // Finalement on affiche la vue comme d’habitude $this−>vue−>max_films = self ::MAX_FILMS; echo $this−>vue−>render("page") ; } On effectue une boucle classique sur le résultat de la requête. Chaque passage dans la boucle correspond à une ligne dans le tableau, avec la description du film et l’affichage d’une liste de notes. Pour cette dernière, on se retrouve face au problème classique d’engendrer un champ <select> avec une liste d’options, qui constitue une imbrication très dense de valeurs dynamiques (les codes des options) et de textes statiques (les balises HTML). La solution adoptée ici est de s’appuyer sur une fonction utilitaire, implantée comme une méthode statique de la classe Template, qui produit le texte HTML à partir d’un tableau PHP. static function champSelect ($nom, $liste , $defaut , $taille =1) { $options = "" ; foreach ($liste as $val => $libelle) { // Attention aux problèmes d’affichage $val = htmlSpecialChars($val) ; $defaut = htmlSpecialChars($defaut); if ($val != $defaut) { $options .= "<option value=\"$val\">$libelle </option>\n"; } else { $options .= "<option value=\"$val\" selected=’1’> $libelle </option>\n"; } } return "<select name=’$nom ’ size =’ $taille ’>" . $options . "</ select >\n"; } Le script associé à ce formulaire reçoit donc deux tableaux PHP : d’abord$id, contenant la liste des identifiants de film ayant reçu une notation, et $notes, contenant les notes elles-mêmes. Si l’on constate que la note a changé pour un film, on exécute un UPDATE, et si la note n’existe pas on exécute un INSERT. C’est l’action noter qui se charge de cette prise en compte des notations. function noter () { $this−>controleAcces() ; // Définition du titre et de la vue $this−>vue−>titre_page = "Résultat de la notation"; $this−>vue−>setFile ("contenu" , "notation_noter . tpl"); // Boucle sur tous les films notés foreach ($_POST[ ’ i d ’ ] as $id ) { $note = $_POST[ ’notes ’ ][ $id ]; $notation = Util :: chercheNotation ($this−>session−>email , 7.3 Affichage des films et forum de discussion 299 $id , $this−>bd ) ; // On met à jour si la note a changé if (!is_object ($notation) && $note != 0) { $requete = "INSERT INTO Notation (id_film , email , note) " . " VALUES ( ’ $ i d ’ , ’ { $ t h i s −>session−>email } ’ , ’$note ’) " ; $this−>bd−>execRequete ($requete) ; } else if ( is_object ($notation) && $note != $notation−>note ) { $requete = "UPDATE Notation SET note=’$note ’ " ."WHEREemail=’{$this−>session−>email} ’ AND id_film = ’$id’"; $this−>bd−>execRequete ($requete) ; } } // Production du formulaire de recherche $this−>vue−>formulaire = $this−>formRecherche() ; echo $this−>vue−>render ("page") ; } 7.3 AFFICHAGE DES FILMS ET FORUM DE DISCUSSION Le contrôleur Film affiche toutes les informations connues sur un film, et propose un forum de discussion (une liste de messages permettant de le commenter). La présentation d’un film (voir l’exemple de la figure 7.4) est une mise en forme HTML des informations extraites de la base via PHP. Il s’agit d’un nouvel exemple de production d’une page par templates. function index () { // Définition du titre $this−>vue−>titre_page = "Affichage des films"; // Contrôle de la session $this−>controleAcces() ; // On devrait avoir reçu un identifiant if (!isSet($_REQUEST[ ’id_film ’])) { $this−>vue−>contenu = "Je ne peux pas afficher cette page: " . " il me faut un identifiant de film" ; echo $this−>vue−>render ("page") ; exit ; } // On recherche le film avec l ’id $film = Util :: chercheFilm($_REQUEST[ ’ id_film ’] , $this−>bd ) ; 300 Chapitre 7. Production du site // Si on a trouvé le film , on y va ! if ( is_object ($film)) { $this−>vue−>setFile ("contenu" , "film . tpl "); // Extraction du bloc des acteurs $this−>vue−>setBlock("contenu" , "acteur" , " acteurs"); $this−>vue−>setBlock("contenu" , "message" , "messages") ; // Il suffit de placer dans la vue les informations // nécessaires à l ’affichage du film $this−>vue−>id_film = $film−>id ; $this−>vue−>titre = $film−>titre ; $this−>vue−>genre = $film−>genre; $this−>vue−>pays = $film−>code_pays ; $this−>vue−>annee = $film−>annee ; $this−>vue−>resume = $film−>resume ; $this−>vue−>affiche = " ./ affiches /" . md5($film−>titre) . ".gif"; // La moyenne des notes $this−>vue−>moyenne = Util :: moyenneFilm ($film−>id , $this −> bd) ; // On prend le réalisateur $mes = Util :: chercheArtisteAvecId ($film−>id_realisateur , $this−>bd ) ; $this−>vue−>realisateur_prenom = $mes−>prenom ; $this−>vue−>realisateur_nom = $mes−>nom ; // Les acteurs $ re qu e te = "SELECT nom , prenom , nom_role FROM A r t i s t e a , Role r " . "WHERE a. id = r . id_acteur AND r . id_film=’$film−>id ’" ; $resultat = $this−>bd−>execRequete ($requete ) ; while ($acteur = $this−>bd−>objetSuivant ( $resultat )) { $this−>vue−>acteur_nom = $acteur−>nom ; $this−>vue−>acteur_prenom = $acteur−>prenom ; $this−>vue−>acteur_role = $acteur−>nom_role; $this−>vue−>append("acteurs" , "acteur"); } // Les messages sur le film $this−>vue−>messages = $this−>afficheMess ($film−>id , 0) ; echo $this−>vue−>render ("page") ; } } La seule nouveauté notable est la gestion d’un forum de discussion. Cette idée simple se rencontre couramment : il s’agit d’offrir aux internautes un moyen de déposer des commentaires ou des appréciations, sous la forme d’un message stocké 7.3 Affichage des films et forum de discussion 301 dans la base MySQL. De plus, afin de rendre possible une véritable discussion, on donne la possibilité de répondre à des messages déjà entrés. Figure 7.4 — Présentation d’un film Les messages constituent donc une hiérarchie, un message étant fils d’un autre s’il lui répond. La table stockant les messages doit contenir l’identifiant du film, l’e-mail de l’internaute qui a saisi le message, l’identifiant éventuel du message dont il est le fils, et bien entendu le sujet, le texte et la date de création du commentaire. Voici le script de création de la table, qui se trouve dans le fichier ComplFilms.sql. CREATE TABLE Message ( id INT NOT NULL, id_pere INT DEFAULT 0, id_film INTEGER (50) NOT NULL, sujet VARCHAR (30) NOT NULL, texte TEXT NOT NULL, date_creation INT , email_createur VARCHAR(40) NOT NULL, PRIMARY KEY (id), FOREIGN KEY (email_createur) REFERENCES Internaute); Les messages de plus haut niveau (ceux qui ne constituent pas une réponse) auront un id_pere nul, comme l’indique la clause DEFAULT. La saisie des messages s’effectue dans un formulaire produit par l’action message du contrôleur Film. Cette action s’attend à recevoir le titre du film, et éventuelle- ment l’identifiant du message auquel on répond. Dans ce dernier cas on n’affiche pas le sujet qui reprend celui du message-père, et qui est inclus dans un champ caché. function message() { // Définition du titre $this−>vue−>titre_page = "Ajout d ’un message" ; 302 Chapitre 7. Production du site // Contrôle de la session $this−>controleAcces() ; // Vérification des valeurs passées au script if ( empty($_REQUEST[ ’id_film ’])) { $this−>vue−>contenu = "<b>Il manque des informations ?! </b>\n" ; } else { // Ce message est− il le fils d ’un autre message ? if (! isSet ($_REQUEST[ ’id_pere ’ ]) ) { $id_pere = "" ; } else { $id_pere = $_REQUEST[ ’id_pere ’ ]; } // Création du formulaire $f = new Formulaire("post" , "? ctrl=film&amp; action=inserer "); // Champs cachés: email , titre du film , id du message père $f−>champCache ("email_createur" , $this−>session−>email ) ; $f−>champCache ("id_film" , $_REQUEST[ ’id_film ’ ]) ; $f−>champCache (" id_pere" , $id_pere); // Tableau en mode vertical $f−>debutTable() ; // S’il s’agit d’une réponse: on n’affiche pas le sujet if ($id_pere == "" or $id_pere == 0) { $f−>champTexte (" Sujet " , " sujet " , " " , 30) ; } else { $f−>ajoutTexte ("<h3>Réponse au message <i>" . $_REQUEST [ ’ s u j e t ’ ] . " </ i > </h3>\n " ) ; $f−>champCache ( " s u j e t " , $_REQUEST [ ’ s u j e t ’ ] ) ; } $f−>champFenetre ("Message" , " texte " , "" , 4, 50) ; $f−>finTable() ; $f−>champValider ("Enregistrer le message" , "valider"); // Affichage du formulaire $this−>vue−>formulaire = $f−>formulaireHTML () ; $this−>vue−>id_film = $_REQUEST[ ’id_film ’ ]; $this−>vue−>email_createur = $this−>session−>email ; $this−>vue−>id_pere = $id_pere ; $this−>vue−>setFile ("contenu" , "film_message . tpl ") ; } echo $this−>vue−>render ("page") ; } . dense de valeurs dynamiques (les codes des options) et de textes statiques (les balises HTML). La solution adoptée ici est de s’appuyer sur une fonction utilitaire, implantée comme une méthode. moyen de déposer des commentaires ou des appréciations, sous la forme d’un message stocké 7.3 Affichage des films et forum de discussion 301 dans la base MySQL. De plus, afin de rendre possible. AFFICHAGE DES FILMS ET FORUM DE DISCUSSION Le contrôleur Film affiche toutes les informations connues sur un film, et propose un forum de discussion (une liste de messages permettant de le commenter).

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