1: <?php
2: // declare(encoding='UTF-8');
3: /**
4: * Classe SquelettePhp, traitant les squelette Php utilisant la syntaxe courte php ou pas.
5: * Ces méthodes sont statiques.
6: *
7: * @category PHP 5.2
8: * @package Framework
9: * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
10: * @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
11: * @license GNU-GPL-v3 <http://www.gnu.org/licenses/gpl.html>
12: * @license CECILL-v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>
13: */
14: class SquelettePhp {
15:
16: /**
17: * Fonction prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
18: * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
19: *
20: * @param String $fichier le chemin du fichier du squelette
21: * @param Array $donnees un tableau associatif contenant les variables a injecter dans le squelette.
22: *
23: * @return boolean false si la vue n'existe pas, sinon la chaine résultat.
24: */
25: public static function analyser($fichier, Array $donnees = array()) {
26: $sortie = false;
27: if (file_exists($fichier)) {
28: // Extraction des variables du tableau de données
29: extract($donnees);
30: // Démarage de la bufferisation de sortie
31: ob_start();
32: // Si les tags courts sont activés
33: if ((bool) @ini_get('short_open_tag') === true) {
34: // Simple inclusion du squelette
35: include $fichier;
36: } else {
37: // Sinon, remplacement des tags courts par la syntaxe classique avec echo
38: $html_et_code_php = self::traiterTagsCourts($fichier);
39: // Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
40: $html_et_code_php = '?>'.$html_et_code_php;
41: // Interprétation du html et du php dans le buffer
42: echo eval($html_et_code_php);
43: }
44: // Récupèration du contenu du buffer
45: $sortie = ob_get_contents();
46: // Suppression du buffer
47: @ob_end_clean();
48: } else {
49: $msg = "Le fichier du squelette '$fichier' n'existe pas.";
50: trigger_error($msg, E_USER_WARNING);
51: }
52: // Retourne le contenu
53: return $sortie;
54: }
55:
56: /**
57: * Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
58: *
59: * @param String $chemin_squelette le chemin du fichier du squelette
60: *
61: * @return string le contenu du fichier du squelette php avec les tags courts remplacés.
62: */
63: private static function traiterTagsCourts($chemin_squelette) {
64: $contenu = file_get_contents($chemin_squelette);
65: // Remplacement de tags courts par un tag long avec echo
66: $contenu = str_replace('<?=', '<?php echo ', $contenu);
67: // Ajout systématique d'un point virgule avant la fermeture php
68: $contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
69: return $contenu;
70: }
71: }
72: ?>