Subversion Repositories eFlore/Applications.del

Rev

Rev 1876 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
983 aurelien 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&parametre2=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
 *
1876 jpm 11
 *
983 aurelien 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;
1876 jpm 22
 
983 aurelien 23
	/** Les chemins où l'autoload doit chercher des classes. */
24
	private static $autoload_chemins = array();
1876 jpm 25
 
983 aurelien 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);
1876 jpm 37
 
2152 mathias 38
		// Paramètres de config dynamiques
39
		$protocole = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) ? 'https://' : 'http://';
40
		self::$config['chemins']['baseURLAbsoluDyn'] = $protocole . $_SERVER['SERVER_NAME'].self::$config['chemins']['baseURL'].'%s';
1876 jpm 41
 
983 aurelien 42
		// Gestion de la mémoire maximum allouée aux services
43
		ini_set('memory_limit', self::$config['parametres']['limiteMemoire']);
1876 jpm 44
 
983 aurelien 45
		// Réglages de PHP
46
		setlocale(LC_ALL, self::$config['parametres']['locale']);
47
		date_default_timezone_set(self::$config['parametres']['fuseauHoraire']);
1876 jpm 48
 
983 aurelien 49
		// Gestion des erreurs
50
		error_reporting(self::$config['parametres']['erreurNiveau']);
1626 mathias 51
 
983 aurelien 52
		if (isset($_SERVER['REQUEST_URI']) && isset($_SERVER['QUERY_STRING'])) {
53
			$url_morceaux = $this->parserUrl();
54
			if (isset($url_morceaux[0])) {
55
				$this->widget = $url_morceaux[0];
56
				self::$config['chemins']['widgetCourantDossier'] = self::$config['chemins']['widgetsDossier'].strtolower($this->widget).DIRECTORY_SEPARATOR;
57
				$this->chargerWidgetConfig();
58
			}
59
			// Chargement des chemins pour l'autoload
60
			$this->chargerCheminAutoload();
1876 jpm 61
 
983 aurelien 62
			// Enregistrement de la méthode gérant l'autoload des classes
63
			spl_autoload_register(array('Widget', 'chargerClasse'));
1876 jpm 64
 
983 aurelien 65
			// Nettoyage du $_GET (sécurité)
66
			$this->collecterParametres();
67
		} else {
68
			$e = 'Les widget nécessite les variables serveurs suivantes pour fonctionner : REQUEST_URI et QUERY_STRING.';
69
			trigger_error($e, E_USER_ERROR);
70
		}
71
	}
1876 jpm 72
 
983 aurelien 73
	private function parserUrl() {
74
		if (strlen($_SERVER['QUERY_STRING']) == 0) {
75
			$len = strlen($_SERVER['REQUEST_URI']);
76
		} else {
77
			$len = -(strlen($_SERVER['QUERY_STRING']) + 1);
78
		}
79
		$url = substr($_SERVER['REQUEST_URI'], strlen(self::$config['chemins']['baseURL']), $len);
80
		$url_morceaux = explode('/', $url);
81
		return $url_morceaux;
82
	}
1876 jpm 83
 
983 aurelien 84
	private function collecterParametres() {
85
		if (isset($_GET) && $_GET != '') {
86
			$this->nettoyerGet();
87
			$this->parametres = $_GET;
88
		}
89
	}
1876 jpm 90
 
983 aurelien 91
	private function nettoyerGet() {
92
		foreach ($_GET as $cle => $valeur) {
1876 jpm 93
			$verifier = array('NULL', "\n", "\r", "\\", '"', "\x00", "\x1a", ';');
983 aurelien 94
			$_GET[$cle] = strip_tags(str_replace($verifier, '', $valeur));
95
		}
96
	}
1876 jpm 97
 
983 aurelien 98
	private function chargerCheminAutoload() {
99
		$chemins_communs = explode(';', self::$config['chemins']['autoload']);
100
		$chemins_communs = array_map('trim', $chemins_communs);
101
		array_unshift($chemins_communs, '');
1876 jpm 102
 
983 aurelien 103
		$chemins_widget = array();
104
		if (isset(self::$config[$this->widget]['autoload'])) {
105
			$chemins_widget = explode(';', self::$config[$this->widget]['autoload']);
106
			foreach ($chemins_widget as $cle => $chemin) {
107
				$chemins_widget[$cle] = self::$config['chemins']['widgetCourantDossier'].trim($chemin);
108
			}
109
		}
1876 jpm 110
 
983 aurelien 111
		self::$autoload_chemins = array_merge($chemins_communs, $chemins_widget);
112
	}
1876 jpm 113
 
983 aurelien 114
	/**
115
	* La méthode chargerClasse() charge dynamiquement les classes trouvées dans le code.
116
	* Cette fonction est appelée par php5 quand il trouve une instanciation de classe dans le code.
117
	*
118
	*@param string le nom de la classe appelée.
119
	*@return void le fichier contenant la classe doit être inclu par la fonction.
120
	*/
121
	public static function chargerClasse($classe) {
122
		if (class_exists($classe)) {
123
			return null;
124
		}
125
		foreach (self::$autoload_chemins as $chemin) {
126
			$chemin = $chemin.$classe.'.php';
127
			if (file_exists($chemin)) {
128
				require_once $chemin;
129
			}
130
		}
131
	}
1876 jpm 132
 
133
 
983 aurelien 134
	/**
135
	 * Execute le widget.
136
	 */
137
	function executer() {
138
		if (!is_null($this->widget)) {
139
			$classe_widget = ucfirst($this->widget);
140
			$fichier_widget = self::$config['chemins']['widgetCourantDossier'].$classe_widget.'.php';
141
			if (file_exists($fichier_widget))  {
142
				include_once $fichier_widget;
143
				if (class_exists($classe_widget)) {
144
					$widget = new $classe_widget(self::$config, $this->parametres);
145
					$widget->executer();
146
				}
147
			}
148
		}
149
	}
1876 jpm 150
 
983 aurelien 151
	/**
152
	 * Charge le fichier de config spécifique du wiget et fusionne la config avec celle partagés par l'ensemble des widgets.
153
	 */
154
	private function chargerWidgetConfig() {
155
		$widget_config_ini_fichier = self::$config['chemins']['widgetCourantDossier'].'config.ini';
156
		if (file_exists($widget_config_ini_fichier))  {
157
			$widget_config = parse_ini_file($widget_config_ini_fichier, TRUE);
158
			self::$config = array_merge(self::$config, $widget_config);
159
		}
160
	}
1876 jpm 161
}