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
Trang 1libellé, 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>, avec methode 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, soit HORIZONTAL, 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)
Trang 2et 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
f u n c t i o n F o r m u l a i r e ( $methode , $ a c t i o n , $ c e n t r e = t r u e ,
$ c l a s s e = " Form " , $nom= " Form " ) {
/ / I n i t i a l i s a t i o n d e s p r o p r i é t é s d e l ’ o b j e t a v e c l e s
p a r a m è t r e s
$ t h i s−>methode = $methode ;
$ t h i s−>a c t i o n = $ a c t i o n ;
$ t h i s−>c l a s s e C S S = $ c l a s s e ;
$ t h i s−>nom = $nom ;
$ t h i s−>c e n t r e = $ c e n t r e ;
}
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’utilisateur4
/ / M é t h o d e p o u r c r é e r un champ i n p u t g é n é r a l
p r i v a t e f u n c t i o n champINPUT ( $ t y p e , $nom , $ v a l , $ t a i l l e ,
$ t a i l l e M a x )
{
/ / A t t e n t i o n a u x p r o b l è m e s d ’ a f f i c h a g e
$ v a l = h t m l S p e c i a l C h a r s ( $ v a l ) ;
/ / C r é a t i o n e t r e n v o i d e l a c h a î n e d e c a r a c t è r e s
r e t u r n " < i n p u t t y p e = ’ $ t y p e ’ name=\"$nom\" "
" v a l u e =\" $ v a l \" s i z e = ’ $ t a i l l e ’ m a x l e n g t h = ’ $ t a i l l e M a x ’ / > \ 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.
Trang 3prennent 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 p o u r s é l e c t i o n n e r d a n s u n e l i s t e
p r i v a t e f u n c t i o n champSELECT ( $nom , $ l i s t e , $ d e f a u t , $ t a i l l e
=1)
{
$ s = " < s e l e c t name=\"$nom\" s i z e = ’ $ t a i l l e ’ >\n " ;
w h i l e ( l i s t ( $ v a l , $ l i b e l l e ) = e a c h ( $ l i s t e ) ) {
/ / A t t e n t i o n a u x p r o b l è m e s d ’ a f f i c h a g e
$ v a l = h t m l S p e c i a l C h a r s ( $ v a l ) ;
$ d e f a u t = h t m l S p e c i a l C h a r s ( $ d e f a u t ) ;
i f ( $ v a l != $ d e f a u t )
$ s = " < o p t i o n v a l u e =\" $ v a l \"> $ l i b e l l e < / o p t i o n >\n " ;
e l s e
$ s = " < o p t i o n v a l u e =\" $ v a l \" s e l e c t e d = ’1 ’ > $ l i b e l l e < /
o p t i o n >\n " ; }
r e t u r n $ s " </ s e l e c t >\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 fichierFormulaire.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 d e f o r m u l a i r e
p r i v a t e f u n c t i o n champForm ( $ t y p e , $nom , $ v a l , $ p a r a m s , $ l i s t e =
a r r a y ( ) )
{
s w i t c h ( $ t y p e )
{
c a s e " t e x t " : c a s e " p a s s w o r d " : c a s e " s u b m i t " : c a s e " r e s e t " :
c a s e " f i l e " : c a s e " h i d d e n " :
/ / E x t r a c t i o n d e s p a r a m è t r e s d e l a l i s t e
i f ( i s S e t ( $ p a r a m s [ ’ SIZE ’ ] ) )
$ t a i l l e = $ p a r a m s [ " SIZE " ] ;
e l s e $ t a i l l e = 0 ;
i f ( i s S e t ( $ p a r a m s [ ’MAXLENGTH ’ ] ) and $ p a r a m s [ ’MAXLENGTH ’
] ! = 0 )
$ t a i l l e M a x = $ p a r a m s [ ’MAXLENGTH ’ ] ;
e l s e $ t a i l l e M a x = $ t a i l l e ;
Trang 4/ / A p p e l d e l a m é t h o d e c h a m p I n p u t
$champ = $ t h i s−>champInput ( $type , $nom , $val , $ t a i l l e ,
$ t a i l l e M a x ) ;
/ / S i c ’ e s t un t r a n s f e r t d e f i c h i e r : s ’ e n s o u v e n i r
i f ( $ t y p e == " f i l e " ) $ t h i s−> t r a n s f e r t F i c h i e r =TRUE;
b r e a k ;
c a s e " t e x t a r e a " :
$ l i g = $ p a r a m s [ "ROWS" ] ; $ c o l = $ p a r a m s [ "COLS" ] ;
/ / A p p e l d e l a m é t h o d e c h a m p T e x t a r e a d e l ’ o b j e t c o u r a n t
$champ = $ t h i s−>champTextarea ($nom , $val , $ l i g , $ c o l ) ;
b r e a k ;
c a s e " s e l e c t " :
$ t a i l l e = $ p a r a m s [ " SIZE " ] ;
/ / A p p e l d e l a m é t h o d e c h a m p S e l e c t d e l ’ o b j e t c o u r a n t
$champ = $ t h i s−>champSelect ($nom , $ l i s t e , $val , $ t a i l l e )
;
b r e a k ;
c a s e " c h e c k b o x " :
$champ = $ t h i s−>champButtons ( $type , $nom , $ l i s t e , $val ,
$ p a r a m s ) ;
b r e a k ;
c a s e " r a d i o " :
/ / A p p e l d e l a m é t h o d e c h a m p B u t t o n s d e l ’ o b j e t c o u r a n t
$champ = $ t h i s−>champButtons ( $type , $nom , $ l i s t e , $val ,
a r r a y ( ) ) ;
b r e a k ;
d e f a u l t : echo " <b>ERREUR : $ t y p e e s t un t y p e inconnu < / b>\n " ;
b r e a k ;
}
r e t u r n $champ ;
}
$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
Trang 5Cré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
/ / A j o u t d ’ un t e x t e q u e l c o n q u e
p u b l i c f u n c t i o n a j o u t T e x t e ( $ t e x t e )
{
/ / On a j o u t e un é l é m e n t d a n s l e t a b l e a u $ c o m p o s a n t s
$ t h i s−>composants [ $ t h i s −>nbComposants ] = a r r a y ( " t y p e "=>"TEXTE" ,
" t e x t e " => $ t e x t e ) ;
/ / R e n v o i d e l ’ i d e n t i f i a n t d e l a l i g n e , e t i n c r é m e n t a t i o n
r e t u r n $ t h i s−>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()
/ / C r é a t i o n d ’ un champ a v e c s o n l i b e l l é
p r i v a t e f u n c t i o n c h a m p L i b e l l e ( $ l i b e l l e , $nom , $ v a l , $ t y p e ,
$ p a r a m s = a r r a y ( ) , $ l i s t e = a r r a y ( ) )
{
/ / C r é a t i o n d e l a b a l i s e HTML
$champHTML = $ t h i s−>champForm ( $type , $nom , $val , $params ,
$ l i s t e ) ;
/ / On m e t l e l i b e l l é e n g r a s
$ l i b e l l e = " <b> $ l i b e l l e < / b> " ;
/ / S t o c k a g e du l i b e l l é e t d e l a b a l i s e d a n s l e c o n t e n u
$ t h i s−>composants [ $ t h i s −>nbComposants ] = a r r a y("t y p e" => "CHAMP" ,
" l i b e l l e " => $ l i b e l l e ,
" champ " => $champHTML) ;
/ / R e n v o i d e l ’ i d e n t i f i a n t d e l a l i g n e , e t i n c r é m e n t a t i o n
r e t u r n $ t h i s−>nbComposants ++;
}