Subversion Repositories Applications.reseau

Rev

Rev 5 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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