Les Templates en PHP

Transcription

Les Templates en PHP
Les Templates en PHP
Problèmes de maintenabilité, utilisation avec les
Objets et les CSS
Gerard Rozsavolgyi
[email protected]
IUT Orléans
Les Templates en PHP – p. 1/21
Séparation des métiers
problème classique “développeurs” vs “graphistes” ou
“maquetteurs”
illustré en Java, passage des Servlets ou JSP, puis
J2EE...
XML peut être une solution surtout si on veut du
multi-support (XHTML, WAP, PDF, etc.)
succès de PHP : simplicité provenant de l’imbrication
naturelle PHP/HTML
Les Templates en PHP – p. 2/21
Un Mélange PHP/HTML “classique”
<HTML><HEAD><TITLE >
Votre navigateur
</ TITLE >
<BODY>
<?php
i f ( s t r s t r ($HTTP_USER_AGENT, "MSIE" ) ) {
?>
< c e n t e r ><b>Vous u t i l i s e z I n t e r n e t E x p l o r e r < / b> </ c e n t e r >
<?
} else {
?>
< c e n t e r ><b>Vous n’utilisez pas Internet Explorer</b></center>
<?
}
?>
</BODY></HTML>
Listing 1 – imbrication.php
Les Templates en PHP – p. 3/21
Génération de HTML à partir de PHP
On pilote la création de HTML depuis des fonctions PHP
qui renvoient des fragments HTML
fonction resultatSQLverstableHTML()
des fonctions pour fabriquer des listes déroulantes,
etc.
des fonctions pour gérer les ancres et les liens, etc.
des fichiers header.php, footer.php, menu.php, ... (ou
.html) qui prennent en charge des parties fixes des
pages du site, etc.
des objets spécialisés avec leurs méthodes
Pb : qui fait ca ? Maintenance ? Lisibilité ?
Les Templates en PHP – p. 4/21
Autre approche : les templates
on essaie de dissocier davantage la manipulation HTML
du codage en PHP
fichiers templates proches du HTML
qu’on peut utiliser à travers un fichier php correspondant
Exemples : FastTemplates, PHPLIB,
SMARTY,VTemplates ,ModeliXe, etc.
Les Templates en PHP – p. 5/21
Principe des templates
principes techniques dérivés de m4 ou du perl
(FastTemplates)
essai de séparation des métiers
popularisés dans une forme limitée par des logiciels
comme DREAMWEAVER
parfois systèmes de cache (SMARTY, VTemplates)
simples ?
Les Templates en PHP – p. 6/21
templates : l’exemple de PHPLIB
Un fichier template proche du HTML “paramétrable” :
<HTML><HEAD>
<TITLE> { TITRE_ENTETE } < / TITLE>
< /HEAD>
<BODY>
<H1> { TITRE_PAGE } < / H1>
<P>Bonjour , vous u t i l i s e z <B> {NOM_NAVIGATEUR } . < / B> comme
navigateur internet .
<P>Nous sommes l e <B> {DATE} < / B> , i l e s t <B> {HEURE} < / B> heures .
< /BODY>
< /HTML>
Listing 2 – ExTemplate.tpl
un fichier PHP correspondant
Les Templates en PHP – p. 7/21
templates PHPLIB
Le fichier PHP correspondant :
<? / / I n c l u s i o n d e l a c l a s s e T e m p l a t e d e P H P L I B
r e q u i r e ( "template.inc" ) ;
$ t p l = new Template ( "." ) ;
//
C h a r g e m e n t du
fichier
contenant
le
template
$ t p l −> s e t _ f i l e ( "page" , "ExTemplate.tpl" ) ;
//
...
puis
on d o n n e une
valeur
aux
e n t i t é s
du
template
$ t p l −>s e t _ v a r ( "TITRE_ENTETE" , "Mon entete" ) ;
$ t p l −>s e t _ v a r ( "TITRE_PAGE" , "Un exemple de templates" ) ;
$ t p l −>s e t _ v a r ( "DATE" , date ( "d/m/Y" ) ) ;
$ t p l −>s e t _ v a r ( "HEURE" , date ( "H" ) ) ;
$ t p l −>s e t _ v a r ( "NOM_NAVIGATEUR" , $_SERVER[ ’HTTP_USER_AGENT’ ] ) ;
//
La
//
une
m é t h o d e
parse
nouvelle
remplace
e n t i t é ,
ici
les
e n t i t é s
par
leur
valeur ,
et
c r é e
nomm é PAGE .
$ t p l −>parse ( "PAGE" , "page" ) ;
//
Il
ne
reste
plus
q u ’ à
afficher
$ t p l −>p ( "PAGE" ) ;? >
Listing 3 – ExTemplate.php
Les Templates en PHP – p. 8/21
Découpage en entités
<HTML> <HEAD> <TITLE>
{TITRE} </TITLE>
<LINK rel=’’stylesheet’’ href=’’monstyle.css’’ type
</head>
<P class=’’titre_page’’> {TITRE_PAGE}
<P> {MENU}
<P> {CONTENU}
../...
</HTML>
Les Templates en PHP – p. 9/21
Hiérarchie d’entités
CONTENU peut renvoyer à :
<P> {FORM_SQL}
<P> {RES_SQL}
Les Templates en PHP – p. 10/21
RESSQL
<TABLE >
<TR class=’’top_tableau’’ >
<TH> Nom </TH>
<TH> Prenom </TH>
<TH> Date de Naissance </TH>
</TR>
{LIGNES_SQL}
</TABLE >
Les Templates en PHP – p. 11/21
LIGNE_SQL
<TR class=’’aff_sql’’ >
<TD> {NOM} </TD>
<TD> {PRENOM} </TD>
<TD> {NAISSANCE} </TD>
<TD>
<A href=’’MiseAjour.php? nom={NOM_URL}
Mise à jour de la personne
</A> </TD> </TR>
Attention : ceci ne représente qu’une seule ligne du
résultat d’une requête
Instanciation de cette entité autant de fois qu’il y a de
lignes dans le tableau,puis concaténation.
Pb supplémentaire : multiplication des entités
Les Templates en PHP – p. 12/21
Eléments répétitifs : Utilisation des BLOCS
<TABLE >
<TR class=’’top_tableau’’ >
<TH> Nom </TH>
<TH> Prenom </TH>
<TH> Date de Naissance </TH></TR>
<!-- BEGIN LIGNE_SQL -->
<TR class=’’ligne’’ ...
...
<! END LIGNE_SQL -->
</TABLE >
Les Templates en PHP – p. 13/21
tableau simple avec 2 templates
<tr>
<td> {NOM} : {AGE} < / td>
</ tr>
Listing 4 – ligne.tpl V1
<html>
<table>
{ LISTE }
< / table>
< / html>
Listing 5 – tableau.tpl V1
Les Templates en PHP – p. 14/21
Puis utilisation des 2 templates
<? include "template.inc" ;
$personne [ "achille" ] = 4 5 ;
$personne [ "toto" ] = 1 0 ;
$personne [ "Mimi" ] = 4 ;
$ t p l = new Template ( "." ) ; / / c r é a t i o n d u t e m p l a t e $ t p l
$ t p l −>s e t _ v a r ( "page" , "tableau.tpl" ) ;
$ t p l −>s e t _ v a r ( "ligne" , "ligne.tpl" ) ; / / o n d é f i n i t l e s f i c h i e r s
contenant
les
m o d è l e s
r e s e t ( $personne ) ;
/ / Puis
traitement
des
lignes
du
tableau
foreach ( $personne as $ c l e => $ v a l e u r ) {
$ t p l −>s e t _ v a r ( array ( "NOM"=> $cle , "AGE"=> $ v a l e u r ) ) ;
$ t p l −>parse ( "LISTE" , "ligne" , t r u e ) ; / / t r u e I N D I S P E N S A B L E
}
$ t p l −>pparse ( "MyOutput" , "page" ) ; / / t r a i t e m e n t f i n a l d u m o d è l e +
affichage
?>
Listing 6 – temp tab.php V1
Les Templates en PHP – p. 15/21
Tableau avec BLOC et un seul template(v2)
<html>
< t a b l e border="1" cellspacing ="0" cellpadding="0" width="200">
< !−− BEGIN L I G N E −−>
<tr>
<td > {NOM} < / td> <td> {AGE} < / td>
</ tr>
< !−− END L I G N E −−>
< / table>
< / html>
Listing 7 – tableau.tpl V2
Les Templates en PHP – p. 16/21
Puis utilisation du BLOC
<? include "template.inc" ;
$personne [ "achille" ] = 4 5 ;
$personne [ "toto" ] = 1 0 ;
$personne [ "Mimi" ] = 4 ;
$ t p l = new Template ( "." ) ; / / c r é a t i o n d u t e m p l a t e $ t p l
$ t p l −> s e t _ f i l e ( "modele" , "tableau.tpl" ) ; / / o n d é f i n i t l e
fichier
du
m o d è l e
$ t p l −>s e t _ b l o c k ( "modele" , "LIGNE" , "une_ligne" ) ;
//
puis
traitement
des
lignes
du
//
on
d é f i n i t
le
bloc
tableau
r e s e t ( $personne ) ;
foreach ( $personne as $ c l e => $ v a l e u r ) {
$ t p l −>s e t _ v a r ( array ( "NOM"=> $cle , "AGE"=> $ v a l e u r ) ) ;
$ t p l −>parse ( "une_ligne" , "LIGNE" , t r u e ) ; / / t r a i t e m e n t d u BLOC
}
$ t p l −>pparse ( "MyOutput" , "modele" ) ; / / t r a i t e m e n t d u m o d è l e +
affichage
?>
Listing 8 – temp tab.php V2
Les Templates en PHP – p. 17/21
Autres exemples
Voir par exemple le fichier soutenances.tpl
Les Templates en PHP – p. 18/21
Avec les CSS
Les Templates en PHP – p. 19/21
Conclusion Provisoire
Solution intermédiaire
Ne pas choisir un système trop complexe
XML + XSLT ?
Les Templates en PHP – p. 20/21
Références
site de Zeev Suraski et Andi Gutmans :
http://www.zend.com/php5/
le document de synthèse sur les templates Nicolas BIOT
et Armet Fauveau.Globalis ms (2002).
Pratique de MySQL et PHP (2eme Edition). Philippe
Rigaux O’Reilly qui comporte un chapitre sur PHPLib.
les cahiers du programmeur PHP (2) . P. Chaléat et D.
Charnay. Eyrolles qui évoque SMARTY.
site de Bertrand Soulier :
http://www.bertrand-soulier.com/php/tutoriaux/
Les Templates en PHP – p. 21/21