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