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