La méthodecontrole prend en entrée un tableau associatif contenant les données d’une ligne de la table manipulée.. Comme la plupart des méthodes données par la suite, controle s’appuie s
Trang 1Voyons maintenant les principales méthodes de la classe IhmBD La méthode
controle() prend en entrée un tableau associatif contenant les données d’une ligne
de la table manipulée Elle doit être appelée avant une mise à jour Son rôle est de contrôler autant que possible que tout va bien se passer au moment de l’exécution
de la requête Bien entendu une partie des contrôles dépend de règles spécifiques à la table manipulées qui ne peuvent pas être codées de manière générique, mais on peut toujours contrôler la longueur ou le type des données en fonction du schéma de la
table On peut aussi « échapper » les apostrophes avec la méthode prepareChaine()
de la classe BD C’est cette dernière manipulation qui est effectuée dans le code ci-dessous, le reste étant à compléter Comme la plupart des méthodes données par
la suite, controle() s’appuie sur le tableau schema pour connaître le nom des attributs
de la table et y accéder.
/ / M é t h o d e e f f e c t u a n t d e s c o n t r ô l e s a v a n t m i s e à j o u r
p r o t e c t e d f u n c t i o n c o n t r o l e ( $ l i g n e )
{
$ l i g n e P r o p r e = a r r a y ( ) ;
/ / On commence p a r t r a i t e r t o u t e s l e s c h a î n e s d e s a t t r i b u t s
f o r e a c h ( $ t h i s−>schemaTable a s $nom => $ o p t i o n s ) {
/ / T r a i t e m e n t d e s a p o s t r o p h e s
$ l i g n e P r o p r e [ $nom ] = $ t h i s−>bd−>prepareChaine ( $ l i g n e [ $nom ] )
; }
/ / On p e u t , d e p l u s , c o n t r ô l e r l e t y p e ou l a l o n g u e u r d e s
/ / d o n n é e s d ’ a p r è s l e s c h é m a d e l a t a b l e A f a i r e !
r e t u r n $ l i g n e P r o p r e ;
}
La méthode controle() prend un tableau en entrée, copié du script appelant vers
l’espace des variables de la fonction, et renvoie un tableau en sortie, copié de la fonction vers le script appelant Si on a peur que cela nuise aux performances, il reste toujours possible de recourir à un passage par référence.
La méthode formulaire() est donnée ci-dessous Elle renvoie un formulaire adapté
au mode de mise à jour à effectuer (insertion ou modification, voir page 78 pour les principes de création de ce type de formulaire).
/ / C r é a t i o n d ’ un f o r m u l a i r e g é n é r i q u e
p u b l i c f u n c t i o n f o r m u l a i r e ( $ a c t i o n , $ l i g n e )
{
/ / C r é a t i o n d e l ’ o b j e t f o r m u l a i r e
$ f o r m = new F o r m u l a i r e ( " p o s t " , $ t h i s−>nomScript , f a l s e ) ;
$form−>champCache ( " a c t i o n " , $ a c t i o n ) ;
$form−>debutTable ( ) ;
/ / P o u r c h a q u e a t t r i b u t , c r é a t i o n d ’ un champ d e s a i s i e
f o r e a c h ( $ t h i s−>schemaTable a s $nom => $ o p t i o n s ) {
/ / D ’ a b o r d v é r i f i e r q u e l a v a l e u r p a r d é f a u t e x i s t e
Trang 2i f ( ! i s S e t ( $ l i g n e [ $nom ] ) ) $ l i g n e [ $nom ] = " " ;
/ / A t t e n t i o n : t r a i t e m e n t d e s b a l i s e s HTML a v a n t / / a f f i c h a g e
$ l i g n e [ $nom ] = h t m l S p e c i a l C h a r s ( $ l i g n e [ $nom ] ) ;
/ / On m e t l a c l é p r i m a i r e e n champ c a c h é
i f ( $ o p t i o n s [ ’ c l e _ p r i m a i r e ’ ] and $ a c t i o n == IhmBD : :
MAJ_BD) {
$form−>champCache ($nom , $ l i g n e [ $nom ] ) ;
}
e l s e {
/ / A f f i c h a g e du champ
i f ( $ o p t i o n s [ ’ t y p e ’ ] == " b l o b " )
$form−>champfenetre ( $ t h i s −>e n t e t e s [ $nom ] ,
$nom , $ l i g n e [ $nom ] ,
4 , 3 0 ) ;
e l s e
$form−>champTexte ( $ t h i s −>e n t e t e s [ $nom ] ,
$nom , $ l i g n e [ $nom ] ,
$ o p t i o n s [ ’ l o n g u e u r ’ ] ) ; }
}
$form−>f i n T a b l e ( ) ;
i f ( $ a c t i o n == IhmBD : : MAJ_BD)
$form−>champValider ( " M o d i f i e r " , " submit " ) ;
e l s e
$form−>champValider ( " I n s é r e r " , " submit " ) ;
r e t u r n $form−>formulaireHTML ( ) ;
}
Noter l’utilisation de la fonction htmlSpecialChars() pour traiter les données venant de la base afin d’éviter les inconvénients résultant de la présence de balises HTML dans ces données (sujet traité page 64) La méthode utilise bien entendu la classe Formulaire pour aligner régulièrement chaque champ avec son en-tête De même, la méthode tableau() ci-dessous s’appuie sur un objet de la classe Tableau.
Là aussi on prend soin d’appliquer htmlSpecialChars() aux données provenant
de la base.
/ / C r é a t i o n d ’ un t a b l e a u g é n é r i q u e
p u b l i c f u n c t i o n t a b l e a u ( $ a t t r i b u t s = a r r a y ( ) )
{
/ / C r é a t i o n d e l ’ o b j e t T a b l e a u
$ t a b l e a u = new T a b l e a u ( 2 , $ a t t r i b u t s ) ;
$ t a b l e a u−>s e t C o u l e u r I m p a i r e ( " s i l v e r " ) ;
$ t a b l e a u−>s e t A f f i c h e E n t e t e ( 1 , f a l s e ) ;
/ / T e x t e d e s en−t ê t e s
f o r e a c h ( $ t h i s−>schemaTable a s $nom => $ o p t i o n s )
$ t a b l e a u−>a j o u t E n t e t e ( 2 , $nom , $ t h i s −>e n t e t e s [ $nom ] ) ;
Trang 3$ t a b l e a u−>a j o u t E n t e t e ( 2 , " a c t i o n " , " Action " ) ;
/ / P a r c o u r s d e l a t a b l e
$ r e q u e t e = " SELECT ∗ FROM $ t h i s −>nomTable " ;
$ r e s u l t a t = $ t h i s−>bd−>execRequete ( $ r e q u e t e ) ;
$ i = 0 ;
w h i l e ( $ l i g n e = $ t h i s−>bd−>l i g n e S u i v a n t e ( $ r e s u l t a t ) ) {
$ i ++;
/ / C r é a t i o n d e s c e l l u l e s
f o r e a c h ( $ t h i s−>schemaTable a s $nom => $ o p t i o n s ) {
/ / A t t e n t i o n : t r a i t e m e n t d e s b a l i s e s HTML a v a n t a f f i c h a g e
$ l i g n e [ $nom ] = h t m l S p e c i a l C h a r s ( $ l i g n e [ $nom ] ) ;
$ t a b l e a u−>a j o u t V a l e u r ( $i , $nom , $ l i g n e [ $nom ] ) ;
}
/ / C r é a t i o n d e l ’URL d e m o d i f i c a t i o n
$urlMod = $ t h i s−>a c c e s C l e ( $ l i g n e ) "& ; a c t i o n =" IhmBD : :
EDITER ;
$modLink = " <a h r e f = ’ $ t h i s−>nomScript ? $urlMod ’ > m o d i f i e r </ a>" ;
$ t a b l e a u−>a j o u t V a l e u r ( $i , " a c t i o n " , $modLink ) ;
}
/ / R e t o u r d e l a c h a î n e c o n t e n a n t l e t a b l e a u
r e t u r n $ t a b l e a u−>tableauHTML ( ) ;
}
Je laisse le lecteur consulter directement le code des méthodes accesCle(), insertion(), maj() et chercheLigne() qui construisent simplement des requêtes SQL SELECT, INSERT ou UPDATE en fonction du schéma de la table et des don-nées passées en paramètre La dernière méthode intéressante est genererIHM() qui définit les interactions avec le formulaire et le tableau Trois actions sont pos-sibles :
1 on a utilisé le formulaire pour effectuer une insertion : dans ce cas on exécute
la méthode insertion() avec les données reçues par HTTP ;
2 on a utilisé le formulaire pour effectuer une mise à jour : dans ce cas on exécute
la méthode maj() ;
3 on a utilisé l’ancre modifier du tableau pour éditer une ligne et la modifier :
dans ce cas on appelle le formulaire en mise à jour.
Si le formulaire n’est pas utilisé en mise à jour, on l’affiche en mode insertion Dans tous les cas, on affiche le tableau contenant les lignes, ce qui donne le code suivant :
Trang 4p u b l i c f u n c t i o n genererIHM ( $paramsHTTP )
{
/ / A −t ’ on demandé une a c t i o n ?
i f ( i s S e t ( $paramsHTTP [ ’ a c t i o n ’ ] ) )
$ a c t i o n = $paramsHTTP [ ’ a c t i o n ’ ] ;
e l s e
$ a c t i o n = " " ;
$ a f f i c h a g e = " " ;
s w i t c h ( $ a c t i o n ) {
c a s e IhmBD : : INS_BD :
/ / On a d e m a n d é u n e i n s e r t i o n
$ t h i s−>i n s e r t i o n ( $paramsHTTP ) ;
$ a f f i c h a g e = " < i > I n s e r t i o n e f f e c t u é e < / i > " ;
b r e a k ;
c a s e IhmBD : : MAJ_BD :
/ / On a d e m a n d é u n e m o d i f i c a t i o n
$ t h i s−>maj ( $paramsHTTP ) ;
$ a f f i c h a g e = " < i >Mise à j o u r e f f e c t u é e < / i > " ;
b r e a k ;
c a s e IhmBD : : EDITER :
/ / On a d e m a n d é l ’ a c c è s à u n e l i g n e e n m i s e à j o u r
$ l i g n e = $ t h i s−>c h e r c h e L i g n e ( $paramsHTTP ) ;
$ a f f i c h a g e = $ t h i s−>f o r m u l a i r e (IhmBD : : MAJ_BD, $ l i g n e ) ;
b r e a k ;
}
/ / A f f i c h a g e du f o r m u l a i r e e n i n s e r t i o n s i on n ’ a p a s é d i t é / / e n m i s e à j o u r
i f ( $ a c t i o n != IhmBD : : EDITER ) {
$ a f f i c h a g e = " <h2> S a i s i e < / h2> " ;
$ a f f i c h a g e = $ t h i s−>f o r m u l a i r e (IhmBD : : INS_BD , a r r a y ( ) ) ;
}
/ / On m e t t o u j o u r s l e t a b l e a u du c o n t e n u d e l a t a b l e
$ a f f i c h a g e = " <h2>Contenu de l a t a b l e < i > $ t h i s−>nomTable </ i >
</ h2> "
$ t h i s−>t a b l e a u ( a r r a y ( " b o r d e r " => 2) ) ;
/ / R e t o u r d e l a p a g e HTML
r e t u r n $ a f f i c h a g e ;
}
Cette classe fournit ainsi une version « par défaut » des fonctionnalités d’accès à une table, version qui peut suffire pour élaborer rapidement une interface Pour des besoins plus sophistiqués, il est possible de spécialiser cette classe pour l’adapter aux contraintes et règles de manipulation d’une table particulière Le chapitre 5 donne
un exemple complet d’une telle spécialisation (voir page 267) À titre de mise en bouche, voici la sous-classe IhmCarte qui surcharge la méthode formulaire() pour présenter les types de plat sous la forme d’une liste déroulante.
Trang 5Exemple 3.11 exemples/IhmCarte.php:La sous-classe IhmCarte
<?
r e q u i r e _ o n c e ( " IhmBD c l a s s php " ) ;
/ / C l a s s e é t e n d a n t IhmBD , s p é c i a l i s é e p o u r l a t a b l e C a r t e
c l a s s IhmCarte e x t e n d s IhmBD
{
/ / La c a r t e e s t c a r a c t é r i s é e p a r l e s t y p e s d e p l a t s a u t o r i s é s
p r i v a t e $ t y p e s A u t o r i s e s = a r r a y ( " E n t r È e " => " E n t r È e " ,
" P l a t " => " P l a t " ,
" D e s s e r t " => " D e s s e r t " ) ;
/ / Le c o n s t r u c t e u r d e l a c l a s s e A t t e n t i o n à b i e n p e n s e r
/ / à a p p e l e r l e c o n s t r u c t e u r d e l a s u p e r −c l a s s e
f u n c t i o n _ _ c o n s t r u c t ( $nomTable , $bd , $ s c r i p t = " moi " )
{
/ / A p p e l du c o n s t r u c t e u r d e IhmBD
p a r e n t : : _ _ c o n s t r u c t ( $nomTable , $bd , $ s c r i p t ) ;
/ / On p e u t p l a c e r l e s e n t Í t e s d Ë s m a i n t e n a n t
$ t h i s−>e n t e t e s [ ’ i d _ c h o i x ’ ] = " NumÈro du p l a t " ;
$ t h i s−>e n t e t e s [ ’ l i b e l l e ’ ] = " L i b e l l È du p l a t " ;
$ t h i s−>e n t e t e s [ ’ t y p e ’ ] = " Type du p l a t " ;
}
/ ∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ P a r t i e p u b l i q u e ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ / / / R e d é f i n i t i o n du f o r m u l a i r e
p u b l i c f u n c t i o n f o r m u l a i r e ( $ a c t i o n , $ l i g n e )
{
/ / C r é a t i o n d e l ’ o b j e t f o r m u l a i r e
$ f o r m = new F o r m u l a i r e ( " g e t " , $ t h i s−>nomScript , f a l s e ) ;
$form−>champCache ( " a c t i o n " , $ a c t i o n ) ;
$form−>debutTable ( ) ;
/ / En m i s e à j o u r , l a c l é e s t c a c h é e , s i n o n e l l e e s t
s a i s i s s a b l e
i f ( $ a c t i o n == IhmBD : : MAJ_BD)
$form−>champCache ( " i d _ c h o i x " , $ l i g n e [ ’ i d _ c h o i x ’ ] ) ;
e l s e
$form−>champTexte ( $ t h i s −>e n t e t e s [ ’ i d _ c h o i x ’ ] , ’ i d _ c h o i x ’ , " " ,
4 ) ;
/ / V é r i f i e r q u e l a v a l e u r p a r d é f a u t e x i s t e
i f ( ! i s S e t ( $ l i g n e [ ’ l i b e l l e ’ ] ) ) $ l i g n e [ ’ l i b e l l e ’ ] = " " ;
i f ( ! i s S e t ( $ l i g n e [ ’ t y p e ’ ] ) ) $ l i g n e [ ’ t y p e ’ ] = " E n t r é e " ;
$form−>champTexte ( $ t h i s −>e n t e t e s [ ’ l i b e l l e ’ ] , " l i b e l l e " ,