Editions ENI PHP 5.4 Développez un site web dynamique et interactif Collection Ressources Informatiques Extrait
183 Chapitre 7 Gérer les formulaires 1. Vue d'ensemble Gérer les formulaires 1.1 Petit rappel sur les formulaires Le formulaire est un outil de base indispensable pour les sites Web dynamiques puisqu'il permet à l'utilisateur de saisir des informations et donc d'interagir avec le site. Un formulaire HTML est défini entre les balises <form> et </form>. Syntaxe simplifiée <form [ action="url_de_traitement" ] [ method="get" "POST" ] [ id="identifiant_formulaire" ] [ target="cible" ]>... </form> Les attributs de la balise <form> sont les suivants : action URL (Uniform Resource Locator) relative ou absolue qui va traiter le formulaire, en ce qui nous concerne, un script PHP. Cet attribut est obligatoire pour se conformer à la recommandation XHTML stricte.
184 PHP 5.4 Développez un site web dynamique et interactif method id target Mode de transmission vers le serveur des informations saisies dans le formulaire. GET (valeur par défaut) : les données du formulaire sont transmises dans l URL. POST : les données du formulaire sont transmises dans le corps de la requête. Identifiant du formulaire. Si la page HTML contient plusieurs formulaires, l'identifiant permet de les différencier. En ce qui nous concerne, cet identifiant ne présente pas d intérêt car il n est pas récupéré dans le script de traitement du formulaire. Par contre, il peut être utilisé côté client, en JavaScript par exemple. Cible (par exemple une autre fenêtre) dans laquelle ouvrir l'url cible. Entre les balises <form> et </form>, il est possible de placer des balises <input>, <select> ou <textarea> pour définir des zones de saisie. Exemple (formulaire HTML complet) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>saisie</title> </head> <body> <form action="" method="post"> <div> Nom : <input type="text" name="nom" value="" size="20" maxlength="20" /> Mot de passe : <input type="password" name="mot_de_passe" value="" size="20" maxlength="20" /> <br />Sexe : <input type="radio" name="sexe" value="m" />Masculin <input type="radio" name="sexe" value="f" />Féminin <input type="radio" name="sexe" value="?" checked="checked" />Ne sait pas <br />Photo : <input type="file" name="photo" value="" size="50" /> <br />Couleurs préférées : <input type="checkbox" name="couleurs[bleu]" />Bleu <input type="checkbox" name="couleurs[blanc]" />Blanc Editions ENI - All rights reserved
Gérer les formulaires Chapitre 7 185 <input type="checkbox" name="couleurs[rouge]" />Rouge <input type="checkbox" name="couleurs[pas]" checked="checked" />Ne sait pas <br />Langue : <select name="langue"> <option value="e">espagnol</option> <option value="f" selected="selected" >Francais</option> <option value="i">italien</option> </select> <br />Fruits préférés :<br /> <select name="fruits[]" multiple="multiple" size="8"> <option value="a">abricots</option> <option value="c">cerises</option> <option value="f">fraises</option> <option value="p">pêches</option> <option value="?" selected="selected"> Ne sait pas</option> </select> <br />Commentaire :<br /> <textarea name="commentaire" rows="4" cols="50"></textarea> <br /> <input type="hidden" name="invisible" value="123" /><br /> <input type="submit" name="soumettre" value="ok" /> <input type="image" name="valider" src="valider.gif" /> <input type="reset" name="effacer" value="effacer" /> <input type="button" name="action" value="ne fait rien" /> </div> </form> </body> </html>
186 PHP 5.4 Développez un site web dynamique et interactif Résultat 1.2 Interaction entre un formulaire et un script PHP PHP peut intervenir à deux endroits par rapport au formulaire : Pour la construction du formulaire, si ce dernier doit contenir des informations dynamiques. Pour le traitement du formulaire (c'est-à-dire des données saisies par l'utilisateur dans le formulaire). Trois grandes méthodes sont utilisables pour faire interagir un formulaire et un script PHP : Placer le formulaire dans un document HTML "pur" (.htm ou.html), le formulaire ne contient alors aucun élément dynamique, et indiquer le nom du script PHP qui doit traiter le formulaire dans l'attribut action de la balise <form>. Placer le formulaire dans un script PHP (par exemple, pour construire une partie du formulaire dynamiquement) et faire traiter le formulaire par un autre script PHP (mentionné dans l'attribut action de la balise <form>). Editions ENI - All rights reserved
Gérer les formulaires Chapitre 7 187 Placer le formulaire dans un script PHP (par exemple, pour construire une partie du formulaire dynamiquement), et le faire traiter par le même script PHP (mentionné dans l'attribut action de la balise <form> ou appelé par défaut si cet attribut n'est pas présent). Par ailleurs, quelque part sur une autre page, un lien (Saisie par exemple) peut être inséré pour appeler le formulaire de saisie : Formulaire HTML : <a href="saisie.htm">saisie</a> Formulaire PHP : <a href="saisie.php">saisie</a> Première méthode Document HTML saisie.htm <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>saisie</title></head> <body> <form action="traitement.php" method="post"> <div> Nom : <input type="text" name="nom" value="" /> <input type="submit" name="ok" value="ok" /> </div> </form> </body> </html> Script PHP traitement.php <?php /* A faire... - récupérer les informations saisies - faire le traitement - afficher une nouvelle page */?> Résultat Affichage initial du formulaire :
188 PHP 5.4 Développez un site web dynamique et interactif Saisie d une information : Le résultat du clic sur le bouton OK est une page vide, car, pour l instant, le script de traitement ne fait rien. Deuxième méthode Document PHP saisie.php Un peu de code PHP (en gras) est utilisé pour générer une partie dynamique du formulaire. <?php // Inclure un fichier qui contient des définitions de // constantes, dont le titre de la page (TITRE_PAGE_SAISIE). require('constantes.inc'); // Initialisation d'une variable qui contient la valeur // initiale de la zone de saisie (dans la pratique, cette // valeur vient sans doute d'ailleurs et n'est pas codée // en dur). $nom = 'X'; // Dans le code HTML qui suit, inclusion de deux petits // bouts de code PHP pour afficher respectivement le titre // de la page et la valeur initiale de la zone de saisie.?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title><?php echo TITRE_PAGE_SAISIE;?></title> </head> <body> <form action="traitement.php" method="post"> <div> Nom : <input type="text" name="nom" value="<?php echo $nom;?>" /> <input type="submit" name="ok" value="ok" /> </div> </form> </body> </html> Editions ENI - All rights reserved
Editions ENI Magento Réalisez des développements professionnels avec PHP Collection Expert IT Extrait
143 Chapitre 3 Surcharge des classes existantes 1. Objectif Surcharge des classes existantes Pour adapter les fonctionnements natifs de Magento à vos besoins, il vous faut modifier les codes de Magento. Pour modifier ces codes, vous devez avoir recours à la surcharge du core de Magento en créant un nouveau module, car il ne faut jamais écrire vos codes directement dans le core de Magento (dossier /app/code/core/). Si vous écrivez vos codes directement dans le core de Magento, ils risqueront d'être écrasés lors d'une mise à jour de la version de Magento. Magento vous permet de surcharger les contrôleurs, les blocks, les modèles et les helpers en modifiant les méthodes existantes (en ne réécrivant dans les fichiers de surcharge que les méthodes modifiées), ou en ajoutant d autres méthodes. Ce chapitre vous guidera dans les surcharges de ces différents éléments d un module.
144 Magento Réalisez des développements professionnels avec PHP 2. Surcharge d'un contrôleur La surcharge d une classe dans Magento se fait dans un nouveau module. Donc avant de commencer la surcharge, vous devez créer un nouveau module et passer par la déclaration. /app/etc/modules/espacedenoms_nommodule.xml <?xml version="1.0"?> <config> <Espacedenoms_Nommodule> <active>true</active> <codepool>local</codepool> </Espacedenoms_Nommodule> </config> 2.1 Surcharge d un contrôleur en front office Une fois le module déclaré, créez votre fichier de configuration config.xml : app/code/local/espacedenoms/nommodule/etc/config.xml <?xml version="1.0"?> <config> <Espacedenoms_Nommodule> <version>0.1.0</version> </Espacedenoms_Nommodule> <frontend> <routers> <nommodule> <use>standard</use> <args> <module>espacedenoms_nommodule</module> <frontname>nommodule</frontname> </args> </nommodule> </routers> </frontend> Editions ENI - All rights reserved
Surcharge des classes existantes Chapitre 3 145 <global> <rewrite> <espacedenoms_nommodule_nomcontroleur> <from><![cdata[#^/nommodule1/chemin_vers_controleur1/#]]></from> <to>/nommodule/chemin_vers_controleur/</to> </espacedenoms_nommodule_nomcontroleur> </rewrite> </global> </config> Dans le nœud rewrite : Le nœud espacedenoms_nommodule_nomcontroleur est l identifiant de la réécriture, il doit être unique. Le nœud from permet de renseigner le contrôleur à surcharger. nommodule1 est le frontname du module dont le contrôleur est à surcharger et chemin_vers_controleur1 est le chemin vers le contrôleur à surcharger. Le nœud to permet de renseigner le contrôleur de surcharge. nommodule est le frontname et chemin_vers_controleur est le chemin vers le contrôleur. Pour la création de votre fichier de configuration, vous pouvez aussi choisir d utiliser le code ci-après : <config> <Espacedenoms_Nommodule> <version>0.1.0</version> </Espacedenoms_Nommodule> <frontend> <routers> <nommoduleasurcharger> <args> <Espacedenoms_Nommodule_Nommoduleasurcharger before="mage_nommoduleasurcharger">espacedenoms_nommodule_ Nommoduleasurcharger</Espacedenoms_Nommodule_ Nommoduleasurcharger> </args> </nommoduleasurcharger> </routers>
146 Magento Réalisez des développements professionnels avec PHP </frontend> </config> Nommoduleasurcharger ou nommoduleasurcharger : correspond au nom du module contenant le contrôleur à surcharger. Pour la suite, créez le contrôleur : /app/code/local/espacedenoms/nommodule/controllers/nomcontroleur- Controller.php <?php require_once 'Chemin/Vers/Module/A/Surcharger/NomcontroleurController.php'; class Espacedenoms_Nommodule_NomcontroleurController extends Nom_De_Classe_Du_Controleur_A_Surcharger { // Ecrire ici les méthodes que vous voulez modifier // Vous pouvez aussi ajouter d'autres méthodes ici } Vous devez inclure le contrôleur à surcharger en faisant appel à la méthode require_once. La classe du contrôleur à créer doit aussi étendre la classe du contrôleur à surcharger. Pour mieux comprendre, passons tout de suite à l exemple. Surcharge d un contrôleur en front office Le comportement natif de Magento permet d ajouter au comparateur un produit de type configurable et de type groupé. Nous allons modifier ce comportement en empêchant les produits ayant ces deux types d être ajoutés au comparateur. Pour cela, nous allons surcharger le contrôleur dans Mage/Catalog/controllers/Product/CompareController.php pour la modification de la méthode addaction. Editions ENI - All rights reserved
Surcharge des classes existantes Chapitre 3 147 Déclaration du module /app/etc/modules/mongroupe_monmodule.xml <?xml version="1.0"?> <config> <Mongroupe_Monmodule> <active>true</active> <codepool>local</codepool> </Mongroupe_Monmodule> </config> Création du fichier de configuration config.xml Vous pouvez choisir entre les deux fichiers de configuration suivants : /app/code/local/mongroupe/monmodule/etc/config.xml <?xml version="1.0"?> <config> <Mongroupe_Monmodule> <version>0.1.0</version> </Mongroupe_Monmodule> <frontend> <routers> <monmodule> <use>standard</use> <args> <module>mongroupe_monmodule</module> <frontname>monmodule</frontname> </args> </monmodule> </routers> </frontend> <global> <rewrite> <mongroupe_monmodule_catalog_product_compare> <from><![cdata[#^/catalog/product_compare/#]]></from> <to>/monmodule/catalog_product_compare/</to> </mongroupe_monmodule_catalog_product_compare>
148 Magento Réalisez des développements professionnels avec PHP Ou </rewrite> </global> </config> /app/code/local/mongroupe/monmodule/etc/config.xml <config> <Nomgroupe_Nommodule> <version>0.1.0</version> </Nomgroupe_Nommodule> <frontend> <routers> <catalog><!-- correspond au module Mage_Catalog --> <args> <Mongroupe_Monmodule_Catalog before="mage_catalog"> Mongroupe_Monmodule_Catalog </Mongroupe_Monmodule_Catalog> </args> </catalog> </routers> </frontend> </config> Création du contrôleur /app/code/local/mongroupe/monmodule/controllers/catalog/product/ CompareController.php <?php require_once("mage/catalog/controllers/product/comparecontroller. php"); class Mongroupe_Monmodule_Catalog_Product_CompareController extends Mage_Catalog_Product_CompareController { /** * Add item to compare list */ public function addaction() Editions ENI - All rights reserved