6.3 Structure d’une application MVC : la vue 253 Tableau 6.1 — Méthodes de la classe Template Méthodes Description __construct (racine ) Constructeur setFile (nom, fichier ) Charge un fichier dans une entité nommée nom. On peut également passer en premier paramètre un tableau contenant la liste des fichiers à charger. setBlock (nom, nomBloc, nomRempla¸cant ) Remplace, dans le contenu de l’entité nom,lebloc nomBloc par une référence à l’entité nomRem- pla¸cant , et crée une nouvelle entité nomBloc. assign (nomCible, nomSource ) Place dans nomCible le contenu de nomSource dans lequel les références aux entités ont été rem- placées par leur contenu. append (nomCible, nomSource ) Ajoute (par concaténation) à nomCible le contenu de nomSource dans lequel les références aux entités ont été remplacées par leur contenu. render (nomCible ) Renvoie le contenu de nomCible. Un template est un fragment de code HTML (ou tout format textuel) qui fait référence à des entités. Une entité est simplement un nom qui définit une association entre le code PHP et la sortie HTML. 1. dans un template, on trouve les références d’entités, entourées par des acco- lades ; 2. dans le code PHP, une entité est une variable du composant Vue, à laquelle on affecte une valeur. Lors de l’exécution, la référence à une entité est substituée par sa valeur, qui peut aussi bien être une simple donnée qu’un fragment HTML complexe. C’est le moteur de templates qui se charge de cette substitution (ou instanciation). Commençons par un exemple simple. Le but est de construire une page en assemblant d’une part un fragment HTML sans aucune trace de PHP, et d’autre part une partie PHP, sans aucune trace de HTML. Le système de templates se chargera de faire le lien entre les deux. Voici tout d’abord la partie HTML (l’extension choisie ici est, par convention, .tpl pour « template »). Exemple 6.3 exemples/ExTemplate.tpl : Le fichier modèle <?xml version=" 1.0 " encoding=" iso −8959−1"?> <!DOCTYPE h t m l PUBLIC " −/ /W3C / / DTD XHTML 1 . 0 S t r i c t / / EN " "http ://www.w3. org /TR/xhtml1/DTD/xhtml1− strict .dtd"> <html xmlns="http ://www.w3. org/1999/xhtml" xml: lang=" fr " > <head> < title>Exemple de template</ title> < link rel =’stylesheet ’ href="films. css" type=" text / css " /> </head> 254 Chapitre 6. Architecture du site: le pattern MVC <body> <!−− Exemple simple d’ utilisation des templates. Notez qu’ i l n’y a pas une trace de PHP ci−dessous. −−> <h1>{ titre_page }</h1> Cette page a été engendrée par le système de templates . Elle contient des éléments statiques , comme la phrase que vous êtes en train de lire . Mais on y trouve également des parties dynamiques produites avec PHP, comme le nom de votre navigateur : <b>{ nom_navigateur }.</b> <p> On peut aussi afficher la date et l ’heure: Nous sommes le <b>{ date}</b>, il est <b>{heure}</b>heure(s). </p> <p> Pourtant la personne qui a produit le code HTML ne connaît rien à PHP, et la personne qui programme en PHP n’a aucune idée de la mise en forme choisie . Intéressant non ? </p> </body> </html> C’est donc du HTML standard où certains éléments du texte, les références d’entités, désignent les parties dynamiques produites par PHP. Les références d’entités sont encadrées par des accolades, comme {titre_page}. Voici maintenant la partie PHP. Exemple 6.4 exemples/ExTemplate.php : Le fichier PHP <?php // Exemple simple d’ utilisation des templates. // Notez qu ’ il n’y a pas une trace de HTML ci−dessous . // Inclusion du moteur de templates require ("Template.php"); // Instanciation d’un objet de la classe Template $tpl = new Template ("."); // Chargement dans l ’ entité ’page ’ du fichier contenant le template $tpl−>setFile ("page" , "ExTemplate . tpl ") ; // On donne une valeur aux entités référencées $tpl−>titre_entete = "Les templates"; $tpl−>titre_page = "Un exemple de templates"; $tpl−>date = date ("d/m/Y"); 6.3 Structure d’une application MVC : la vue 255 $tpl−>heure = date ("H"); $tpl−>nom_navigateur = $_SERVER[ ’HTTP_USER_AGENT’ ]; // La méthode render remplace les références par leur valeur , et renvoie // la nouvelle chaîne de caractères. echo $tpl−>render ("page") ; ?> Le principe est limpide : on crée un objet de la classe Te mpla te en lui indiquant que les fichiers de modèles sont dans le répertoire courant, « . ». On commence par charger le contenu du fichier ExTemplate.tpl et on l’affecte à l’entité page, qui contient donc des références à d’autres entités (date, heure, etc.). Il faut alors donner une valeur à ces entités avec l’opérateur d’affectation ’=’. Par exemple : $tpl−>date = date ("d/m/Y"); $tpl−>heure = date ("H"); Maintenant on peut substituer aux références d’entité présentes dans page les valeurs des entités qu’on vient de définir. Cela se fait en appelant la méthode render(). Elle va remplacer {date} dans l’entité page par sa valeur, et de même pour les autres références. Il ne reste plus qu’à afficher le texte obtenu après substitu- tion. On obtient le résultat de la figure 6.4 qui montre qu’avec très peu d’efforts, on a obtenu une séparation complète de PHP et de HTML. Figure 6.4 — Affichage du document résultat 256 Chapitre 6. Architecture du site: le pattern MVC Avant d’instancier un template, chaque entité qui y est référencée doit se voir affecter une valeur. Comme le montre l’exemple ci-dessus, il existe trois façons de créer des entités et de leur affecter une valeur : 1. on charge un fichier avec setFile(), et on place son contenu dans une entité dont on fournit le nom ; 2. on effectue une simple affectation, comme dans $vue->entite = valeur; ; 3. on instancie un template, et on affecte le résultat à une entité ; pour cela on peut utiliser assign() qui remplace l’entité-cible, ou append() qui conca- tène la nouvelle valeur à celle déjà existant dans l’entité-cible. 6.3.2 Combiner des templates Un moteur de templates serait bien faible s’il ne fournissait pas la possibilité de combiner des fragments pour créer des documents complexes. La combinaison des templates repose sur le mécanisme de remplacement d’entités. Il suffit de considérer que l’instanciation d’un template est une chaîne de caractères qui peut être constituer la valeur d’une nouvelle entité. Prenons un autre exemple pour montrer la combinaison de templates. On veut produire un document affichant une liste dont on ne connaît pas à l’avance le nombre d’éléments. La figure 6.5 montre le résultat souhaité, avec 5 éléments dans la liste. Figure 6.5 — Template contenant une liste On ne peut pas obtenir ce résultat avec un seul template, parce qu’un des frag- ments (la première phrase) apparaît une seule fois, et l’autre partie (les éléments de la liste) plusieurs fois. La solution est de combiner deux templates. Voici le premier, le parent : Exemple 6.5 exemples/Parent.tpl : Template à instancier une fois <?xml version="1.0 " encoding=" iso −8959−1"?> <!DOCTYPE h t m l PUBLIC " −/ /W3C / / DTD XHTML 1 . 0 S t r i c t / / EN " "http ://www.w3. org /TR/xhtml1/DTD/xhtml1− strict .dtd"> 6.3 Structure d’une application MVC : la vue 257 <html xmlns="http ://www.w3. org/1999/xhtml" xml: lang=" fr " > <head> < title>Exemple de templates</ title> < link rel =’stylesheet ’ href="films. css" type=" text / css " /> </head> <body> <div> Ce template est un <i >parent</ i > qui doit être combiné avec un autre template , <i >enfant</ i >, ce dernier pouvant être instancié plusieurs fois . On place une référence à une entité <i >enfants</ i >, ci−dessous , pour inclure la liste de ces instanciations . <ul> {enfants} </ul> </div> </body> </html> Il contient la partie du document qui n’apparaît qu’une seule fois. La référence à l’entité enfants est destinée à être remplacée par la liste des éléments. Le second template représente un seul de ces éléments : on va ensuite concaténer les instancia- tions. Exemple 6.6 exemples/Enfant.tpl : Template à instancier autant de fois que nécessaire < li> Ceci est le template <i >enfant</ i >, avec le numéro {numero} </ li> Maintenant on peut effectuer la combinaison. Pour l’essentiel, on instancie autant de fois que nécessaire le template enfant, et on concatène ces instanciations dans une entité enfants. Au moment où on applique la méthode render(),la valeur d’enfants va se substituer à la référence vers cette entité dans parent,etle tour est joué. Exemple 6.7 exemples/ExTemplateComb.php : Le code PHP pour combiner les templates <?php // Exemple de combinaison de templates require ("Template.php"); // Instanciation d’un objet de la classe Template $vue = new Template (" . ") ; // Chargement des deux templates $vue−>setFile (" parent" , "Parent. tpl "); . méthode render remplace les références par leur valeur , et renvoie // la nouvelle chaîne de caractères. echo $tpl−>render ("page") ; ?> Le principe est limpide : on crée un objet. valeur. Comme le montre l’exemple ci-dessus, il existe trois façons de créer des entités et de leur affecter une valeur : 1. on charge un fichier avec setFile(), et on place son contenu dans une entité dont. présentes dans page les valeurs des entités qu’on vient de définir. Cela se fait en appelant la méthode render(). Elle va remplacer {date} dans l’entité page par sa valeur, et de même pour les autres