Subversion Repositories Applications.referentiel

Rev

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

Rev 30 Rev 142
1
<?php
1
<?php
2
// Encodage : UTF-8
2
// Encodage : UTF-8
3
// +-------------------------------------------------------------------------------------------------------------------+
3
// +-------------------------------------------------------------------------------------------------------------------+
4
/**
4
/**
5
* ScriptCommande
5
* ScriptCommande
6
*
6
*
7
* Description : classe abstraite des scripts
7
* Description : classe abstraite des scripts
8
* Fichier d'origine jelix-scripts par Jouanneau Laurent
8
* Fichier d'origine jelix-scripts par Jouanneau Laurent
9
* copyright		2005-2007 Jouanneau laurent
9
* copyright		2005-2007 Jouanneau laurent
10
* link			http://www.jelix.org
10
* link			http://www.jelix.org
11
* 
11
* 
12
//Auteur original :
12
//Auteur original :
13
* @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
* @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
14
* @copyright	Tela-Botanica 1999-2008
14
* @copyright	Tela-Botanica 1999-2008
15
* @licence		GPL v3 & CeCILL v2
15
* @licence		GPL v3 & CeCILL v2
16
* @version		$Id: ScriptCommande.class.php 1948 2009-09-03 14:12:02Z Jean-Pascal MILCENT $
16
* @version		$Id: ScriptCommande.class.php 1948 2009-09-03 14:12:02Z Jean-Pascal MILCENT $
17
*/
17
*/
18
// +-------------------------------------------------------------------------------------------------------------------+
18
// +-------------------------------------------------------------------------------------------------------------------+
19
// TODO : supprimer les classe getStaticIni(), getStaticParam() et getStaticNom(). Utiliser une seule méthode qui gère les deux méthodes d'appel.
19
// TODO : supprimer les classe getStaticIni(), getStaticParam() et getStaticNom(). Utiliser une seule méthode qui gère les deux méthodes d'appel.
20
/**
20
/**
21
* classe representant une commande
21
* classe representant une commande
22
*/
22
*/
23
abstract class ScriptCommande extends Controleur {
23
abstract class ScriptCommande extends Controleur {
24
 
24
 
25
	public $nom;
25
	public $nom;
26
	public $parametres;
26
	public $parametres;
27
	
27
	
28
	
28
	
29
	/**
29
	/**
30
	 * Paramêtres disponible pour la ligne de commande
30
	 * Paramêtres disponible pour la ligne de commande
31
	 * le tableau se construit de la forme suivnate :	
31
	 * le tableau se construit de la forme suivnate :	
32
	 * - clé =  nom du paramêtre '-foo'
32
	 * - clé =  nom du paramêtre '-foo'
33
	 * - value = contient un nouveau tableau composé de cette façaon :
33
	 * - value = contient un nouveau tableau composé de cette façaon :
34
	 *  - booléen: true si le paramêtre est obligatoire
34
	 *  - booléen: true si le paramêtre est obligatoire
35
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
35
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
36
	 *  - string: description du contenu du paramêtre
36
	 *  - string: description du contenu du paramêtre
37
	 * Les paramêtres optionels devraient être déclaré à la fin du tableau.
37
	 * Les paramêtres optionels devraient être déclaré à la fin du tableau.
38
	 * Le dernier parametre du tableau peut avoir la valeur '...',
38
	 * Le dernier parametre du tableau peut avoir la valeur '...',
39
	 * il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
39
	 * il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
40
	 * @var array
40
	 * @var array
41
	 */
41
	 */
42
	private $_parametres_autorises = array(	'-p' => array(true, true, 'Projet, le nom utiliser pour le fichier ini'),
42
	private $_parametres_autorises = array(	'-a' => array(true, true, 'Action à réaliser'),
43
											'-a' => array(true, true, 'Action à réaliser'),
-
 
44
											'-v' => array(false, '1', 'Mode verbeux : 1 ou 2'),
43
											'-v' => array(false, '1', 'Mode verbeux : 1 ou 2'),
45
											'-t' => array(false, '', 'Test sur un nombre de ligne...'));
44
											'-t' => array(false, '', 'Test sur un nombre de ligne...'));
46
	/**
45
	/**
47
	 * Contient les valeurs des paramêtres récupérés de la ligne de commande :
46
	 * Contient les valeurs des paramêtres récupérés de la ligne de commande :
48
	 * le tableau se construit de la forme suivnate :	
47
	 * le tableau se construit de la forme suivnate :	
49
	 * - clé =  nom du paramêtre '-foo'
48
	 * - clé =  nom du paramêtre '-foo'
50
	 * - valeur = la valeur récupérée sur la ligne de commande
49
	 * - valeur = la valeur récupérée sur la ligne de commande
51
	 * @var array
50
	 * @var array
52
	 */
51
	 */
53
	private $_parametres;
52
	private $_parametres;
54
 
53
 
55
	private static $_static_nom;
54
	private static $_static_nom;
56
	private static $_static_parametres;
55
	private static $_static_parametres;
57
	private static $_static_ini;
56
	private static $_static_ini;
58
	private static $log = '';
57
	private static $log = '';
59
	private static $log_fichier;
58
	private static $log_fichier;
60
	private static $log_resource;
59
	private static $log_resource;
61
	private static $log_fichier_ecraser = false;
60
	private static $log_fichier_ecraser = false;
62
 
61
 
63
	public $syntaxhelp = '';
62
	public $syntaxhelp = '';
64
	public $help = 'Aucune aide pour cette commande';
63
	public $help = 'Aucune aide pour cette commande';
65
 
64
 
66
	function __construct($commande_nom) {
65
	function __construct($commande_nom) {
67
		$this->setNom($commande_nom);
66
		$this->setNom($commande_nom);
68
		parent::__construct();
67
		parent::__construct();
69
	}
68
	}
70
	
69
	
71
	public function __destruct() {
70
	public function __destruct() {
72
		if (isset(self::$log_resource)) {
71
		if (isset(self::$log_resource)) {
73
			if (fclose(self::$log_resource)) {
72
			if (fclose(self::$log_resource)) {
74
				self::$log_resource = null;
73
				self::$log_resource = null;
75
			}
74
			}
76
		}	
75
		}	
77
	}
76
	}
78
	
77
	
79
	public function getNom() {
78
	public function getNom() {
80
		return $this->nom;
79
		return $this->nom;
81
	}
80
	}
82
	
81
	
83
	public static function getStaticNom() {
82
	public static function getStaticNom() {
84
		return self::$_static_nom;
83
		return self::$_static_nom;
85
	}
84
	}
86
	
85
	
87
	private function setNom($script_nom) {
86
	private function setNom($script_nom) {
88
		$this->nom = $script_nom;
87
		$this->nom = $script_nom;
89
		self::$_static_nom = $script_nom;
88
		self::$_static_nom = $script_nom;
90
	}
89
	}
91
	
90
	
92
	public static function getLog() {
91
	public static function getLog() {
93
		return self::$log;
92
		return self::$log;
94
	}
93
	}
95
	
94
	
96
	public static function setLog($l) {
95
	public static function setLog($l) {
97
		self::$log .= $l;
96
		self::$log .= $l;
98
	}
97
	}
99
	
98
	
100
	public function initialiser($plc) {
99
	public function initialiser($plc) {
101
		// Récupération des paramêtres autorisés par le script
100
		// Récupération des paramêtres autorisés par le script
102
		$this->setParamAutorises($this->parametres);
101
		$this->setParamAutorises($this->parametres);
103
		
102
		
104
		// Vérification et récupération des paramêtres de la ligne de commande
103
		// Vérification et récupération des paramêtres de la ligne de commande
105
		if ($parametres = $this->verifierParametres($plc, $this->getParamAutorises())) {
104
		if ($parametres = $this->verifierParametres($plc, $this->getParamAutorises())) {
106
			$this->setParam($parametres);
105
			$this->setParam($parametres);
107
		}
106
		}
108
		
-
 
109
		// Tableaux des emplacements des fichiers ini à rechercher et à charger dans l'ordre du tableau
-
 
110
		$projet_prefixe = '';
-
 
111
		if (preg_match('/^([^_]+)/', $this->getParam('p'), $match)) {
-
 
112
			$projet_prefixe = $match[1];
107
		
113
		}
108
 
114
		$tab_fichiers_ini = array(	ES_CHEMIN_CONFIG.'bdd.ini', // Paramêtres de la base de données
109
		$tab_fichiers_ini = array(	ES_CHEMIN_CONFIG.'bdd.ini', // Paramêtres de la base de données
115
									ES_CHEMIN_CONFIG.'commun.ini', // Paramêtres communs aux différents projets
-
 
116
									$this->getModuleChemin().$this->getParam('p').'.ini',
110
									ES_CHEMIN_CONFIG.'commun.ini', // Paramêtres communs aux différents projets
117
									$this->getModuleChemin().DS.'configurations'.DS.$this->getParam('p').'.ini');
111
									$this->getModuleChemin().DS.'configurations'.DS.'config.ini');
118
		
112
		
119
		// Chargement des fichiers ini généraux 
113
		// Chargement des fichiers ini généraux 
120
		for ($i = 0; $i < 2 ; $i++) {
114
		for ($i = 0; $i < 2 ; $i++) {
121
			if (!$this->parserFichierIni($tab_fichiers_ini[$i])) {
115
			if (!$this->parserFichierIni($tab_fichiers_ini[$i])) {
122
				$e = "Le fichier $tab_fichiers_ini[$i] est introuvable\n";
116
				$e = "Le fichier $tab_fichiers_ini[$i] est introuvable\n";
123
				trigger_error($e, E_USER_WARNING);
117
				trigger_error($e, E_USER_WARNING);
124
			}
118
			}
125
		}
119
		}
126
		// Chargement du fichier ini du projet
-
 
127
		$erreur_ini_projet = true; 
-
 
128
		for ($i = 2; $i < 4 ; $i++) {
-
 
129
			if ($this->parserFichierIni($tab_fichiers_ini[$i])) {
-
 
130
				$erreur_ini_projet = false;
-
 
131
			}
-
 
132
		}
-
 
133
		if ($erreur_ini_projet) {
-
 
134
			$e = "Le fichier .ini du projet est introuvable : \n".$tab_fichiers_ini[2]."\n".$tab_fichiers_ini[3]."\n";
-
 
135
			trigger_error($e, E_USER_WARNING);
-
 
136
		}
-
 
137
	}
120
	}
138
 
121
 
139
	abstract public function executer();
122
	abstract public function executer();
140
 
123
 
141
	protected function getModuleChemin($shouldexist = true) {
124
	protected function getModuleChemin($shouldexist = true) {
142
		$chemin = ES_CHEMIN_MODULE.$this->getNom().DS;
125
		$chemin = ES_CHEMIN_MODULE.$this->getNom().DS;
143
		if (!file_exists($chemin) && $shouldexist) {
126
		if (!file_exists($chemin) && $shouldexist) {
144
			trigger_error("Erreur: le module '".$this->getNom()."' n'existe pas ($chemin)\n", E_USER_ERROR);
127
			trigger_error("Erreur: le module '".$this->getNom()."' n'existe pas ($chemin)\n", E_USER_ERROR);
145
		}
128
		}
146
		return $chemin;
129
		return $chemin;
147
	}
130
	}
148
	
131
	
149
	private function verifierParametres($p_ligne, $p_autorise) {
132
	private function verifierParametres($p_ligne, $p_autorise) {
150
	
133
	
151
		//print_r($p_ligne);
134
		//print_r($p_ligne);
152
		// Récupération des paramêtres
135
		// Récupération des paramêtres
153
		foreach ($p_autorise as $p_nom => $p_val) {
136
		foreach ($p_autorise as $p_nom => $p_val) {
154
			if (count($p_ligne) == 0) {
137
			if (count($p_ligne) == 0) {
155
				if ($p_val[0]) {
138
				if ($p_val[0]) {
156
					trigger_error("Erreur: paramêtre manquant '".$p_nom."' \n", E_USER_WARNING);
139
					trigger_error("Erreur: paramêtre manquant '".$p_nom."' \n", E_USER_WARNING);
157
				}
140
				}
158
			}
141
			}
159
			if ($p_nom == '...') {
142
			if ($p_nom == '...') {
160
				$parametres['...'] = array();
143
				$parametres['...'] = array();
161
				foreach($p_ligne as $arg) {
144
				foreach($p_ligne as $arg) {
162
					$parametres['...'][] = $arg;
145
					$parametres['...'][] = $arg;
163
				}
146
				}
164
				$p_ligne = array();
147
				$p_ligne = array();
165
				break;
148
				break;
166
			} else {
149
			} else {
167
				if (isset($p_ligne[$p_nom])) {
150
				if (isset($p_ligne[$p_nom])) {
168
					// Attribution de la valeur issue de la ligne de commande
151
					// Attribution de la valeur issue de la ligne de commande
169
					$parametres[ltrim($p_nom, '-')] = $p_ligne[$p_nom];
152
					$parametres[ltrim($p_nom, '-')] = $p_ligne[$p_nom];
170
					unset($p_ligne[$p_nom]);
153
					unset($p_ligne[$p_nom]);
171
				} else {
154
				} else {
172
					// Attribution de la valeur par défaut
155
					// Attribution de la valeur par défaut
173
					if ($p_val[1] !== true) {
156
					if ($p_val[1] !== true) {
174
						$parametres[ltrim($p_nom, '-')] = $p_val[1];
157
						$parametres[ltrim($p_nom, '-')] = $p_val[1];
175
					}
158
					}
176
				}
159
				}
177
			}
160
			}
178
		}
161
		}
179
		
162
		
180
		// Gestion de l'excédant de paramêtres
163
		// Gestion de l'excédant de paramêtres
181
		if (count($p_ligne)) {
164
		if (count($p_ligne)) {
182
			trigger_error("Erreur: trop de paramêtres\n", E_USER_ERROR);
165
			trigger_error("Erreur: trop de paramêtres\n", E_USER_ERROR);
183
		}
166
		}
184
		
167
		
185
		return $parametres;
168
		return $parametres;
186
	}
169
	}
187
	
170
	
188
	protected function setParamAutorises($param) {
171
	protected function setParamAutorises($param) {
189
		if (!is_null($param)) {
172
		if (!is_null($param)) {
190
			foreach ($param as $c => $v) {
173
			foreach ($param as $c => $v) {
191
				if (isset($this->_parametres_autorises[$c])) {
174
				if (isset($this->_parametres_autorises[$c])) {
192
					trigger_error("Erreur: le module '".$this->getNom()."' ne peut définir le paramêtre '$c' car il existe déjà\n", E_USER_ERROR);
175
					trigger_error("Erreur: le module '".$this->getNom()."' ne peut définir le paramêtre '$c' car il existe déjà\n", E_USER_ERROR);
193
				} else {
176
				} else {
194
					$this->_parametres_autorises[$c] = $v;
177
					$this->_parametres_autorises[$c] = $v;
195
				}
178
				}
196
			}
179
			}
197
		}
180
		}
198
	}
181
	}
199
	
182
	
200
	protected function getParamAutorises($param = null) {
183
	protected function getParamAutorises($param = null) {
201
		
184
		
202
		if (!is_null($param)) {
185
		if (!is_null($param)) {
203
			if (isset($this->_parametres_autorises['-'.$param])) {
186
			if (isset($this->_parametres_autorises['-'.$param])) {
204
				return $this->_parametres_autorises['-'.$param];
187
				return $this->_parametres_autorises['-'.$param];
205
			} else if (isset($this->_parametres_autorises[$param])) {
188
			} else if (isset($this->_parametres_autorises[$param])) {
206
				return $this->_parametres_autorises[$param];
189
				return $this->_parametres_autorises[$param];
207
			} else {
190
			} else {
208
				trigger_error("Erreur: le module '".$this->getNom()."' n'a pas défini le paramêtre '$param'\n", E_USER_WARNING);
191
				trigger_error("Erreur: le module '".$this->getNom()."' n'a pas défini le paramêtre '$param'\n", E_USER_WARNING);
209
				return false;
192
				return false;
210
			}
193
			}
211
		} else {
194
		} else {
212
			return $this->_parametres_autorises;
195
			return $this->_parametres_autorises;
213
		}
196
		}
214
	}
197
	}
215
	
198
	
216
	protected function setParam($params = array(), $val = null) {
199
	protected function setParam($params = array(), $val = null) {
217
		
200
		
218
		if (is_array($params)) {
201
		if (is_array($params)) {
219
			$this->_parametres = $params;
202
			$this->_parametres = $params;
220
			self::$_static_parametres = $params;
203
			self::$_static_parametres = $params;
221
		} else if (!is_array($params) && !is_null($val)) {
204
		} else if (!is_array($params) && !is_null($val)) {
222
			$this->_parametres[$params] = $val;
205
			$this->_parametres[$params] = $val;
223
			self::$_static_parametres[$params] = $val;
206
			self::$_static_parametres[$params] = $val;
224
		} else {
207
		} else {
225
			return false;
208
			return false;
226
		}
209
		}
227
	}
210
	}
228
	
211
	
229
	protected function getParam($param = null) {
212
	protected function getParam($param = null) {
230
		
213
		
231
		if (!is_null($param)) {
214
		if (!is_null($param)) {
232
			if (isset($this->_parametres['-'.$param])) {
215
			if (isset($this->_parametres['-'.$param])) {
233
				return $this->_parametres['-'.$param];
216
				return $this->_parametres['-'.$param];
234
			} else if (isset($this->_parametres[$param])) {
217
			} else if (isset($this->_parametres[$param])) {
235
				return $this->_parametres[$param];
218
				return $this->_parametres[$param];
236
			} else {
219
			} else {
237
				trigger_error("Erreur: la ligne de commande ne contenait pas le paramêtre '$param'\n", E_USER_WARNING);
220
				trigger_error("Erreur: la ligne de commande ne contenait pas le paramêtre '$param'\n", E_USER_WARNING);
238
				return false;
221
				return false;
239
			}
222
			}
240
		} else {
223
		} else {
241
			return $this->_parametres;
224
			return $this->_parametres;
242
		}
225
		}
243
	}
226
	}
244
	
227
	
245
	protected static function getStaticParam($param = null) {
228
	protected static function getStaticParam($param = null) {
246
		
229
		
247
		if (!is_null($param)) {
230
		if (!is_null($param)) {
248
			if (isset(self::$_static_parametres['-'.$param])) {
231
			if (isset(self::$_static_parametres['-'.$param])) {
249
				return self::$_static_parametres['-'.$param];
232
				return self::$_static_parametres['-'.$param];
250
			} else if (isset(self::$_static_parametres[$param])) {
233
			} else if (isset(self::$_static_parametres[$param])) {
251
				return self::$_static_parametres[$param];
234
				return self::$_static_parametres[$param];
252
			} else {
235
			} else {
253
				trigger_error("Erreur: la ligne de commande ne contenait pas le paramêtre '$param'\n", E_USER_WARNING);
236
				trigger_error("Erreur: la ligne de commande ne contenait pas le paramêtre '$param'\n", E_USER_WARNING);
254
				return false;
237
				return false;
255
			}
238
			}
256
		} else {
239
		} else {
257
			return self::$_static_parametres;
240
			return self::$_static_parametres;
258
		}
241
		}
259
	}
242
	}
260
	
243
	
261
	protected function getIni($nom) {
244
	protected function getIni($nom) {
262
		if (isset($this->_ini[$nom])) {
245
		if (isset($this->_ini[$nom])) {
263
			 return $this->_ini[$nom];
246
			 return $this->_ini[$nom];
264
		 } else {
247
		 } else {
265
			 return false;
248
			 return false;
266
		 }
249
		 }
267
	}
250
	}
268
	
251
	
269
	protected static function getStaticIni($nom) {
252
	protected static function getStaticIni($nom) {
270
		if (isset(self::$_static_ini[$nom])) {
253
		if (isset(self::$_static_ini[$nom])) {
271
			 return self::$_static_ini[$nom];
254
			 return self::$_static_ini[$nom];
272
		 } else {
255
		 } else {
273
			 return false;
256
			 return false;
274
		 }
257
		 }
275
	}
258
	}
276
	
259
	
277
	protected function parserFichierIni($fichier_ini) {
260
	protected function parserFichierIni($fichier_ini) {
278
    	if (file_exists($fichier_ini)) {
261
    	if (file_exists($fichier_ini)) {
279
			$aso_ini = parse_ini_file($fichier_ini);
262
			$aso_ini = parse_ini_file($fichier_ini);
280
	    	foreach ($aso_ini as $cle => $val) {
263
	    	foreach ($aso_ini as $cle => $val) {
281
	    		if (preg_match('/^php:(.+)$/', $val, $correspondances)) {
264
	    		if (preg_match('/^php:(.+)$/', $val, $correspondances)) {
282
	    			eval('$this->$cle = '.$correspondances[1].';');
265
	    			eval('$this->$cle = '.$correspondances[1].';');
283
	    			eval('$this->_ini[$cle] = '.$correspondances[1].';');
266
	    			eval('$this->_ini[$cle] = '.$correspondances[1].';');
284
	    		} else if (preg_match('/^php-static:(.+)$/', $val, $correspondances)) {
267
	    		} else if (preg_match('/^php-static:(.+)$/', $val, $correspondances)) {
285
	    			eval('self::$'.$cle.' = '.$correspondances[1].';');
268
	    			eval('self::$'.$cle.' = '.$correspondances[1].';');
286
	    			eval('$this->_ini[$cle] = '.$correspondances[1].';');
269
	    			eval('$this->_ini[$cle] = '.$correspondances[1].';');
287
	    		} else {
270
	    		} else {
288
	    			// Ancienne forme : compatibilité avec les anciens scripts...
271
	    			// Ancienne forme : compatibilité avec les anciens scripts...
289
	    			$this->$cle = $val;
272
	    			$this->$cle = $val;
290
	    			// Nouvelle forme : utilisation de la méthode getInit().
273
	    			// Nouvelle forme : utilisation de la méthode getInit().
291
	    			$this->_ini[$cle] = $val;
274
	    			$this->_ini[$cle] = $val;
292
	    		}
275
	    		}
293
	    	}
276
	    	}
294
	    	self::$_static_ini = $this->_ini;
277
	    	self::$_static_ini = $this->_ini;
295
	    	return true;
278
	    	return true;
296
    	} else {
279
    	} else {
297
    		return false;
280
    		return false;
298
    	}
281
    	}
299
	}
282
	}
300
	
283
	
301
	// Log Resource
284
	// Log Resource
302
	/**
285
	/**
303
	* Lit la valeur de l'attribut Log Resource.
286
	* Lit la valeur de l'attribut Log Resource.
304
	* Utilise le motif de conception (= design pattern) Singleton.
287
	* Utilise le motif de conception (= design pattern) Singleton.
305
	* 
288
	* 
306
	* @access public
289
	* @access public
307
	* @param string le préfixe du nom de fichier à créer.
290
	* @param string le préfixe du nom de fichier à créer.
308
	* @return string retourne le Log Resource.
291
	* @return string retourne le Log Resource.
309
	*/
292
	*/
310
	public static function getLogResource() {
293
	public static function getLogResource() {
311
		if (!isset(self::$log_resource)) {
294
		if (!isset(self::$log_resource)) {
312
			if (file_exists(self::getLogFichier()) && !self::$log_fichier_ecraser) {
295
			if (file_exists(self::getLogFichier()) && !self::$log_fichier_ecraser) {
313
				// Ouvre en écriture seule ; place le pointeur de fichier à la fin du fichier. Si le fichier 
296
				// Ouvre en écriture seule ; place le pointeur de fichier à la fin du fichier. Si le fichier 
314
				// n'existe pas, on tente de le créer.
297
				// n'existe pas, on tente de le créer.
315
				self::$log_resource = fopen(self::getLogFichier(), 'a');
298
				self::$log_resource = fopen(self::getLogFichier(), 'a');
316
			} else {
299
			} else {
317
				//Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille 
300
				//Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille 
318
				// du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
301
				// du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
319
				self::$log_resource = fopen(self::getLogFichier(), 'w');
302
				self::$log_resource = fopen(self::getLogFichier(), 'w');
320
				$entete_utf8 = "\xEF\xBB\xBF";
303
				$entete_utf8 = "\xEF\xBB\xBF";
321
				if (!fwrite(self::$log_resource, $entete_utf8)) {
304
				if (!fwrite(self::$log_resource, $entete_utf8)) {
322
					echo "Erreur écriture dans le fichier de log lors de l'ajout de l'entête UTF8.\n";
305
					echo "Erreur écriture dans le fichier de log lors de l'ajout de l'entête UTF8.\n";
323
				}
306
				}
324
			}
307
			}
325
		}
308
		}
326
		return self::$log_resource;
309
		return self::$log_resource;
327
	}
310
	}
328
 
311
 
329
	// Log Fichier
312
	// Log Fichier
330
	/**
313
	/**
331
	* Lit la valeur de l'attribut Log Fichier.
314
	* Lit la valeur de l'attribut Log Fichier.
332
	* Utilise le motif de conception (= design pattern) Singleton.
315
	* Utilise le motif de conception (= design pattern) Singleton.
333
	* 
316
	* 
334
	* @access public
317
	* @access public
335
	* @return string retourne le nom du fichier de log.
318
	* @return string retourne le nom du fichier de log.
336
	*/
319
	*/
337
	public static function getLogFichier() {
320
	public static function getLogFichier() {
338
		if (!isset(self::$log_fichier)) {
321
		if (!isset(self::$log_fichier)) {
339
			if (self::getStaticIni('projet_nom') && self::getStaticIni('version') && self::getStaticIni('sous_version')) {
322
			if (self::getStaticIni('projet_nom') && self::getStaticIni('version') && self::getStaticIni('sous_version')) {
340
				$fichier =	self::getStaticIni('projet_nom').'_'.
323
				$fichier =	self::getStaticIni('projet_nom').'_'.
341
							self::getStaticNom().'_'.
324
							self::getStaticNom().'_'.
342
							self::getStaticParam('a').'_'.
325
							self::getStaticParam('a').'_'.
343
							'v'.self::getStaticIni('version').'_'.self::getStaticIni('sous_version');
326
							'v'.self::getStaticIni('version').'_'.self::getStaticIni('sous_version');
344
			} else {
327
			} else {
345
				$fichier = self::getStaticNom().'_'.self::getStaticParam('a');
328
				$fichier = self::getStaticNom().'_'.self::getStaticParam('a');
346
			}
329
			}
347
			
330
			
348
			if (!self::$log_fichier_ecraser) {
331
			if (!self::$log_fichier_ecraser) {
349
				$fichier .= '_'.date('Y-m-j_H:i:s', time());
332
				$fichier .= '_'.date('Y-m-j_H:i:s', time());
350
			}
333
			}
351
			$fichier .= '.log';
334
			$fichier .= '.log';
352
			// Ajout du chemin vers le fichier de log et stockage dans variable static
335
			// Ajout du chemin vers le fichier de log et stockage dans variable static
353
			self::$log_fichier = self::getStaticIni('log_chemin').$fichier;
336
			self::$log_fichier = self::getStaticIni('log_chemin').$fichier;
354
		}
337
		}
355
		return self::$log_fichier;
338
		return self::$log_fichier;
356
	}
339
	}
357
	
340
	
358
	/** 
341
	/** 
359
	 * Retourne un message d'avertissement formaté.
342
	 * Retourne un message d'avertissement formaté.
360
	 * 
343
	 * 
361
	 * @param string le message d'erreur avec des %s.
344
	 * @param string le message d'erreur avec des %s.
362
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
345
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
363
	 * @param int le niveau de verbosité à dépasser pour afficher les messages.
346
	 * @param int le niveau de verbosité à dépasser pour afficher les messages.
364
	 * @return string le message d'erreur formaté.
347
	 * @return string le message d'erreur formaté.
365
	 */
348
	 */
366
	private function traiterMessage($message, $tab_arguments = array(), $niveau = 0) {
349
	private function traiterMessage($message, $tab_arguments = array(), $niveau = 0) {
367
		// Nous ajoutons dans le texte les infos provenant de la BDD (déjà encodées en UTF-8).
350
		// Nous ajoutons dans le texte les infos provenant de la BDD (déjà encodées en UTF-8).
368
		$texte = vsprintf($message, $tab_arguments);
351
		$texte = vsprintf($message, $tab_arguments);
369
		if ($this->getParam('v') >= $niveau) {
352
		if ($this->getParam('v') >= $niveau) {
370
			$prefixe = '';
353
			$prefixe = '';
371
			if ($this->getIni('projet_nom') && $this->getIni('version') && $this->getIni('sous_version')) {
354
			if ($this->getIni('projet_nom') && $this->getIni('version') && $this->getIni('sous_version')) {
372
				$prefixe = $this->getIni('projet_nom').'v'.$this->getIni('version').'.'.$this->getIni('sous_version').'. ';
355
				$prefixe = $this->getIni('projet_nom').'v'.$this->getIni('version').'.'.$this->getIni('sous_version').'. ';
373
			} else {
356
			} else {
374
				$prefixe = date('Y-m-j_H:i:s', time()).' - '.Script::getCode($niveau).' : ';
357
				$prefixe = date('Y-m-j_H:i:s', time()).' - '.Script::getCode($niveau).' : ';
375
			}
358
			}
376
			$log = $prefixe.$texte."\n";
359
			$log = $prefixe.$texte."\n";
377
			echo $log;
360
			echo $log;
378
			self::setLog($log);
361
			self::setLog($log);
379
			
362
			
380
			if (!fwrite($this->getLogResource(), $log)) {
363
			if (!fwrite($this->getLogResource(), $log)) {
381
				trigger_error('Erreur écriture dans le fichier de log.'."\n", E_USER_WARNING);
364
				trigger_error('Erreur écriture dans le fichier de log.'."\n", E_USER_WARNING);
382
			}
365
			}
383
		}
366
		}
384
		return "\t".$texte."\n";
367
		return "\t".$texte."\n";
385
	}
368
	}
386
	
369
	
387
	/** 
370
	/** 
388
	 * Retourne un message d'erreur après avoir écrit le message danns le fichier de log.
371
	 * Retourne un message d'erreur après avoir écrit le message danns le fichier de log.
389
	 * Si le mode verbeux est inactivé, écrit le message dans le fichier de log.
372
	 * Si le mode verbeux est inactivé, écrit le message dans le fichier de log.
390
	 * Si le mode verbeux de niveau 1 ou plus est activé, écrit le message dans le fichier de log et dans la console.
373
	 * Si le mode verbeux de niveau 1 ou plus est activé, écrit le message dans le fichier de log et dans la console.
391
	 *  
374
	 *  
392
	 * @param string le message d'erreur avec des %s.
375
	 * @param string le message d'erreur avec des %s.
393
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
376
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
394
	 * @return string le message d'erreur formaté.
377
	 * @return string le message d'erreur formaté.
395
	 */
378
	 */
396
	protected function traiterErreur($message, $tab_arguments = array()) {
379
	protected function traiterErreur($message, $tab_arguments = array()) {
397
		$niveau = Script::ERREUR;
380
		$niveau = Script::ERREUR;
398
		return $this->traiterMessage($message, $tab_arguments, $niveau);
381
		return $this->traiterMessage($message, $tab_arguments, $niveau);
399
	}
382
	}
400
	
383
	
401
	/** 
384
	/** 
402
	 * Retourne un message d'avertissement formaté.
385
	 * Retourne un message d'avertissement formaté.
403
	 * Si le mode verbeux de niveau 1 est activé, écrit le message dans le fichier de log.
386
	 * Si le mode verbeux de niveau 1 est activé, écrit le message dans le fichier de log.
404
	 * Si le mode verbeux de niveau 2 est activé, écrit le message dans le fichier de log et dans la console.
387
	 * Si le mode verbeux de niveau 2 est activé, écrit le message dans le fichier de log et dans la console.
405
	 * 
388
	 * 
406
	 * @param string le message d'erreur avec des %s.
389
	 * @param string le message d'erreur avec des %s.
407
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
390
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
408
	 * @return string le message d'erreur formaté.
391
	 * @return string le message d'erreur formaté.
409
	 */
392
	 */
410
	protected function traiterAttention($message, $tab_arguments = array()) {
393
	protected function traiterAttention($message, $tab_arguments = array()) {
411
		$niveau = Script::AVERTISSEMENT;
394
		$niveau = Script::AVERTISSEMENT;
412
		return $this->traiterMessage($message, $tab_arguments, $niveau);
395
		return $this->traiterMessage($message, $tab_arguments, $niveau);
413
	}
396
	}
414
	
397
	
415
	/** 
398
	/** 
416
	 * Retourne un message d'information formaté.
399
	 * Retourne un message d'information formaté.
417
	 * Si le mode verbeux de niveau 2 est activé, écrit le message dans le fichier de log.
400
	 * Si le mode verbeux de niveau 2 est activé, écrit le message dans le fichier de log.
418
	 * Si le mode verbeux de niveau 3 est activé, écrit le message dans le fichier de log et dans la console.
401
	 * Si le mode verbeux de niveau 3 est activé, écrit le message dans le fichier de log et dans la console.
419
	 * 
402
	 * 
420
	 * @param string le message d'information avec des %s.
403
	 * @param string le message d'information avec des %s.
421
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
404
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
422
	 * @param int le niveau de verbosité à dépasser pour afficher les messages.
405
	 * @param int le niveau de verbosité à dépasser pour afficher les messages.
423
	 * @return string le message d'erreur formaté.
406
	 * @return string le message d'erreur formaté.
424
	 */
407
	 */
425
	protected function afficher($message, $tab_arguments = array(), $niveau = null) {
408
	protected function afficher($message, $tab_arguments = array(), $niveau = null) {
426
		if (is_null($niveau)) {
409
		if (is_null($niveau)) {
427
			$niveau = Script::INFO;
410
			$niveau = Script::INFO;
428
		}
411
		}
429
		$msg = $this->traiterMessage($message, $tab_arguments, $niveau);
412
		$msg = $this->traiterMessage($message, $tab_arguments, $niveau);
430
		return $msg ;
413
		return $msg ;
431
	}
414
	}
432
	
415
	
433
	/**
416
	/**
434
	 * Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
417
	 * Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
435
	 * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
418
	 * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
436
	 *
419
	 *
437
	 * @param String $fichier	le chemin du fichier du squelette
420
	 * @param String $fichier	le chemin du fichier du squelette
438
	 * @param Array  $donnees	un tableau associatif contenant les variables a injecter dans le squelette.
421
	 * @param Array  $donnees	un tableau associatif contenant les variables a injecter dans le squelette.
439
	 *
422
	 *
440
	 * @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
423
	 * @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
441
	 */
424
	 */
442
	public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
425
	public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
443
		$sortie = false;
426
		$sortie = false;
444
		if (file_exists($fichier)) {
427
		if (file_exists($fichier)) {
445
			// Extraction des variables du tableau de données
428
			// Extraction des variables du tableau de données
446
			extract($donnees);
429
			extract($donnees);
447
			// Démarage de la bufferisation de sortie
430
			// Démarage de la bufferisation de sortie
448
			ob_start();
431
			ob_start();
449
			// Si les tags courts sont activés
432
			// Si les tags courts sont activés
450
			if ((bool) @ini_get('short_open_tag') === true) {
433
			if ((bool) @ini_get('short_open_tag') === true) {
451
				// Simple inclusion du squelette
434
				// Simple inclusion du squelette
452
				include $fichier;
435
				include $fichier;
453
			} else {
436
			} else {
454
				// Sinon, remplacement des tags courts par la syntaxe classique avec echo
437
				// Sinon, remplacement des tags courts par la syntaxe classique avec echo
455
				$html_et_code_php = self::traiterTagsCourts($fichier);
438
				$html_et_code_php = self::traiterTagsCourts($fichier);
456
				// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
439
				// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
457
				$html_et_code_php = '?>'.$html_et_code_php;
440
				$html_et_code_php = '?>'.$html_et_code_php;
458
				// Interprétation du html et du php dans le buffer
441
				// Interprétation du html et du php dans le buffer
459
				echo eval($html_et_code_php);
442
				echo eval($html_et_code_php);
460
			}
443
			}
461
			// Récupèration du contenu du buffer
444
			// Récupèration du contenu du buffer
462
			$sortie = ob_get_contents();
445
			$sortie = ob_get_contents();
463
			// Suppression du buffer
446
			// Suppression du buffer
464
			@ob_end_clean();
447
			@ob_end_clean();
465
		} else {
448
		} else {
466
			$msg = "Le fichier du squelette '$fichier' n'existe pas.";
449
			$msg = "Le fichier du squelette '$fichier' n'existe pas.";
467
			trigger_error($msg, E_USER_WARNING);
450
			trigger_error($msg, E_USER_WARNING);
468
		}
451
		}
469
		// Retourne le contenu
452
		// Retourne le contenu
470
		return $sortie;
453
		return $sortie;
471
	}
454
	}
472
	
455
	
473
	/**
456
	/**
474
	 * Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
457
	 * Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
475
	 *
458
	 *
476
	 * @param String $chemin_squelette le chemin du fichier du squelette
459
	 * @param String $chemin_squelette le chemin du fichier du squelette
477
	 *
460
	 *
478
	 * @return string le contenu du fichier du squelette php avec les tags courts remplacés.
461
	 * @return string le contenu du fichier du squelette php avec les tags courts remplacés.
479
	 */
462
	 */
480
	private static function traiterTagsCourts($chemin_squelette) {
463
	private static function traiterTagsCourts($chemin_squelette) {
481
		$contenu = file_get_contents($chemin_squelette);
464
		$contenu = file_get_contents($chemin_squelette);
482
		// Remplacement de tags courts par un tag long avec echo
465
		// Remplacement de tags courts par un tag long avec echo
483
		$contenu = str_replace('<?=', '<?php echo ',  $contenu);
466
		$contenu = str_replace('<?=', '<?php echo ',  $contenu);
484
		// Ajout systématique d'un point virgule avant la fermeture php
467
		// Ajout systématique d'un point virgule avant la fermeture php
485
		$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
468
		$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
486
		return $contenu;
469
		return $contenu;
487
	}
470
	}
488
	
471
	
489
	/** 
472
	/** 
490
	 * Créer et stocke du contenu dans un fichier.
473
	 * Créer et stocke du contenu dans un fichier.
491
	 * 
474
	 * 
492
	 * @param string le chemin et le nom du fichier.
475
	 * @param string le chemin et le nom du fichier.
493
	 * @param string le contenu à stocker dans le fichier.
476
	 * @param string le contenu à stocker dans le fichier.
494
	 * @param boolean true pour compresser (gz) le fichier. Par défaut vaut false.
477
	 * @param boolean true pour compresser (gz) le fichier. Par défaut vaut false.
495
	 * @return string le message d'erreur formaté.
478
	 * @return string le message d'erreur formaté.
496
	 */
479
	 */
497
	protected function creerFichier($fichier, $contenu, $compression = false) {
480
	protected function creerFichier($fichier, $contenu, $compression = false) {
498
		$e = null;
481
		$e = null;
499
		if ($compression) {
482
		if ($compression) {
500
			// Ajout de l'extension gz
483
			// Ajout de l'extension gz
501
			if (substr($fichier, -3) != '.gz') {
484
			if (substr($fichier, -3) != '.gz') {
502
				$fichier = $fichier.'.gz';
485
				$fichier = $fichier.'.gz';
503
			}
486
			}
504
			// Début de l'écriture du fichier compressé
487
			// Début de l'écriture du fichier compressé
505
			if ($resource = gzopen($fichier, 'w9')) {
488
			if ($resource = gzopen($fichier, 'w9')) {
506
				if (!gzwrite($resource, $contenu)) {
489
				if (!gzwrite($resource, $contenu)) {
507
					$e = "Le contenu texte n'a pas pu être écrit dans le fichier compressé '$fichier'.";
490
					$e = "Le contenu texte n'a pas pu être écrit dans le fichier compressé '$fichier'.";
508
				}
491
				}
509
				if (!gzclose($resource)) {
492
				if (!gzclose($resource)) {
510
					$e = "Le fichier compressé '$fichier' n'a pas pu être fermé.";
493
					$e = "Le fichier compressé '$fichier' n'a pas pu être fermé.";
511
				}
494
				}
512
			} else {
495
			} else {
513
				$e = "Le fichier compressé '$fichier' n'a pas pu être ouvert.";
496
				$e = "Le fichier compressé '$fichier' n'a pas pu être ouvert.";
514
			}
497
			}
515
		} else {
498
		} else {
516
			if ($resource = fopen($fichier, 'w')) {
499
			if ($resource = fopen($fichier, 'w')) {
517
				if (!fwrite($resource, $contenu)) {
500
				if (!fwrite($resource, $contenu)) {
518
					$e = "Le contenu texte n'a pas pu être écrit dans le fichier '$fichier'.";
501
					$e = "Le contenu texte n'a pas pu être écrit dans le fichier '$fichier'.";
519
				}
502
				}
520
				if (!fclose($resource)) {
503
				if (!fclose($resource)) {
521
					$e = "Le fichier '$fichier' n'a pas pu être fermé.";
504
					$e = "Le fichier '$fichier' n'a pas pu être fermé.";
522
				}
505
				}
523
			} else {
506
			} else {
524
				$e = "Le fichier '$fichier' n'a pas pu être ouvert.";
507
				$e = "Le fichier '$fichier' n'a pas pu être ouvert.";
525
			}
508
			}
526
		}
509
		}
527
		if (is_null($e)) {
510
		if (is_null($e)) {
528
			return true;
511
			return true;
529
		} else {
512
		} else {
530
			trigger_error($e, E_USER_WARNING);
513
			trigger_error($e, E_USER_WARNING);
531
			return false;
514
			return false;
532
		}
515
		}
533
	}
516
	}
534
	
517
	
535
	/**
518
	/**
536
	 * Méthode permettant d'encoder de l'iso-8859-15 vers utf-8 un tableau de variables.
519
	 * Méthode permettant d'encoder de l'iso-8859-15 vers utf-8 un tableau de variables.
537
	 *
520
	 *
538
	 * @param mixed la chaine ou le tableau à encoder en utf-8 depuis l'iso-8859-15.
521
	 * @param mixed la chaine ou le tableau à encoder en utf-8 depuis l'iso-8859-15.
539
	 * @param string l'encodage d'origine si ce n'est pas ISO-8859-15.
522
	 * @param string l'encodage d'origine si ce n'est pas ISO-8859-15.
540
	 * @return mixed la chaine ou le tableau encodé en utf-8.
523
	 * @return mixed la chaine ou le tableau encodé en utf-8.
541
	 * @access protected
524
	 * @access protected
542
	 */
525
	 */
543
	protected function encoderUtf8( &$val, $encodage = 'ISO-8859-15') {
526
	protected function encoderUtf8( &$val, $encodage = 'ISO-8859-15') {
544
		//echo print_r($val, true)."\n";
527
		//echo print_r($val, true)."\n";
545
		if (is_array($val)) {
528
		if (is_array($val)) {
546
			foreach ($val as $c => $v) {
529
			foreach ($val as $c => $v) {
547
				$val[$c] = $this->encoderUtf8($v);
530
				$val[$c] = $this->encoderUtf8($v);
548
			}
531
			}
549
		} else {
532
		} else {
550
			// Nous vérifions si nous avons un bon encodage UTF-8
533
			// Nous vérifions si nous avons un bon encodage UTF-8
551
			if (!is_numeric($val) && !empty($val) && !$this->detecterUtf8($val)) { 
534
			if (!is_numeric($val) && !empty($val) && !$this->detecterUtf8($val)) { 
552
				// Les nombres, les valeurs vides et ce qui est déjà en UTF-8 ne sont pas encodés.
535
				// Les nombres, les valeurs vides et ce qui est déjà en UTF-8 ne sont pas encodés.
553
				$val = mb_convert_encoding($val, 'UTF-8', $encodage);
536
				$val = mb_convert_encoding($val, 'UTF-8', $encodage);
554
			}
537
			}
555
		}
538
		}
556
		return $val;
539
		return $val;
557
	}
540
	}
558
	
541
	
559
	/**
542
	/**
560
	 * Méthode permettant de détecter réellement l'encodage utf8.
543
	 * Méthode permettant de détecter réellement l'encodage utf8.
561
	 * mb_detect_encoding plante si la chaine de caractère se termine par un caractère accentué.
544
	 * mb_detect_encoding plante si la chaine de caractère se termine par un caractère accentué.
562
	 * Provient de  PHPDIG.
545
	 * Provient de  PHPDIG.
563
	 * 
546
	 * 
564
	 * @param string la chaine à vérifier.
547
	 * @param string la chaine à vérifier.
565
	 * @return bool true si c'est de l'utf8, sinon false.
548
	 * @return bool true si c'est de l'utf8, sinon false.
566
	 * @access private
549
	 * @access private
567
	 */
550
	 */
568
	private function detecterUtf8($str) {
551
	private function detecterUtf8($str) {
569
		if ($str === mb_convert_encoding(mb_convert_encoding($str, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32')) {
552
		if ($str === mb_convert_encoding(mb_convert_encoding($str, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32')) {
570
			return true;
553
			return true;
571
		} else {
554
		} else {
572
			return false;
555
			return false;
573
		}
556
		}
574
	}
557
	}
575
}
558
}
576
?>
559
?>