22-02-2015, 09:52 AM
(Modification du message : 22-02-2015, 10:43 PM par Max72.
Raison de la modification: Mise en forme
)
Voilà, j'avais dit que j'essayerai de faire un petit tuto sur la création d'un moteur de template sans prétention.
C'est parti !
Le but
Comme dit, l'idée est de créer une classe Template qui nous permettra de mettre en place et d'afficher du HTML auquel nous rajouterons nos variables, passés depuis PHP.
Une page en HTML :
Notre classe se contentera de parser ce fichier et de remplacer les différentes balises par leurs équivalents PHP (enfin, à peu près ^^).
C'est tout ? Oui. Mais si vous le souhaitez, il sera très facile de le faire évoluer (gestion du cache etc).
Prérequis :
Un minimum de connaissances en PHP Orienté Objet est nécessaire, ainsi qu'en expressions régulières.
Le serveur doit accepter la fonction 'file_get_contents()', désactivée sur certains hébergeurs gratuits.
Attaquons !
Voilà le code de notre classe :
C'est parti !
Le but
Comme dit, l'idée est de créer une classe Template qui nous permettra de mettre en place et d'afficher du HTML auquel nous rajouterons nos variables, passés depuis PHP.
Une page en HTML :
<!DOCTYPE html>
<html>
<head>
<title>{{titre}}</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
{%FOR:pays%}
<b>{{nom}} </b><br/>
{%FOR:regions%}
{{nom}} a le numéro : {{numero}}<br/>
{%ENDFOR%}
{%ENDFOR%}
</body>
</html>
Notre classe se contentera de parser ce fichier et de remplacer les différentes balises par leurs équivalents PHP (enfin, à peu près ^^).
C'est tout ? Oui. Mais si vous le souhaitez, il sera très facile de le faire évoluer (gestion du cache etc).
Prérequis :
Un minimum de connaissances en PHP Orienté Objet est nécessaire, ainsi qu'en expressions régulières.
Le serveur doit accepter la fonction 'file_get_contents()', désactivée sur certains hébergeurs gratuits.
Attaquons !
Voilà le code de notre classe :
Code PHP :
<?php
class Tpl
{
// Données
private $data = array();
// Chemin du template
private $template;
// Contenu du template
private $content;
public function __construct($name, $data)
{
$this->template = $name;
$this->data = $data;
}
public function display()
{
// Temporisation de sortie
ob_start();
// Récupération du contenu du template
$this->get_content();
// Compilation du template
$this->parse();
//Ecriture du fichier compilé
$this->write_file();
// Affichage du fichier compilé et destruction du tampon
require($this->template . '.cache.php');
echo ob_get_clean();
}
private function get_content()
{
// On récupère tout le contenu du template
$this->content = file_get_contents($this->template);
}
private function parse()
{
// Parsage des variables {{VAR}}
$this->content = preg_replace('#\{\{(\w+)\}\}#', '<?php echo $this->data[\'$1\']; ?>', $this->content);
}
private function write_file()
{
// On écrit le template compilé dans un fichier
file_put_contents($this->template . '.cache.php', $this->content);
}
}
Cette classe est assez basique.
La partie la plus 'difficile' est sûrement le preg_replace.
Le parseur va chercher les expressions régulières de type '#\{\{(\w+)\}\}#' , (qui revient à {{Ma_Var}} , \w correspondant à un mot, soit [a-zA-Z0-9_]).
Il va ensuite remplacer cette expression par '<?php echo $this->data['Ma_Var']; ?> .
Pas de questions, on continue.
Ecrivons maintenant notre template, que j'ai appelé test.html
<!DOCTYPE html>
<html>
<head>
<title>{{titre}}</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<span>{{Mon_sous_titre}}</span>
</body>
</html>
Et maintenant nous allons initialiser et lancer tout ça :
Code PHP :
<?php
require ('Tpl.php');
// Tableau de données
$data = array(
"titre" => "Première page",
"Mon_sous_titre" => "C'est tout simple"
);
// Création d'une instance de Tpl
$tpl = new Tpl('test.html', $data);
// Affichage
$tpl->display();