1646 |
alex |
1 |
<?php
|
|
|
2 |
// In : utf8 url_encoded (get et post)
|
|
|
3 |
// Out : utf8
|
|
|
4 |
/**
|
|
|
5 |
* La classe Widget analyser l'url et chage le widget correspondant.
|
|
|
6 |
* Format d'url :
|
|
|
7 |
* /widget/nom_du_widget?parametres1=ma_valeur1¶metre2=ma_valeur2
|
|
|
8 |
* Les widget sont dans des dossiers en minuscule correspondant au nom de la classe du widget.
|
|
|
9 |
* Exemple : /widget/carto avec la classe Carto.php dans le dossier carto.
|
|
|
10 |
*
|
|
|
11 |
*
|
|
|
12 |
* @author jpm
|
|
|
13 |
*
|
|
|
14 |
*/
|
|
|
15 |
class Widget {
|
|
|
16 |
|
|
|
17 |
/** Les paramètres de configuration extrait du fichier .ini */
|
|
|
18 |
private static $config;
|
|
|
19 |
|
|
|
20 |
/** Le nom du widget demandé. */
|
|
|
21 |
private $widget = null;
|
|
|
22 |
|
|
|
23 |
/** Les chemins où l'autoload doit chercher des classes. */
|
|
|
24 |
private static $autoload_chemins = array();
|
|
|
25 |
|
|
|
26 |
/** Les paramètres de l'url $_GET nettoyés. */
|
|
|
27 |
private $parametres = null;
|
|
|
28 |
|
|
|
29 |
/**
|
|
|
30 |
* Constructeur.
|
|
|
31 |
* Parse le fichier de configuraion "widget.ini" et parse l'url à la recherche du widget demandé.
|
|
|
32 |
* @param str iniFile Configuration file to use
|
|
|
33 |
*/
|
|
|
34 |
public function __construct($fichier_ini = 'widget.ini.php') {
|
|
|
35 |
// Chargement de la configuration
|
|
|
36 |
self::$config = parse_ini_file($fichier_ini, TRUE);
|
1948 |
mathias |
37 |
// Paramètres de config dynamiques
|
|
|
38 |
$protocole = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) ? 'https://' : 'http://';
|
|
|
39 |
self::$config['chemins']['baseURLAbsoluDyn'] = $protocole . $_SERVER['SERVER_NAME'].self::$config['chemins']['baseURL'].'%s';
|
1646 |
alex |
40 |
|
|
|
41 |
// Gestion de la mémoire maximum allouée aux services
|
|
|
42 |
ini_set('memory_limit', self::$config['parametres']['limiteMemoire']);
|
|
|
43 |
|
|
|
44 |
// Réglages de PHP
|
|
|
45 |
setlocale(LC_ALL, self::$config['parametres']['locale']);
|
|
|
46 |
date_default_timezone_set(self::$config['parametres']['fuseauHoraire']);
|
|
|
47 |
|
|
|
48 |
// Gestion des erreurs
|
|
|
49 |
error_reporting(self::$config['parametres']['erreurNiveau']);
|
|
|
50 |
|
|
|
51 |
if (isset($_SERVER['REQUEST_URI']) && isset($_SERVER['QUERY_STRING'])) {
|
|
|
52 |
$url_morceaux = $this->parserUrl();
|
|
|
53 |
if (isset($url_morceaux[0])) {
|
|
|
54 |
$this->widget = $url_morceaux[0];
|
|
|
55 |
self::$config['chemins']['widgetCourantDossier'] = self::$config['chemins']['widgetsDossier'].strtolower($this->widget).DIRECTORY_SEPARATOR;
|
|
|
56 |
$this->chargerWidgetConfig();
|
|
|
57 |
}
|
|
|
58 |
// Chargement des chemins pour l'autoload
|
|
|
59 |
$this->chargerCheminAutoload();
|
|
|
60 |
|
|
|
61 |
// Enregistrement de la méthode gérant l'autoload des classes
|
|
|
62 |
spl_autoload_register(array('Widget', 'chargerClasse'));
|
|
|
63 |
|
|
|
64 |
// Nettoyage du $_GET (sécurité)
|
|
|
65 |
$this->collecterParametres();
|
|
|
66 |
} else {
|
|
|
67 |
$e = 'Les widget nécessite les variables serveurs suivantes pour fonctionner : REQUEST_URI et QUERY_STRING.';
|
|
|
68 |
trigger_error($e, E_USER_ERROR);
|
|
|
69 |
}
|
|
|
70 |
}
|
|
|
71 |
|
|
|
72 |
private function parserUrl() {
|
|
|
73 |
if (strlen($_SERVER['QUERY_STRING']) == 0) {
|
|
|
74 |
$len = strlen($_SERVER['REQUEST_URI']);
|
|
|
75 |
} else {
|
|
|
76 |
$len = -(strlen($_SERVER['QUERY_STRING']) + 1);
|
|
|
77 |
}
|
|
|
78 |
$url = substr($_SERVER['REQUEST_URI'], strlen(self::$config['chemins']['baseURL']), $len);
|
|
|
79 |
$url_morceaux = explode('/', $url);
|
|
|
80 |
return $url_morceaux;
|
|
|
81 |
}
|
|
|
82 |
|
|
|
83 |
private function collecterParametres() {
|
|
|
84 |
if (isset($_GET) && $_GET != '') {
|
|
|
85 |
$this->nettoyerGet();
|
|
|
86 |
$this->parametres = $_GET;
|
|
|
87 |
}
|
|
|
88 |
}
|
|
|
89 |
|
|
|
90 |
private function nettoyerGet() {
|
|
|
91 |
foreach ($_GET as $cle => $valeur) {
|
|
|
92 |
$verifier = array('NULL', "\n", "\r", "\\", '"', "\x00", "\x1a", ';');
|
|
|
93 |
$_GET[$cle] = strip_tags(str_replace($verifier, '', $valeur));
|
|
|
94 |
}
|
|
|
95 |
}
|
|
|
96 |
|
|
|
97 |
private function chargerCheminAutoload() {
|
|
|
98 |
$chemins_communs = explode(';', self::$config['chemins']['autoload']);
|
|
|
99 |
$chemins_communs = array_map('trim', $chemins_communs);
|
|
|
100 |
array_unshift($chemins_communs, '');
|
|
|
101 |
|
|
|
102 |
$chemins_widget = array();
|
|
|
103 |
if (isset(self::$config[$this->widget]['autoload'])) {
|
|
|
104 |
$chemins_widget = explode(';', self::$config[$this->widget]['autoload']);
|
|
|
105 |
foreach ($chemins_widget as $cle => $chemin) {
|
|
|
106 |
$chemins_widget[$cle] = self::$config['chemins']['widgetCourantDossier'].trim($chemin);
|
|
|
107 |
}
|
|
|
108 |
}
|
|
|
109 |
|
|
|
110 |
self::$autoload_chemins = array_merge($chemins_communs, $chemins_widget);
|
|
|
111 |
}
|
|
|
112 |
|
|
|
113 |
/**
|
|
|
114 |
* La méthode chargerClasse() charge dynamiquement les classes trouvées dans le code.
|
|
|
115 |
* Cette fonction est appelée par php5 quand il trouve une instanciation de classe dans le code.
|
|
|
116 |
*
|
|
|
117 |
*@param string le nom de la classe appelée.
|
|
|
118 |
*@return void le fichier contenant la classe doit être inclu par la fonction.
|
|
|
119 |
*/
|
|
|
120 |
public static function chargerClasse($classe) {
|
|
|
121 |
if (class_exists($classe)) {
|
|
|
122 |
return null;
|
|
|
123 |
}
|
|
|
124 |
foreach (self::$autoload_chemins as $chemin) {
|
|
|
125 |
$chemin = $chemin.$classe.'.php';
|
|
|
126 |
if (file_exists($chemin)) {
|
|
|
127 |
require_once $chemin;
|
|
|
128 |
}
|
|
|
129 |
}
|
|
|
130 |
}
|
|
|
131 |
|
|
|
132 |
|
|
|
133 |
/**
|
|
|
134 |
* Execute le widget.
|
|
|
135 |
*/
|
|
|
136 |
function executer() {
|
|
|
137 |
if (!is_null($this->widget)) {
|
|
|
138 |
$classe_widget = ucfirst($this->widget);
|
|
|
139 |
$fichier_widget = self::$config['chemins']['widgetCourantDossier'].$classe_widget.'.php';
|
|
|
140 |
if (file_exists($fichier_widget)) {
|
|
|
141 |
include_once $fichier_widget;
|
|
|
142 |
if (class_exists($classe_widget)) {
|
|
|
143 |
$widget = new $classe_widget(self::$config, $this->parametres);
|
|
|
144 |
$widget->executer();
|
|
|
145 |
}
|
|
|
146 |
}
|
|
|
147 |
}
|
|
|
148 |
}
|
|
|
149 |
|
|
|
150 |
/**
|
|
|
151 |
* Charge le fichier de config spécifique du wiget et fusionne la config avec celle partagés par l'ensemble des widgets.
|
|
|
152 |
*/
|
|
|
153 |
private function chargerWidgetConfig() {
|
|
|
154 |
$widget_config_ini_fichier = self::$config['chemins']['widgetCourantDossier'].'config.ini';
|
|
|
155 |
if (file_exists($widget_config_ini_fichier)) {
|
|
|
156 |
$widget_config = parse_ini_file($widget_config_ini_fichier, TRUE);
|
|
|
157 |
self::$config = array_merge(self::$config, $widget_config);
|
|
|
158 |
}
|
|
|
159 |
}
|
|
|
160 |
}
|
|
|
161 |
?>
|