158 Chapitre 3. Programmation objet libellé, on a recours à un ensemble de méthodes privées un peu plus important. Tout d’abord, il existe une méthode dédiée à chaque type de champ (input, select,etc.) qui se charge de construire la balise HTML correctement. Ensuite toute demande de création d’un champ passe par la méthode champLibelle() qui choisit d’abord (flèche 1), en fonction de la demande, la méthode de création de champ spécialisée, puis crée le composant avec le champ et le libellé (flèche 2). Voyons maintenant dans le détail le code de la classe, en commençant par les propriétés. class Formulaire { // Partie priv´ee : les propri´et´es et les constantes const VERTICAL = 1; const HORIZONTAL = 2; // Propri´et´es de la balise <form> private $methode, $action, $nom, $transfertFichier=FALSE; // Propri´et´es de pr´esentation private $orientation="", $centre=TRUE, $classeCSS, $tableau ; // Propri´et´es stockant les composants du formulaire private $composants=array(), $nbComposants=0; On trouve donc : • les paramètres à placer dans la balise ouvrante <form>,avecmethode qui peut valoir get ou post, action, le nom du script à déclencher sur validation du formulaire, transfertFichier qui indique si le formulaire permet ou non de transférer des fichiers, et le nom du formulaire qui peut être utilisé pour les contrôles Javascript ; • les propriétés déterminant la présentation du formulaire, avec orientation, qui peut être soit VERTICAL,soitHORIZONTAL, deux constantes locales à la classe, soit la chaîne vide qui indique qu’on n’est pas en mode table. La variable booléenne centre indique si le formulaire doit être centré dans la page HTML. Enfin une variable tableau, correspondant à un objet de la classe Tableau qui va nous aider à mettre en forme les champs ; • la représentation des composants : un simple tableau, et le nombre de compo- sants créés à un moment donné. Bien entendu, comme toutes les classes objet, celle-ci ne demande qu’à être complétée. Des suggestions en ce sens sont proposées dans le polycopié d’exercices. Constructeur Le constructeur de la classe Formulaire se contente d’initialiser les attributs, notamment ceux qui seront par la suite placés dans la balise ouvrante <form>. Deux d’entre eux sont obligatoires : la méthode employée (qui est en général post) 3.3 La classe Formulaire 159 et le nom du script associé au formulaire. Les paramètres optionnels indiquent si le formulaire doit être centré, la classe CSS définissant la présentation (cette classe n’est pas utilisée dans la version présentée ici), et le nom du formulaire. function Formulaire ($methode , $action , $centre=true , $classe="Form" , $nom="Form" ) { // Initialisation des propriétés de l ’objet avec les paramètres $this−>methode = $methode ; $this−>action = $action; $this−>classeCSS = $classe ; $this−>nom = $nom ; $this−>centre = $centre; } Quelques contrôles seraient les bienvenus (sur la méthode par exemple, qui ne peut prendre que deux valeurs). Comme d’habitude nous les omettons pour ne pas surcharger le code. Méthodes privées La classe comprend ensuite un ensemble de méthodes privées pour produire les champs d’un formulaire HTML. Toutes ces méthodes renvoient une chaîne de caractères contenant la balise complète, prête à insérer dans un document HTML. La méthode champINPUT(), ci-dessous, produit par exemple un champ input du type demandé, avec son nom, sa valeur, le nombre de caractères du champ de saisie, et le nombre maximal de caractères saisissables par l’utilisateur 4 . // Méthode pour créer un champ input général p r i v a t e fun cti on champINPUT ( $type , $nom , $val , $ ta i l l e , $tailleMax) { // Attention aux problèmes d’ affichage $val = htmlSpecialChars($val); // Création et renvoi de la chaîne de caractères return "<input type=’$type ’ name=\"$nom\" " . "value=\"$val\" size =’ $taille’ maxlength=’$tailleMax ’/>\n"; } Quand on manipulate des chaînes en y incluant des variables, attention à bien imaginer ce qui peut se passer si les variables contiennent des caractères gênants comme « ’ ». Pour l’attribut value par exemple, on a appliqué au préalable la fonction htmlSpecialChars(). Les paramètres passés aux méthodes créant des champs peuvent varier en fonction du type de champ produit. Par exemple les méthodes produisant des listes de choix 4. On peut faire défiler un texte dans un champ de saisie. Le nombre de caractères saisissables n’est donc pas limité par la taille d’affichage du champ. 160 Chapitre 3. Programmation objet prennent en argument un tableau associatif – comme $liste dans la méthode ci- dessous – dont la clé est la valeur de chaque choix, et l’élément le libellé associé. // Champ pour sélectionner dans une li s t e p r i v a t e function champSELECT ($nom , $ l is t e , $defaut , $t a i l l e =1) { $s = "<select name=\"$nom\" size=’$taille’>\n"; while ( list ($val , $libelle ) = each ($liste)) { // Attention aux problèmes d’affichage $val = htmlSpecialChars($val); $defaut = htmlSpecialChars($defaut); if ($val != $defaut) $s .= "<option value=\"$val\">$libelle </option>\n"; else $s .= "<option value=\"$val\" selected=’1’>$libelle </ option>\n" ; } return $s . "</select >\n"; } Dans la méthode ci-dessus, on crée un champ select constitué d’une liste d’options. Une autre méthode champBUTTONS, que nous vous laissons consulter dans le fichier Formulaire.php, dispose tous les choix sur deux lignes, l’une avec les libellés, l’autre avec les boutons correspondants. Elle est utilisée pour les listes de boutons radio ou checkbox. Une méthode plus générale permet de produire la chaîne contenant un champ de formulaire, quel que soit son type. Comme les paramètres peuvent varier selon ce type, on utilise à cette occasion une astuce de PHP pour passer un nombre variable de paramètres. La variable $params ci-dessous est un tableau associatif dont la clé est le nom du paramètre, et l’élément la valeur de ce paramètre. Dans le cas d’un champ textarea par exemple, $params doit être un tableau à deux éléments, l’un indexé par ROWS et l’autre par COLS. // Champ de formulaire private function champForm ( $type , $nom, $val , $params , $l i s t e = array ()) { switch ($type) { case "text": case "password": case "submit" : case "reset": case "file": case "hidden" : // Extraction des paramètres de la liste if (isSet ($params [ ’SIZE ’ ]) ) $taille = $params[ "SIZE" ]; else $taille = 0; if (isSet ($params [ ’MAXLENGTH’ ]) and $params [ ’MAXLENGTH’ ]!=0) $tailleMax = $params[ ’MAXLENGTH’ ]; else $tailleMax = $taille ; 3.3 La classe Formulaire 161 // Appel de la méthode champInput $champ = $this −>champInput ($type , $nom, $val , $taille , $tailleMax) ; // Si c’est un transfert de fichier : s’en souvenir if ($type == "file") $this−>transfertFichier=TRUE ; break ; case "textarea": $lig = $params [ "ROWS" ]; $col = $params [ "COLS" ]; // Appel de la méthode champTextarea de l ’ objet courant $champ = $this −>champTextarea ($nom, $val , $lig , $col ) ; break ; case "select": $taille = $params[ "SIZE" ]; // Appel de la méthode champSelect de l ’ objet courant $champ = $this −>champSelect ($nom, $liste , $val , $taille ) ; break ; case "checkbox" : $champ = $this −>champButtons ( $type , $nom , $ l i s t e , $val , $params) ; break ; case "radio": // Appel de la méthode champButtons de l ’ objet courant $champ = $this −>champButtons ( $type , $nom , $ l i s t e , $val , array ()); break ; default : echo "<b>ERREUR: $type est un type inconnu </b>\n" ; break ; } return $champ; } Quand un bouton file est créé, on positionne la propriété $this->transfertFichier à true pour être sûr de bien produire la balise <form> avec les bons attributs. En fait, avec cette technique, on est assuré que le formulaire sera toujours correct, sans avoir à s’appuyer sur le soin apporté au développement par l’utilisateur de la classe. La méthode champForm permet d’appeler la bonne méthode de création de champ en fonction du type souhaité. La structure de test switch utilisée ci-dessus (voir chapitre 11) est bien adaptée au déclenchement d’une action parmi une liste prédéterminée en fonction d’un paramètre, ici le type du champ. L’ensemble des types de champ text, password, submit, reset, hidden et file correspond par exemple à la méthode champInput. 162 Chapitre 3. Programmation objet Création des composants Finalement nous disposons de tous les éléments pour commencer à construire les composants d’un formulaire. Chacune des méthodes qui suit construit un composant et le stocke dans la propriété composants de l’objet. Voici le cas le plus simple, pour commencer : l’ajout d’un composant de texte dans le formulaire. // Ajout d’un texte quelconque public function ajoutTexte ($texte) { // On ajoute un élément dans le tableau $composants $this−>composants[ $this−>nbComposants ] = array ( " t y p e " => "TEXTE" , "texte" => $texte); // Renvoi de l ’identifiant de la ligne , et incrémentation return $this−>nbComposants++; } Un composant est représenté par un tableau associatif PHP comprenant toujours un élément type, et d’autres éléments qui dépendent du type de composant. Pour un texte, on a simplement un élément texte mais nous verrons que pour un champ la description est un peu plus riche. Le composant est stocké dans le tableau composants, propriété de l’objet, et indicé par un numéro qui tient lieu d’identifiant pour le composant. Cet identifiant est renvoyé de manière à ce que l’utilisateur garde un moyen de référencer le composant pour, par exemple, le récupérer ou le modifier par l’intermédiaire d’autres méthodes. La seconde méthode (privée celle-là) construisant des composants est champLibelle(). // Création d’un champ avec son libellé private function champLibelle ($libelle , $nom, $val , $type , $params=array () , $liste=array ()) { // Création de la balise HTML $champHTML = $ t h i s −>champForm ( $type , $nom , $val , $params , $liste); // On met le libellé en gras $libelle = "<b>$libelle </b>"; // Stockage du libellé et de la balise dans le contenu $this−>composants[ $this−>nbComposants ] = array( " t y p e " = > " CHAMP" , "libelle" => $libelle, "champ" => $champHTML); // Renvoi de l ’identifiant de la ligne , et incrémentation return $this−>nbComposants++; } . correctement. Ensuite toute demande de création d’un champ passe par la méthode champLibelle() qui choisit d’abord (flèche 1), en fonction de la demande, la méthode de création de champ spécialisée, puis. composants, propriété de l’objet, et indicé par un numéro qui tient lieu d’identifiant pour le composant. Cet identifiant est renvoyé de manière à ce que l’utilisateur garde un moyen de référencer le composant. champ. L’ensemble des types de champ text, password, submit, reset, hidden et file correspond par exemple à la méthode champInput. 162 Chapitre 3. Programmation objet Création des composants Finalement