Subversion Repositories Applications.framework

Rev

Rev 299 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 299 Rev 477
Line 8... Line 8...
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @author		Delphine CAUQUIL <delphine@tela-botanica.org>
9
 * @author		Delphine CAUQUIL <delphine@tela-botanica.org>
10
 * @copyright	Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
10
 * @copyright	Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
11
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
11
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
12
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
12
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
13
 * @since 		0.3 
13
 * @since 		0.3
14
 * @version	$Id: Script.php 299 2011-01-18 14:03:46Z jpm $
14
 * @version	$Id: Script.php 477 2014-03-25 10:39:28Z jpm $
15
 * @link		/doc/framework/
15
 * @link		/doc/framework/
16
 */
16
 */
Line 17... Line 17...
17
 
17
 
18
abstract class Script {
18
abstract class Script {
Line 25... Line 25...
25
	/** Niveau de message de type INFORMATION */
25
	/** Niveau de message de type INFORMATION */
26
	const MSG_INFO = 3;
26
	const MSG_INFO = 3;
Line 27... Line 27...
27
 
27
 
28
	/** Inititulé des différents types de message. */
28
	/** Inititulé des différents types de message. */
29
	private static $msg_niveaux_txt = array('LOG', 'ERREUR','AVERTISSEMENT', 'INFO');
29
	private static $msg_niveaux_txt = array('LOG', 'ERREUR','AVERTISSEMENT', 'INFO');
30
	
30
 
31
	/**
31
	/**
32
	 * Le nom du script tel que passé dans la ligne de commande.
32
	 * Le nom du script tel que passé dans la ligne de commande.
33
	 * @var string
33
	 * @var string
34
	 */
34
	 */
35
	private $script_nom = null;
35
	private $script_nom = null;
36
	
36
 
37
	/**
37
	/**
38
	 * Paramêtres par défaut disponibles pour la ligne de commande
38
	 * Paramêtres par défaut disponibles pour la ligne de commande
39
	 * le tableau se construit de la forme suivante :	
39
	 * le tableau se construit de la forme suivante :
40
	 * - clé =  nom du paramêtre '-foo'
40
	 * - clé =  nom du paramêtre '-foo'
41
	 * - value = contient un nouveau tableau composé de cette façon :
41
	 * - value = contient un nouveau tableau composé de cette façon :
42
	 *  - booléen: true si le paramêtre est obligatoire
42
	 *  - booléen: true si le paramêtre est obligatoire
43
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
43
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
Line 48... Line 48...
48
	 * @var array
48
	 * @var array
49
	 */
49
	 */
50
	private $parametres_autorises_defaut = array(
50
	private $parametres_autorises_defaut = array(
51
		'-a' => array(true, true, 'Action à réaliser'),
51
		'-a' => array(true, true, 'Action à réaliser'),
52
		'-v' => array(false, '1', 'Mode verbeux : 1 ou 2'));
52
		'-v' => array(false, '1', 'Mode verbeux : 1 ou 2'));
53
	
53
 
54
	/**
54
	/**
55
	 * Paramêtres autorisés par le script.
55
	 * Paramêtres autorisés par le script.
56
	 * le tableau est de la forme suivante :	
56
	 * le tableau est de la forme suivante :
57
	 * - clé =  nom du paramêtre '-foo'
57
	 * - clé =  nom du paramêtre '-foo'
58
	 * - value = contient un nouveau tableau composé de cette façon :
58
	 * - value = contient un nouveau tableau composé de cette façon :
59
	 *  - booléen: true si le paramêtre est obligatoire
59
	 *  - booléen: true si le paramêtre est obligatoire
60
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
60
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
61
	 *  - string: description du contenu du paramêtre
61
	 *  - string: description du contenu du paramêtre
Line 63... Line 63...
63
	 * Le dernier parametre du tableau peut avoir la valeur '...',
63
	 * Le dernier parametre du tableau peut avoir la valeur '...',
64
	 * il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
64
	 * il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
65
	 * @var array
65
	 * @var array
66
	 */
66
	 */
67
	protected $parametres_autorises = null;
67
	protected $parametres_autorises = null;
68
	
68
 
69
	/**
69
	/**
70
	 * Contient les valeurs des paramêtres récupérés de la ligne de commande :
70
	 * Contient les valeurs des paramêtres récupérés de la ligne de commande :
71
	 * le tableau se construit de la forme suivnate :	
71
	 * le tableau se construit de la forme suivnate :
72
	 * - clé =  nom du paramêtre '-foo'
72
	 * - clé =  nom du paramêtre '-foo'
73
	 * - valeur = la valeur récupérée sur la ligne de commande
73
	 * - valeur = la valeur récupérée sur la ligne de commande
74
	 * @var array
74
	 * @var array
75
	 */
75
	 */
76
	private $parametres_cli = null;
76
	private $parametres_cli = null;
77
	
77
 
78
	/**
78
	/**
79
	 * Contient le tableau des paramètres disponible après vérification :
79
	 * Contient le tableau des paramètres disponible après vérification :
80
	 * le tableau est de la forme suivante :	
80
	 * le tableau est de la forme suivante :
81
	 * - clé =  nom du paramêtre '-foo'
81
	 * - clé =  nom du paramêtre '-foo'
82
	 * - valeur = la valeur récupérée sur la ligne de commande
82
	 * - valeur = la valeur récupérée sur la ligne de commande
83
	 * @var array
83
	 * @var array
84
	 */
84
	 */
85
	protected $parametres = null;
85
	protected $parametres = null;
86
	
86
 
87
	/** Tableau associatif permettant de stocker l'avancement dans une boucle.
87
	/** Tableau associatif permettant de stocker l'avancement dans une boucle.
88
	 * La clé est un md5 du message à afficher au démarrage de la boucle.
88
	 * La clé est un md5 du message à afficher au démarrage de la boucle.
89
	 * @var array 
89
	 * @var array
90
	 */
90
	 */
91
	private static $avancement = array();
91
	private static $avancement = array();
92
	
92
 
93
	/** Tableau des noms des paramètres à définir dans le fichier de config car obligatoirement nécessaire à cette classe.*/
93
	/** Tableau des noms des paramètres à définir dans le fichier de config car obligatoirement nécessaire à cette classe.*/
94
	private static $parametres_obligatoires = array('chemin_modules', 'log_script');
94
	private static $parametres_obligatoires = array('chemin_modules', 'log_script');
95
	
95
 
96
	public function __construct($script_nom, $parametres_cli) {
96
	public function __construct($script_nom, $parametres_cli) {
97
		$this->script_nom = $script_nom;
97
		$this->script_nom = $script_nom;
98
		$this->parametres_cli = $parametres_cli;
98
		$this->parametres_cli = $parametres_cli;
99
		
99
 
100
		Config::verifierPresenceParametres(self::$parametres_obligatoires);
100
		Config::verifierPresenceParametres(self::$parametres_obligatoires);
101
		
101
 
102
		$fichier_ini_script = $this->getScriptChemin().'config.ini';
102
		$fichier_ini_script = $this->getScriptChemin().'config.ini';
103
		Config::charger($fichier_ini_script);
103
		Config::charger($fichier_ini_script);
104
		
104
 
105
		$this->chargerParametresAutorises();
105
		$this->chargerParametresAutorises();
106
		$this->chargerParametres();
106
		$this->chargerParametres();
107
	}
107
	}
108
	
108
 
109
	private static function getMsgNiveauTxt($niveau) {
109
	private static function getMsgNiveauTxt($niveau) {
110
		return self::$msg_niveaux_txt[$niveau];
110
		return self::$msg_niveaux_txt[$niveau];
111
	}
111
	}
112
	
112
 
113
	protected function getScriptNom() {
113
	protected function getScriptNom() {
114
		return $this->script_nom;
114
		return $this->script_nom;
115
	}
115
	}
116
	
116
 
-
 
117
	/**
-
 
118
	 * Retour le chemin vers le dossier principal du script exécuter.
-
 
119
	 * Si le nom du script est au format : script/sous_script
-
 
120
	 * le chemin contiendra seulement "script" dans le chemin renvoyé.
-
 
121
	 * Si le nom du script est au format : script/sous-script-1/sous_script-2
-
 
122
	 * le chemin contiendra seulement "script/sous-script-1" dans le chemin renvoyé.
-
 
123
	 *
-
 
124
	 * @param type $doit_exister
-
 
125
	 * @return string
-
 
126
	 */
117
	protected function getScriptChemin($doit_exister = true) {
127
	protected function getScriptChemin($doit_exister = true) {
-
 
128
		$script_nom = $this->getScriptNom();
-
 
129
		if (strpos($script_nom, DS)) {
-
 
130
			$decompoScriptNom = explode(DS, $script_nom);
-
 
131
			$script_nom = array_pop($decompoScriptNom);
-
 
132
			$dossier_nom = implode(DS, $decompoScriptNom);
-
 
133
		} else {
-
 
134
			$dossier_nom = strtolower($script_nom);
-
 
135
		}
118
		$chemin = Config::get('chemin_modules').$this->getScriptNom().DS;
136
		$chemin = Config::get('chemin_modules').$dossier_nom.DS;
119
		if (!file_exists($chemin) && $doit_exister) {
137
		if (!file_exists($chemin) && $doit_exister) {
120
			trigger_error("Erreur: le module '".$this->getScriptNom()."' n'existe pas ($chemin)\n", E_USER_ERROR);
138
			trigger_error("Erreur: le module '$script_nom' n'existe pas ($chemin)\n", E_USER_ERROR);
121
		}
139
		}
122
		return $chemin;
140
		return $chemin;
123
	}
141
	}
124
	
142
 
125
	protected function getParametre($parametre) {
143
	protected function getParametre($parametre) {
126
		$retour = false;
144
		$retour = false;
127
		if (!is_null($parametre)) {
145
		if (!is_null($parametre)) {
128
			$parametre = ltrim($parametre, '-');
146
			$parametre = ltrim($parametre, '-');
129
			
147
 
130
			if (isset($this->parametres[$parametre])) {
148
			if (isset($this->parametres[$parametre])) {
131
				$retour = $this->parametres[$parametre];
149
				$retour = $this->parametres[$parametre];
132
			} else {
150
			} else {
133
				trigger_error("Erreur: la ligne de commande ne contenait pas le paramêtre '$parametre'\n", E_USER_WARNING);
151
				trigger_error("Erreur: la ligne de commande ne contenait pas le paramêtre '$parametre'\n", E_USER_WARNING);
134
			}
152
			}
135
		}
153
		}
136
		return $retour;
154
		return $retour;
137
	}
155
	}
138
	
156
 
139
	abstract public function executer();
157
	abstract public function executer();
140
	
158
 
141
	private function chargerParametresAutorises() {
159
	private function chargerParametresAutorises() {
142
		foreach ($this->parametres_autorises_defaut as $c => $v) {
160
		foreach ($this->parametres_autorises_defaut as $c => $v) {
143
			if (isset($this->parametres_autorises[$c])) {
161
			if (isset($this->parametres_autorises[$c])) {
144
				trigger_error("Erreur: le script '".$this->getScriptNom()."' ne peut définir le paramêtre '$c' car il existe déjà\n", E_USER_ERROR);
162
				trigger_error("Erreur: le script '".$this->getScriptNom()."' ne peut définir le paramêtre '$c' car il existe déjà\n", E_USER_ERROR);
145
			} else {
163
			} else {
146
				$this->parametres_autorises[$c] = $v;
164
				$this->parametres_autorises[$c] = $v;
147
			}
165
			}
148
		}
166
		}
149
	}
167
	}
150
	
168
 
151
	private function chargerParametres() {
169
	private function chargerParametres() {
152
		$parametres_cli = $this->parametres_cli;
170
		$parametres_cli = $this->parametres_cli;
Line 153... Line 171...
153
 
171
 
154
		// Récupération des paramêtresgetMsgNiveauTxt
172
		// Récupération des paramêtresgetMsgNiveauTxt
Line 177... Line 195...
177
						unset($parametres_cli[$p_nom]);
195
						unset($parametres_cli[$p_nom]);
178
					}
196
					}
179
				}
197
				}
180
			}
198
			}
181
		}
199
		}
182
		
200
 
183
		// Gestion de l'excédant de paramêtres
201
		// Gestion de l'excédant de paramêtres
184
		if (count($parametres_cli)) {
202
		if (count($parametres_cli)) {
185
			trigger_error("Erreur: trop de paramêtres\n", E_USER_ERROR);
203
			trigger_error("Erreur: trop de paramêtres\n", E_USER_ERROR);
186
		}
204
		}
187
	}
205
	}
188
	
206
 
189
	/** 
207
	/**
190
	 * Affiche un message d'erreur formaté.
208
	 * Affiche un message d'erreur formaté.
191
	 * Si le paramétre de verbosité (-v) vaut 1 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
209
	 * Si le paramétre de verbosité (-v) vaut 1 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
192
	 *  
210
	 *
193
	 * @param string le message d'erreur avec des %s.
211
	 * @param string le message d'erreur avec des %s.
194
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
212
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
195
	 * @return void.
213
	 * @return void.
196
	 */
214
	 */
197
	protected function traiterErreur($message, $tab_arguments = array()) {
215
	protected function traiterErreur($message, $tab_arguments = array()) {
198
		$this->traiterMessage($message, $tab_arguments, self::MSG_ERREUR);
216
		$this->traiterMessage($message, $tab_arguments, self::MSG_ERREUR);
199
	}
217
	}
200
	
218
 
201
	/** 
219
	/**
202
	 * Affiche un message d'avertissement formaté.
220
	 * Affiche un message d'avertissement formaté.
203
	 * Si le paramétre de verbosité (-v) vaut 1, le message est écrit dans le fichier de log.
221
	 * Si le paramétre de verbosité (-v) vaut 1, le message est écrit dans le fichier de log.
204
	 * Si le paramétre de verbosité (-v) vaut 2 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
222
	 * Si le paramétre de verbosité (-v) vaut 2 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
205
	 * 
223
	 *
206
	 * @param string le message d'erreur avec des %s.
224
	 * @param string le message d'erreur avec des %s.
207
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
225
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
208
	 * @return void.
226
	 * @return void.
209
	 */
227
	 */
210
	protected function traiterAvertissement($message, $tab_arguments = array()) {
228
	protected function traiterAvertissement($message, $tab_arguments = array()) {
211
		$this->traiterMessage($message, $tab_arguments, self::MSG_AVERTISSEMENT);
229
		$this->traiterMessage($message, $tab_arguments, self::MSG_AVERTISSEMENT);
212
	}
230
	}
213
	
231
 
214
	/** 
232
	/**
215
	 * Retourne un message d'information formaté.
233
	 * Retourne un message d'information formaté.
216
	 * Si le paramétre de verbosité (-v) vaut 1 ou 2 , le message est écrit dans le fichier de log.
234
	 * Si le paramétre de verbosité (-v) vaut 1 ou 2 , le message est écrit dans le fichier de log.
217
	 * Si le paramétre de verbosité (-v) vaut 3 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
235
	 * Si le paramétre de verbosité (-v) vaut 3 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
218
	 * 
236
	 *
219
	 * @param string le message d'information avec des %s.
237
	 * @param string le message d'information avec des %s.
220
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
238
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
221
	 * @return void.
239
	 * @return void.
222
	 */
240
	 */
223
	protected function traiterInfo($message, $tab_arguments = array()) {
241
	protected function traiterInfo($message, $tab_arguments = array()) {
224
		$this->traiterMessage($message, $tab_arguments, self::MSG_INFO);
242
		$this->traiterMessage($message, $tab_arguments, self::MSG_INFO);
225
	}
243
	}
226
	
244
 
227
	/** 
245
	/**
228
	 * Retourne un message formaté en le stockant dans un fichier de log si nécessaire.
246
	 * Retourne un message formaté en le stockant dans un fichier de log si nécessaire.
229
	 * 
247
	 *
230
	 * @param string le message d'erreur avec des %s.
248
	 * @param string le message d'erreur avec des %s.
231
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
249
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
232
	 * @param int le niveau de verbosité à dépasser pour afficher les messages.
250
	 * @param int le niveau de verbosité à dépasser pour afficher les messages.
233
	 * @return void.
251
	 * @return void.
234
	 */
252
	 */
Line 239... Line 257...
239
			if (Config::get('log_script')) {
257
			if (Config::get('log_script')) {
240
				// TODO : lancer le log
258
				// TODO : lancer le log
241
			}
259
			}
242
		}
260
		}
243
	}
261
	}
244
	
262
 
245
	/** 
263
	/**
246
	 * Retourne un message d'information formaté.
264
	 * Retourne un message d'information formaté.
247
	 * 
265
	 *
248
	 * @param string le message d'information avec des %s.
266
	 * @param string le message d'information avec des %s.
249
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
267
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
250
	 * @return string le message d'erreur formaté.
268
	 * @return string le message d'erreur formaté.
251
	 */
269
	 */
252
	protected function formaterMsg($message, $tab_arguments = array(), $niveau = null) {
270
	protected function formaterMsg($message, $tab_arguments = array(), $niveau = null) {
Line 254... Line 272...
254
		$prefixe = date('Y-m-j_H:i:s', time());
272
		$prefixe = date('Y-m-j_H:i:s', time());
255
		$prefixe .= is_null($niveau) ? ' : ' : ' - '.self::getMsgNiveauTxt($niveau).' : ';
273
		$prefixe .= is_null($niveau) ? ' : ' : ' - '.self::getMsgNiveauTxt($niveau).' : ';
256
		$log = $prefixe.$texte."\n";
274
		$log = $prefixe.$texte."\n";
257
		return $log;
275
		return $log;
258
	}
276
	}
259
	
277
 
260
	/** 
278
	/**
261
	 * Utiliser cette méthode dans une boucle pour afficher un message suivi du nombre de tour de boucle effectué.
279
	 * Utiliser cette méthode dans une boucle pour afficher un message suivi du nombre de tour de boucle effectué.
262
	 * Vous devrez vous même gérer le retour à la ligne à la sortie de la boucle. 
280
	 * Vous devrez vous même gérer le retour à la ligne à la sortie de la boucle.
263
	 * 
281
	 *
264
	 * @param string le message d'information.
282
	 * @param string le message d'information.
265
	 * @param int le nombre de départ à afficher.
283
	 * @param int le nombre de départ à afficher.
266
	 * @return void le message est affiché dans la console.
284
	 * @return void le message est affiché dans la console.
267
	 */
285
	 */
268
	protected function afficherAvancement($message, $depart = 0) {
286
	protected function afficherAvancement($message, $depart = 0) {
269
		if (! isset(self::$avancement[$message])) {
287
		if (! isset(self::$avancement[$message])) {
270
			self::$avancement[$message] = $depart;
288
			self::$avancement[$message] = $depart;
271
			echo "$message : ";
289
			echo "$message : ";
272
			
290
 
273
			$actuel =& self::$avancement[$message];
291
			$actuel =& self::$avancement[$message];
274
			echo $actuel++;
292
			echo $actuel++;
275
		} else {
293
		} else {
276
			$actuel =& self::$avancement[$message];
294
			$actuel =& self::$avancement[$message];
277
			
295
 
278
			// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères)
296
			// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères)
279
			$passage = 0;
297
			$passage = 0;
280
			if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) {
298
			if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) {
281
				$passage = 1;				
299
				$passage = 1;
282
			}
300
			}
283
			
301
 
284
			echo str_repeat(chr(8), (strlen((string) $actuel) - $passage));
302
			echo str_repeat(chr(8), (strlen((string) $actuel) - $passage));
285
			echo $actuel++;
303
			echo $actuel++;
286
		}
304
		}
287
	}
305
	}
288
}
306
}