III. La classe Template▲
Je vais vous expliquer pas à pas la réalisation d'une classe qui gère un système de templates.
III-A. Sa structure▲
Ne vous attardez pas trop sur cette structure, c'est juste pour vous donner un aperçu de la classe avec ses différentes méthodes.
III-B. Ses méthodes▲
Méthode __construct()▲
Cette méthode a pour but de :
- tester si le fichier .tpl joint au code PHP existe ;
- stocker le code HTML de la page test.tpl dans la variable $this->page :
function __construct($file
) {
// Teste si le fichier existe et si il est autorisé en lecture
if(empty($file
) or !
file_exists($file
) or !
is_readable($file
)) {
// Si le fichier est inexistant pas : erreur
die('
Template error : file
'
.
$file
.
'
not found.
'
);
}
else {
// Ouverture du fichier
$handle
=
fopen($file
,
'
rb
'
);
// Enregistrement du fichier dans $this->page
$this
->
page =
fread($handle
,
filesize ($file
));
// Fermeture du fichier
fclose ($handle
);
}
}
Méthode simpleVar()▲
Cette méthode a pour but de :
- récupérer les constantes/données du fichier test.php (exemple 2.1) des simples variables ;
- stocker les constantes/données dans le tableau $this->infoTpl selon le schéma défini précédemment pour ce tableau :
Méthode loopVar()▲
Cette méthode a pour but de :
- récupérer les constantes/données du fichier test.php (exemple 2.3) avec des variables placées dans une boucle ;
- stocker les constantes/données dans le tableau $this->infoTpl selon le schéma précédemment défini pour ce tableau.
function loopVar($type
,
$varArray
=
array()) {
// Si le tableau est vide, on stoppe le script
if (empty($varArray
)) exit;
// Calcule le nombre de lignes dans le type courant
// Si 0 ligne => 0
// Si X lignes => X
// Pourquoi X et non (X + 1) ?
// ->, Car on compte à partir de 0 donc X retourne toujours
// le dernier id + 1
$lastID
=
(count($this
->
infoTpl[
$type
]
) !=
0
) ?
(count($this
->
infoTpl[
$type
]
)) :
0
;
foreach ($varArray
as $constant
=>
$data
) {
$this
->
infoTpl[
$type
][
$lastID
][
$constant
]
=
$data
;
}
}
Méthode constantReplace()▲
Cette méthode a pour but de :
- remplacer '{CONSTANTE}' du fichier .tpl par sa donnée contenue dans le fichier test.php :
function constantReplace() {
// Parcours de tout le taleau $this->infoTpl
foreach($this
->
infoTpl as $type
=>
$info
) {
// Si le type est '.' càd
// provient de la fonction simpleVar()
// ou encore de constantes placées hors-boucle
if ($type
==
'
.
'
) {
for ($i
=
0
,
$imax
=
count($info
);
$i
<
$imax
;
$i
++
) {
foreach ($info
[
$i
]
as $constant
=>
$data
) {
// Remplace {CONSTANTE} par les données correspondantes
// et met à jour le code HTML du fichier test.tpl
// stocke dans $this->page
$data
=
(file_exists($data
)) ?
$this
->
includeFile($data
) :
$data
;
$this
->
page =
preg_replace('
`{
'
.
$constant
.
'
}`
'
,
$data
,
$this
->
page);
}
}
// Sinon si le type est autre càd
// provient de la fonction loopVar()
// ou encore de constantes placées dans une boucle
}
else {
// Calcule la taille du tableau $info
$infoSize
=
count($info
);
// Variable qui contiendra le code à la place de
// <!-- BEGIN country -->
// {country.ID} => {country.COUNTRY}
// <!-- END country -->
$block
=
''
;
// Parcourt le tableau $info
for ($i
=
0
;
$i
<
$infoSize
;
$i
++
) {
// Encode les caractères spéciaux
$page
=
htmlentities($this
->
page);
// $page est une variable string
// Remplit le tableau $infoArray ligne par ligne
$infoArray
=
explode("
\n
"
,
$page
);
// Suppression des espaces blancs avant/après
// dus aux indentations du code
for ($k
=
0
,
$kmax
=
count($infoArray
);
$k
<
$kmax
;
$k
++
) {
$infoArray
[
$k
]
=
trim($infoArray
[
$k
]
);
}
// Récupération et formatage des tags
$startTag
=
'
<!-- BEGIN
'
.
$type
.
'
-->
'
;
$startTag
=
htmlentities($startTag
);
$endTag
=
'
<!-- END
'
.
$type
.
'
-->
'
;
$endTag
=
htmlentities($endTag
);
// Récupération de la clé des tags dans le tableau $infoArray
$startTag
=
(array_search($startTag
,
$infoArray
)) +
1
;
$endTag
=
(array_search($endTag
,
$infoArray
)) -
1
;
// Nombre de lignes entre les tags
$lengthTag
=
($endTag
-
$startTag
) +
1
;
// Récupération de la portion du tableau
// délimitée par les tags (tags non compris)
$blockTag
=
array_slice($infoArray
,
$startTag
,
$lengthTag
);
// Remise en type 'string' et non plus 'array'
// Facilitera le remplacement des constantes par leurs données
$blockTag
=
implode("
\n
"
,
$blockTag
);
// Remplacement des constantes par leurs données
foreach($info
[
$i
]
as $constant
=>
$data
) {
$data
=
(file_exists($data
)) ?
$this
->
includeFile($data
) :
$data
;;
$blockTag
=
preg_replace('
`{
'
.
$type
.
'
.
'
.
$constant
.
'
}`
'
,
$data
,
$blockTag
);
}
// Ajout des données à la variable block globale pour la boucle
// Ajoute \n ou pas et ajoute les données
// de la nouvelle boucle à la suite de $block
$block
=
($block
==
''
) ?
$blockTag
:
$block
.
"
\n
"
.
$blockTag
;
}
// Mise en tableau de $block
// Facilitera l'opération de reconstitution des tableaux
$block
=
explode ("
\n
"
,
$block
);
// Coupe du tableau en 2
// $fisrtPart = début du tableau -----> <!-- BEGIN country -->
// $secondPart = <!-- BEGIN country --> -----> fin du tableau
$firstPart
=
array_slice($infoArray
,
0
,
$startTag
-
1
);
$secondPart
=
array_slice($infoArray
,
$startTag
+
$lengthTag
+
1
);
// Reconstitution du code source
// en insérant au milieu les données
$page
=
array_merge($firstPart
,
$block
,
$secondPart
);
// Décode les balises HTML qui étaient encodées avec htmlentities()
for ($i
=
0
,
$imax
=
count($page
);
$i
<
$imax
;
$i
++
) {
$page
[
$i
]
=
html_entity_decode($page
[
$i
]
);
}
// Met à jour le code HTML du fichier test.tpl
// stocke dans $this->page
$this
->
page =
implode("
\n
"
,
$page
);
}
}
}