Subversion Repositories Applications.referentiel

Rev

Rev 20 | Rev 30 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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