Génération dynamique de pages web - Sport

Transcription

Génération dynamique de pages web - Sport
Génération dynamique de pages web
Cet article décrit quelques techniques de programmation web permettant de générer des pages web
dynamiquement à partir d’une base de données.
STRUCTURE DE LA BASE DE DONNÉES
Figure 1
STRUCTURE DU SITE
Figure 2
HEPL 2009-2010
1
PAGE INDEX
Figure 3
La bannière, le pied de page et le menu sont stockés dans des fichiers externes pour une mise à jour
dynamique : il suffit de modifier un fichier pour modifier l’apparence de toutes les pages dans lesquelles il est
appelé. Les trois fichiers sont appelés respectivement aux lignes 22, 23 et 29 par une instruction include. Le
chemin vers le dossier contenant les fichiers à inclure est construit dynamiquement à partir de la constante
PATH définie à la ligne 6.
HEPL 2009-2010
2
La bannière est stockée dans le fichier banner.user.inc. Par pure convention, l’extension inc indique qu’il s’agit
d’un fichier à inclure. De même l’extension user indique qu’il s’agit de la bannière de la partie user. On pourra
ainsi créer facilement une bannière différente pour la partie admin.
Figure 4
Le pied de page est stocké dans le fichier footer.inc.php. On ajoute l’extension php car le fichier contient du
php.
Figure 5
Le menu est stocké dans le fichier menu.user.inc.php. Grâce à l’extension user, on pourra facilement créer un
menu différent pour la partie admin.
Figure 6
HEPL 2009-2010
3
PAGE LISTE01.PHP
Afficher la liste des noms des restaurants, l’un à la suite de l’autre, séparés par un point-virgule, sans autre
mise en page.
Figure 7
A la ligne 17, la fonction de connexion est une expression booléenne utilisant l’opérateur or. Si le premier
terme de l’expression est vrai, il n’est pas nécessaire d’évaluer le second et le script peut continuer à la ligne
21. Par contre, s’il est faux, le script doit évaluer le second terme, celui qui vient après l’opérateur or, et comme
ce second terme est une instruction die, le script avorte.
L’explication s’applique de la même façon aux lignes 21 et 22.
HEPL 2009-2010
4
Figure 8
Question : comment expliquer les lignes 30 et 31 ?
Figure 9
A la ligne 33,
A la ligne 38, la fonction mysql_fetch_array() lit une ligne du jeu d’enregistrements $rs et renvoie un tableau
associatif dans la variable $row. Lorsqu’il n’y a plus de lignes dans le jeu d’enregistrements, la fonction renvoie
false, ce qui provoque l’arrêt de la boucle while.
A la ligne 40, on imprime l’élément du tableau identifié par la chaîne "nomRestaurant" et on lui concatène un
point-virgule.
A la ligne 43, on a quitté le script php et on est revenu en html pour fermer le paragraphe </p>
A la ligne 44, on rouvre à nouveau le script pour pouvoir fermer la connexion, puis on le referme à la ligne 47
pour insérer les balises de fermeture </body> et </html>.
Figure 10
HEPL 2009-2010
5
Figure 11
PAGE LISTE02.PHP
Afficher les noms des restaurants en une colonne, avec bannière, menu et pied de page.
Figure 12
HEPL 2009-2010
6
Figure 13
A la ligne 16, on ajoute une enveloppe wrapper pour contenir tous les éléments html. Aux lignes 18 et 19, on
inclut la bannière et le menu, puis on continue avec la connexion. La ligne 21 correspond à la ligne 14 de la
figure 7.
Figure 14
A la ligne 34, on insère dans le code html une division identifiée par content et ouvre une <table> à la ligne
35 avant la boucle while. Dans la boucle while, à la ligne 39, on ouvre un <tr> qui contient un <td> (l. 40) et
dans ce <td>, on insère le nom du restaurant en php. Aux lignes 44 à 46, on rouvre le script php pour insérer
l’accolade de fermeture de la boucle, puis on insère les balises de fermeture de la table et de la division. On
rouvre alors le script pour fermer la connexion (l. 51) puis insérer le pied de page (l. 53).
HEPL 2009-2010
7
PAGE LISTE03.PHP
Même exercice, mais en alternant les couleurs pour les lignes paires et impaires
Figure 15
Il faut tout d’abord construire deux classes CSS correspondant aux couleurs paires et impaires.
Figure 16. Dans le fichier best50.css
Dans le script php, il faut pouvoir déterminer si le numéro de ligne est pair ou impair. Pour cela, nous déclarons
une variable $i que nous initialisons à 0 à la ligne 30.
A la ligne 32, nous utilisons l’opérateur modulo % pour calculer le reste de la division entière. Si le modulo est
égal à 0, la ligne est paire et nous affectons la valeur "paire" à la variable $classe (ligne 33), sinon elle
est impaire et nous affectons la valeur "impaire" à la variable $classe (ligne 35).
A la ligne 38, nous ajoutons un attribut class à la balise <tr> et nous indiquons la valeur de la variable
$classe dans les guillemets.
Il ne reste plus qu’à incrémenter la variable $i avant de fermer la boucle.
HEPL 2009-2010
8
Figure 17
Pour alléger le code de la page, nous stockons dans le fichier connexion.inc.php les instructions des
deux premières étapes (connexion et sélection) qui sont identiques pour toutes nos pages.
Figure 18
La fonction mysql_set_charset à la ligne 8 force l’affichage des données de la base de données en UTF-8 pour
un affichage correct des caractères accentués.
HEPL 2009-2010
9
Bien sûr, il faut inclure ce fichier dans la page liste03.php
Figure 19
PAGE LISTE04.PHP
Il faut maintenant pouvoir choisir le restaurant en fonction de l’initiale du nom. L’utilisateur choisit l’initiale
dans un alphabet en haut de la page. La nationalité du restaurant est représentée par un drapeau national à
droite du nom.
Figure 20
La fonction alphabet
Voyons d’abord comment afficher l’alphabet. Nous créons une fonction alphabet() que nous stockons
dans la page après le code html, pour rendre celui-ci plus lisible.
A la ligne 53, nous créons une division nommée alphabet et nous la refermons à la ligne 59.
A la ligne 54, nous utilisons une boucle for pour parcourir la plage des entiers de 65 à 90, correspondant aux
codes ASCII des caractères majuscules A-Z.
A la ligne 55, nous créons une zone de texte inline avec une balise span qui permettra de styler chaque initiale
et nous la refermons à la ligne 57.
HEPL 2009-2010
10
Figure 21
L’instruction la plus complexe est sans doute la fonction printf à la ligne 56. L’intérêt de cette fonction est
qu’elle permet d’imprimer la même valeur de différentes façons en fonction d’une chaîne de formatage.
Par exemple, le script ci-dessous affiche la valeur 122 successivement comme un caractère, comme un entier,
comme un réel, puis un réel sur 8 positions avec une décimale, puis en hexadécimal et finalement en
hexadécimal majuscule.
Figure 22
On obtient
Figure 23
Lorsque l’utilisateur clique sur une lettre de l’alphabet, la page doit être rappelée en lui transmettant la lettre
choisie. On peut vérifier que ce sera bien le cas en survolant une lettre de l’alphabet, le lien hypertexte
apparaît dans la barre de status au bas de la fenêtre du navigateur. Devinez quelle lettre est survolée à la figure
24.
HEPL 2009-2010
11
Figure 24
Pour provoquer ce comportement, le code html doit être formé d’un lien hypertexte <a> (fig. 25) dont
l’attribut href est formé du point d’interrogation suivi du nom de la variable, du signe =, puis de la valeur de la
variable :
Figure 25
Remarquez la valeur C majuscule dans la variable d’URL et le c minuscule qui sera affiché à l’écran. Le c
minuscule est obtenu en ajoutant 32 à la valeur ASCII.
Question : pourquoi l’alphabet est-il affiché en majuscules ?
Figure 26
Réponse : ce ne sont pas des majuscules mais des petites capitales obtenues par une règle dans la feuille de
style :
Figure 27
La fonction listeRestaurants()
Pour sélectionner uniquement les noms commençant par l’initiale choisie, il faut modifier ajouter une clause
where à la requête SQL. Pour retrouver les noms commençant par A on écrit
WHERE nomRestaurant like ‘A%’
En créant une fonction listeRestaurants qui reçoit en paramètre l’initiale choisie on peut facilement
généraliser la requête à toutes les lettres de l’alphabet.
En même temps, on complète la requête par une jointure sur la table tblPays afin de récupérer lenom du
fichier source de l’image du drapeau. La jointure est établie par le champ idPays, clé primaire de la table
tblPays.
HEPL 2009-2010
12
Figure 28
La fonction extract à la ligne 78 extrait les données du tableau associatif et crée les variables de même
nom. Par exemple, soit le tableau ($row) formé des éléments nomRestaurant, nomPays, drapeau
comme ci-dessous.
nomRestaurant
The Fat Duck
nomPays
UK
drapeau
unitedkingdom
La fonction extract($row) crée les variables $nomRestaurant, $nomPays, $drapeau.
Figure 29
A la ligne 79, on crée la variable $url qui servira à créer l’attribut src de la balise <img. Le nom $src
aurait mieux convenu, sans doute. Aux lignes 80 et 81, on crée les variables $alt et $title pour les
attributs de même nom.
Les lignes 83 à 87 sont connues.
HEPL 2009-2010
13
A la ligne 90 on est revenu en html pour insérer les balises plus facilement. On se sert de fragments de code
php pour imprimer les données et les valeurs d’attributs aux lignes 91 à 97.
Figure 30
Il faut maintenant appeler ces deux fonctions. Le code html sera généré dans la page à l’endroit où elles sont
appelées. A la ligne 39 fig. 31, on appelle la fonction alphabet() et à la ligne 40, on appelle la fonction
listeRestaurants() en transmettant la variable $initiale.
Figure 31
Il reste maintenant à récupérer la valeur de la variable d’URL dans la variable $initiale. Sachant que les
variables d’URL sont conservées dans la variable superglobale $_GET, on extrait ces variables tout au début
de la page, à la ligne 3, fig. 32.
Figure 32
HEPL 2009-2010
14
Il faut maintenant bien comprendre le fonctionnement de ce genre de page. Lorsque la page est appelée
depuis le menu, ce menu ne transmet pas la variable d’URL initiale. Vérifiez ci-dessous, lorsque l’on survole le
bouton Liste 4 dans le menu
Figure 33. Comparer la figure 24.
Il faut donc vérifier si la variable $initiale est bien définie et lui affecter une valeur par défaut lorsqu’elle
ne l’est pas.
Figure 34
HEPL 2009-2010
15