TUTORIELS 
Utiliser des modèles de page en Perl
Les scripts CGI/Perl retournent du contenu HTML. Comment contrôler efficacement la présentation des pages ainsi formées? En utilisant la technique des templates (modèles de page).  (16 mars 2001)
 

L'un des aspects les plus fastidieux de la programmation CGI en Perl consiste à harmoniser la présentation des pages produites par les scripts avec celle de l'ensemble du site web dans lequel elles s'inscrivent. Une méthode simple consiste à utiliser les possibilités des Server Side Includes (SSI), et notamment la commande #exec, mais tous les serveurs ne supportent pas les SSI. Une autre manière de procéder de manière efficace et rigoureuse est l'utilisation de modèles de page (template). Cette technique permet de dissocier presque complètement le travail de design de la page de résultat et le programme Perl au coeur du script CGI.

Pour plus de commodité, nous allons tirer bénéfice, dans cet article, de la bibliothèque de fonctions du module CGI.pm. Commençons par réaliser une page web conforme à la présentation globale de notre site. Nous pouvons utiliser un éditeur wysiwyg, et se simplifier considérablement la tâche si l'on considère que le même résultat aurait nécessité la saisie manuelle de chaque ligne de code en Perl, à l'aide de l'instruction print.
Cette page pourra figurer, sur le serveur qui héberge notre site, dans n'importe quel répertoire (un sous-répertoire du répertoire cgi-bin peut être imposé). Décidons d'emblée où cette page devra être stockée afin d'adapter les liens en conséquence. Insérons alors dans notre réalisation, aux différents endroits où seront inscrites les données en sortie du script Perl, un texte explicite qui fera référence au type de données reçu. Prenons un exemple très simple, mais dont le principe pourra être repris pour l'insertion "à la volée" de contenu bien plus complexe: nous allons utiliser Perl pour insérer la date dans notre page web (imaginons que cette page soit une confirmation de la commande d'un article sur une boutique en ligne: nous voulons certainement que figure la date sur cette page). Nous aurions pu utiliser Javascript pour cela, convenons-en, mais nous pouvons imaginer que notre script Perl définitif ne renverra pas que la date du jour, mais beaucoup d'autres données pertinentes qui seront inscrites de la même manière sur notre page ainsi formatée.

Comment ça marche?
Le principe de la manoeuvre est élémentaire. Nous allons utiliser Perl pour lire le contenu de la page html qui sert de modèle (un fichier texte), puis nous allons remplacer tous les textes spécifiques que nous y avons insérés (et qui servent de marqueurs) par la sortie correspondante (variable) du programme Perl.
Si notre page s'appelle "template.html", et que notre marqueur soit:

 

#INSERTION DE LA DATE#

(<P> Aujourd'hui nous sommes le #INSERTION DE LA DATE#</P>)

alors notre script Perl ressemblera à ceci:

#!/usr/bin/perl
use CGI;
$objet=new CGI;
print $objet->header;

# lecture de la page modele
$modele="template.html";
open(FICHIER,"<$modele");
@modele = <FICHIER>;
close(FICHIER);

# regroupement des lignes HTML en une seule variable
$buffer=join("",@modele);

# determination de la date
($sec,$min,$hour,$mday, $mon,$year,$wday,$yday,$isdst)=localtime(time); $jour=(Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche)[$wday];
$mois=(Janvier, Fevrier, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Decembre)[$mon];
$datedujour="$jour $mday $mois ".($year+1900);

# remplacement du marqueur HTML par la date
$buffer=~s/#INSERTION DE LA DATE#/$date du jour/g;

# renvoi de la page au navigateur
print $resultPage;

Et voilà! Sans rentrer dans les détails du programme, précisons toutefois certains points: la détermination de la date utilise la fonction localtime() pour récupérer diverses données, que l'on peut ensuite formater comme on le désire (à noter que Perl renvoie, pour l'année, un chiffre entre 0 et 100: il nous faut donc ajouter 1900 au résultat). Le remplacement de la chaine "INSERTION DE LA DATE" par le contenu de la variable $datedujour fait appel, quant à lui, à une expression régulière et une opération de substitution classique en Perl.

 
[ Jérôme MorlonJDNet
 
Accueil | Haut de page