1: <?php
2: // declare(encoding='UTF-8');
3: /**
4: * Classe Controleur, coeur d'une application, c'est normalement la seule classe d'une application
5: * qui devrait être appelée de l'extérieur.
6: * Elle est abstraite donc doit obligatoirement être étendue.
7: *
8: * @category PHP 5.2
9: * @package Framework
10: * @author Aurélien PERONNET <aurelien@tela-botanica.org>
11: * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
12: * @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
13: * @license GNU-GPL-v3 <http://www.gnu.org/licenses/gpl.html>
14: * @license CECILL-v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>
15: */
16: abstract class Controleur {
17: /** Variable statique indiquant que les tableaux _GET et _POST ont déjà été encodé au format de l'appli. */
18: private static $encodage = false;
19:
20: /** Registre global, normalement accessible partout */
21: private $registre;
22:
23: /**
24: * Constructeur par défaut
25: */
26: public function __construct() {
27: $this->registre = Registre::getInstance();
28: $this->registre->set('base_chemin_modele', Config::get('chemin_modeles'));
29: $this->registre->set('base_chemin_squelette', Config::get('chemin_squelettes'));
30: $this->registre->set('base_chemin_controleur', Config::get('chemin_controleurs'));
31: $this->registre->set('base_url_application', new Url(Config::get('url_base')));
32: $this->verifierEtReencoderTableauRequete();
33: }
34:
35: /**
36: * Charge un modele donné et le rend disponible sous la forme $this->nom_modele
37: *
38: * @param string $nom_modele le nom du modèle à charger
39: *
40: * @return boolean false si le chargement a échoué, sinon true.
41: */
42: final protected function chargerModele($nom_modele) {
43: $sortie = true;
44: $modele = $this->getModele($nom_modele);
45: if ($modele !== false) {
46: $this->$nom_modele = new $nom_modele;
47: } else {
48: $sortie = false;
49: }
50: return $sortie;
51: }
52:
53: /**
54: * Retourne un modele donné
55: *
56: * @param string $nom_modele le nom du fichier modèle à charger sans son extension
57: * @param String $ext l'extension du fichier du modèel (par défaut : ".php"
58: *
59: * @return mixed false si le chargement a échoué, sinon l'objet du modèle demandé.
60: */
61: final protected function getModele($nom_modele, $ext = '.php') {
62: $sortie = false;
63: $chemin_modele = $this->registre->get('base_chemin_modele').$nom_modele.$ext;
64: if (file_exists($chemin_modele)) {
65: include_once $chemin_modele;
66: if (class_exists($nom_modele)) {
67: $sortie = new $nom_modele;
68: }
69: }
70: return $sortie;
71: }
72:
73: /**
74: * Fonction prenant en paramètre le nom d'un squelette et un tableau associatif de données,
75: * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
76: *
77: * @param String $nom_squelette le nom du squelette sans son extension
78: * @param Array $donnees un tableau associatif contenant les variables a injecter dans la vue
79: * @param String $ext l'extension du fichier du squelette (par défaut : ".tpl.html"
80: *
81: * @return boolean false si la vue n'existe pas, sinon la chaine résultat.
82: */
83: final protected function getVue($nom_squelette, $donnees = array(), $ext = '.tpl.html') {
84: $donnees = $this->preTraiterDonnees($donnees);
85: $chemin_squelette = ($this->registre->get('base_chemin_squelette')).$nom_squelette.$ext;
86: $sortie = SquelettePhp::analyser($chemin_squelette, $donnees);
87:
88: return $sortie;
89: }
90:
91: /**
92: * Fonction prenant en paramètre un tableau de données et effectuant un traitement dessus.
93: * Cette fonction est à surcharger dans les classes filles pour automatiser un traitement
94: * avant chaque chargement de vue.
95: *
96: * @param Array $donnees Le tableau de données à traiter
97: *
98: * @return Array $donnees Le tableau de données traité
99: */
100: protected function preTraiterDonnees($donnees) {
101: return $donnees;
102: }
103:
104: /**
105: * Procédure vérifiant l'encodage des tableaux $_GET et $_POST et les transcodant dans l'encodage de l'application
106: */
107: protected function verifierEtReencoderTableauRequete() {
108: if (self::$encodage == false && Config::get('sortie_encodage') != Config::get('appli_encodage')) {
109: $_POST = $this->encoderTableau($_POST, Config::get('appli_encodage'), Config::get('sortie_encodage'));
110: $_GET = $this->encoderTableau($_GET, Config::get('appli_encodage'), Config::get('sortie_encodage'));
111: self::$encodage = true;
112: }
113:
114: // traitement des magic quotes
115: $this->verifierEtTraiterSlashTableauRequete();
116: }
117:
118: /**
119: * Procédure vérifiant l'activation des magic quotes et remplace les slash dans les tableaux de requete
120: */
121: private function verifierEtTraiterSlashTableauRequete() {
122:
123: if ( get_magic_quotes_gpc() ) {
124:
125: if (!function_exists('stripslashes_deep')) {
126: function stripslashes_deep( $value ) {
127:
128: return ( is_array($value) )
129: ? array_map('stripslashes_deep', $value)
130: : stripslashes($value);
131:
132: } // end of 'stripslashes_deep()'
133:
134: $_GET = array_map('stripslashes_deep', $_GET);
135: $_POST = array_map('stripslashes_deep', $_POST);
136: $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
137: }
138: }
139: }
140:
141: /**
142: * Fonction récursive transcodant toutes les valeurs d'un tableau de leur encodage d'entrée vers un encodage de sortie donné
143: * @param $tableau Array Un tableau de données à encoder
144: * @param $encodage_sortie String l'encodage vers lequel on doit transcoder
145: * @param $encodage_entree String l'encodage original des chaines du tableau (optionnel)
146: * @return Array Le tableau encodé dans l'encodage de sortie
147: *
148: */
149: final protected function encoderTableau($tableau, $encodage_sortie, $encodage_entree = null) {
150: if (is_array($tableau)) {
151: foreach ($tableau as $cle => $valeur) {
152: if (is_array($valeur)) {
153: $tableau[$cle] = $this->encoderTableau($valeur, $encodage_sortie, $encodage_entree);
154: } else {
155: $tableau[$cle] = mb_convert_encoding($valeur, $encodage_sortie, $encodage_entree);
156: }
157: }
158: }
159: return $tableau;
160: }
161: }
162: ?>