M[c p1, c q2] Tableau 3.7 — Les méthodes publiques de la classe tableau Tableau tabAttrs Constructeur de tableaux en fonction d’une dimen-sion et d’une liste de paramètres de présentat
Trang 1tableau E, assez éloigné des autres, sera ignoré Voici, pour un tableau avec deux
dimensions d1et d2, la représentation adoptée
CSG e[d2, c12] e[d2, c22] e[d3, c q2]
e[d1, c11] M[c1
1, c12] M[c1
1, c22] M[c1
1, c q2]
e[d1, c2
1] M[c2
1, c1
2] M[c2
1, c2
2] M[c2
1, c q2]
e[d1, c p1] M[c p1, c12] M[c p1, c22] M[c p1, c q2]
Tableau 3.7 — Les méthodes publiques de la classe tableau
Tableau ( tabAttrs) Constructeur de tableaux en fonction d’une
dimen-sion et d’une liste de paramètres de présentation.
ajoutValeur ( ligne,colonne,valeur) Définit la valeur du tableau dans une cellule
donnée par les paramètresligne etcolonne.
ajoutEntete ( dimension,cle,texte) Définit l’en-tête pour la dimensiondimension et
la clécle.
TableauHTML () Produit la représentation HTML du tableau.
ajoutAttributsTable ( tabAttrs) Ajouts de paramètres de présentation pour la balise
<table>.
setCouleurPaire ( couleur) Couleur de fond pour les lignes paires.
setCouleurImpaire ( couleur) Couleur de fond pour les lignes impaires.
setAfficheEntete ( dimension,couleur) Indique si l’on souhaite ou non afficher l’en-tête pour
la dimension.
setCoinSuperieurGauche ( texte) Texte à placer dans le coin supérieur gauche.
Les éléments apparaissant dans cette présentation sont :
• Le libellé du coin supérieur gauche CSG (dans le tableau C par exemple c’est
« Box office ») ;
• les clés de la dimension 1, notées c i
1, pour chaque ligne i, avec 1 i p (dans
le tableau B ce sont les titres de films ; dans le tableau C les villes) ;
• les clés de la dimension 2, notées c j2, pour chaque ligne j, avec 1 j q (dans
notre exemple il s’agit de ’Semaine’ suivi du numéro de la semaine) ;
• les en-têtes de la dimension d k , notés e[d k , c i k ], avec k = 1 ou k = 2 ;
• enfin M[i, j] désigne la valeur de la mesure pour la position (i, j) du tableau.
Une fois cet effort de modélisation effectué, tout le reste devient facile Les informations précédentes doivent pouvoir être manipulées par l’intermédiaire de l’interface de la classe Tableau et donc être stockées comme propriétés des objets de
la classe Tableau Par ailleurs, elles doivent être accessibles en entrée ou en sortie par l’intermédiaire d’un ensemble de méthodes publiques
Ce modèle de tableau capture les exemples A et B En l’étendant à trois dimen-sions, on obtient également les présentations C et D En revanche il ne convient pas
Trang 2au tableau E : il faut savoir renoncer aux cas qui rendent beaucoup plus complexes les manipulations sans que cela soit justifié par le gain en puissance
Dans ce qui suit, nous donnons des exemples d’utilisation, ainsi que l’implanta-tion de la classe, en nous limitant au cas à deux dimensions La gesl’implanta-tion d’un nombre
de dimensions quelconque est partiellement réalisée dans le code fourni sur le site,
et partiellement laissée au lecteur (le polycopié d’exercices fournit des suggestions complémentaires)
3.2.2 Utilisation
La table 3.7 donne la liste des méthodes publiques de la classe Tableau On trouve bien entendu le constructeur de la classe, qui prend en paramètres la dimension du
tableau et des attributs HTML à placer dans la balise <table> Les trois méthodes
suivantes sont les plus importantes Elles définissent respectivement l’ajout d’une
valeur dans une cellule (le tableau M des mesures), la description des en-têtes (le tableau e) et enfin la sortie de la chaîne de caractères contenant la représentation
HTML du tableau
Les autres méthodes publiques sont moins essentielles Elles permettent de régler l’apparence du tableau en affectant certaines valeurs à des paramètres internes à la classe utilisés ensuite au moment de la génération de la chaîne HTML
Voyons maintenant comment on utilise cette classe dans une petite application
de test qui extrait des données de MySQL et les affiche sous forme de tableau HTML
Le script SQL suivant permet de créer la table BoxOffice (les exemples contiennent
un autre script, InsBoxOffice.sql, pour insérer un échantillon de données dans cette table)
Exemple 3.7 exemples/BoxOffice.sql:Création de la table BoxOffice.
# C r é a t i o n d ’ une t a b l e p o u r box o f f i c e s i m p l i f i é
CREATE TABLE B o x O f f i c e
( t i t r e VARCHAR( 6 0 ) NOT NULL,
s e m a i n e INTEGER NOT NULL,
v i l l e VARCHAR( 6 0 ) NOT NULL,
n b _ e n t r e e s INTEGER NOT NULL,
PRIMARY KEY ( t i t r e , s e m a i n e , v i l l e )
) ;
Le script ApplClasseTableau.php, ci-dessous, instancie deux objets de la classe Tableau, correspondant aux présentations A et B données précédemment Ces deux objets sont alimentés à partir des lignes issues d’une même requête, ce qui montre concrètement comment on peut facilement choisir une présentation particulière en partant des mêmes données Notez qu’il n’y a pratiquement plus une seule balise HTML apparaissant dans ce script La figure 3.3 donne le résultat
Trang 3Exemple 3.8 exemples/ApplClasseTableau.php:Application de la classe Tableau.
<? xml v e r s i o n = " 1 0 " e n c o d i n g = " i s o−8959−1 " ? >
<!DOCTYPE html PUBLIC "−//W3C/ / DTD XHTML 1 0 S t r i c t / / EN"
" h t t p : / / www w3 o r g / TR / xhtml1 /DTD/ xhtml1−s t r i c t dtd ">
<html xmlns= " h t t p : / / www w3 o r g / 1 9 9 9 / xhtml " xml : l a n g = " f r " >
<head >
< t i t l e >La c l a s s e t a b l e a u < / t i t l e >
< l i n k r e l = ’ s t y l e s h e e t ’ h r e f = " f i l m s c s s " t y p e = " t e x t / c s s " / >
</ head >
<body >
<? php
r e q u i r e _ o n c e ( " Connect php " ) ;
r e q u i r e _ o n c e ( "BDMySQL php " ) ;
r e q u i r e _ o n c e ( " T a b l e a u php " ) ;
t r y {
/ / C o n n e x i o n à l a b a s e d e d o n n é e s
$bd = new BDMySQL (NOM, PASSE , BASE , SERVEUR) ;
/ / C r é a t i o n du p r e m i e r t a b l e a u
$ t a b l e a u A = new T a b l e a u ( 2 , a r r a y ( " b o r d e r " = >2) ) ;
$ t a b l e a u A−>s e t A f f i c h e E n t e t e ( 1 , FALSE) ;
/ / C r é a t i o n du s e c o n d t a b l e a u
$ t a b l e a u B = new T a b l e a u ( 2 , a r r a y ( " b o r d e r " = >2) ) ;
$ t a b l e a u B−>s e t C oi nSupe r i e ur G a uc he ( " Box o f f i c e " ) ;
$ t a b l e a u B−>s e t C o u l e u r I m p a i r e ( " s i l v e r " ) ;
$ i = 0 ;
/ / R e c h e r c h e d e s f i l m s p a r i s i e n s
$ r e s u l t a t = $bd−>execRequete ( "SELECT ∗ FROM B o x O f f i c e WHERE
v i l l e = ’ P a r i s ’ " ) ;
w h i l e ( $bo = $bd−>o b j e t S u i v a n t ( $ r e s u l t a t ) ) {
/ / P r e m i e r t a b l e a u : p r é s e n t a t i o n s t a n d a r d , e n c o l o n n e s
$ i ++;
$ t a b l e a u A−>a j o u t V a l e u r ( $i , " Film " , $bo−> t i t r e ) ;
$ t a b l e a u A−>a j o u t V a l e u r ( $i , " V i l l e " , $bo−> v i l l e ) ;
$ t a b l e a u A−>a j o u t V a l e u r ( $i , " Semaine " , $bo−>semaine ) ;
$ t a b l e a u A−>a j o u t V a l e u r ( $i , "Nb e n t r é e s " , $bo−>n b _ e n t r e e s ) ; / / S e c o n d t a b l e a u : p r é s e n t a t i o n p a r t i t r e e t p a r s e m a i n e
$ t a b l e a u B−>a j o u t E n t e t e ( 2 , $bo−>semaine , " Semaine " $bo−>
s e m a i n e ) ;
$ t a b l e a u B−>a j o u t V a l e u r ( $bo−>t i t r e , $bo−>semaine , $bo−>
n b _ e n t r e e s ) ; }
/ / A f f i c h a g e d e s t a b l e a u x
echo $ t a b l e a u A−>tableauHTML ( ) "<br />\n " ;
Trang 4echo $ t a b l e a u B−>tableauHTML ( ) "<br />\n " ;
}
c a t c h ( E x c e p t i o n $ e x c ) {
/ / Une e r r e u r e s t s u r v e n u e
echo " <b> E r r e u r r e n c o n t r é e : < / b> " $exc−>g e t M e s s a g e ( ) "\n " ;
}
? >
</ body >
</ html >
Figure 3.3 — Affichage des deux tableaux.
Bien entendu on utilise un objet de la classe BDMySQL pour se connecter, effectuer une requête et parcourir le résultat Ce qui nous intéresse ici c’est la production des tableaux Le premier, tableauA, est instancié comme suit :
$ t a b l e a u A = new T a b l e a u ( 2 , a r r a y ( " b o r d e r " = >2) ) ;
$ t a b l e a u A−>s e t A f f i c h e E n t e t e ( 1 , FALSE) ;
On indique donc qu’il s’agit d’un tableau à deux dimensions, avec une bordure
de 2 pixels On peut noter la pratique consistant à passer un nombre variable de paramètres (ici des attributs HTML) sous la forme d’un tableau PHP La seconde instruction supprime l’affichage des en-têtes de la dimension 1
Ensuite, à chaque fois que la boucle sur le résultat de la requête renvoie un objet
bo, on insère des valeurs avec la méthode ajoutValeur() Rappelons que cette
fonction définit la valeur de M[c1, c2] ó c1 (respectivement c2) est la clé désignant
la ligne (respectivement la colonne) de la cellule
Trang 5$ i ++;
$ t a b l e a u A−>a j o u t V a l e u r ( $i , " Film " , $bo−> t i t r e ) ;
$ t a b l e a u A−>a j o u t V a l e u r ( $i , " V i l l e " , $bo−> v i l l e ) ;
$ t a b l e a u A−>a j o u t V a l e u r ( $i , " Semaine " , $bo−>semaine ) ;
$ t a b l e a u A−>a j o u t V a l e u r ( $i , "Nb e n t r é e s " , $bo−>n b _ e n t r e e s ) ;
Ici la clé de la dimension 1 (les lignes) est basée sur un compteur incrémenté à chaque passage dans la boucle, et la clé de la dimension 2 (les colonnes) est un texte qui servira également d’en-tête (voir figure 3.3)
Pour le second tableau, tableauB, on applique les mêmes principes L’instancia-tion est identique On appelle deux méthodes qui fixent le libellé du coin supérieur gauche, et une couleur de fond pour les lignes impaires
$ t a b l e a u B−>s e t C o i n S u p e r i e u r G a u c h e ( " Box o f f i c e " ) ;
$ t a b l e a u B−>s e t C o u l e u r I m p a i r e ( " s i l v e r " ) ;
Puis, à chaque passage dans la boucle, on insère une valeur de la mesure nbEntr´ees indexée par le titre du film (dimension 1, les lignes) et par la semaine (dimension 2, les colonnes) De plus, au lieu de garder l’en-tête par défaut pour les colonnes (le numéro de la semaine), on le définit avec la méthode ajoutEntete() comme étant la concaténation de la chaîne "Semaine " et du numéro de semaine
$ t a b l e a u B−>a j o u t E n t e t e ( 2 , $bo−>semaine , " Semaine " $bo−>semaine ) ;
$ t a b l e a u B−>a j o u t V a l e u r ( $bo−> t i t r e , $bo−>semaine , $bo−>n b E n t r e e s ) ;
Il n’y a rien de plus à faire L’appel de la méthode tableauHTML() renvoie une chaîne qui peut être placée dans un document HTML Bien entendu on pourrait améliorer la présentation, par exemple en cadrant à droite les colonnes contenant des nombres C’est possible – et facile- - en ajoutant des méthodes appropriées à la classe Tableau Ce type d’extension est très utile à réaliser pour bien comprendre comment fonctionne une classe
Cet exemple montre comment la programmation objet permet de s’affranchir de détails de bas niveau comme, ici, les balises HTML à utiliser en ouverture et en fermeture ou l’ordre de création des cellules On se contente de déclarer le contenu
du tableau et l’objet se charge de fournir une chaîne de caractères contenant sa description HTML Cette chaîne peut alors être utilisée par l’application comme bon lui semble On pourrait par exemple la placer dans une cellule d’un autre tableau pour obtenir très facilement des imbrications Ce qui compte, pour bien utiliser la classe, c’est d’une part de comprendre la modélisation (et donc ce qu’est conceptuellement
un objet tableau), et d’autre part de connaître les modes de contrôle et d’interaction avec l’objet