Subversion Repositories Applications.referentiel

Rev

Rev 51 | Rev 58 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6 jpm 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Classe Controleur générale partagée par les différents modules de l'application.
5
 *
6
 * @package		Referentiel
7
 * @category	Php5.2
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @copyright	2010 Tela-Botanica
10
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
11
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
12
 * @version		SVN: $Id$
13
 */
14
abstract class AppliControleur extends Controleur {
15
 
16
	const RENDU_TETE = 'tete';
17
	const RENDU_CORPS = 'corps';
18
	const RENDU_PIED = 'pied';
37 jpm 19
	const RENDU_NAVIGATION = 'navigation';
20
	const RENDU_MENU = 'menu';
6 jpm 21
 
22
	// FIXME : voir s'il est plus intéressant d'utiliser une méthode dans les classes filles
23
	protected $url = null;
26 jpm 24
	private $parametres = array();
46 jpm 25
	protected $manuel = null;
26 jpm 26
	private $sortie = array();
27
	private $messages = null;
6 jpm 28
 
26 jpm 29
	//+----------------------------------------------------------------------------------------------------------------+
30
	// Constructeur
31
 
6 jpm 32
	public function __construct()  {
33
		$registre = Registre::getInstance();
34
		$this->parametres = $registre->get('parametres');
35
		$this->url = $this->parametres['url'];
46 jpm 36
		// Chargement des infos du manuel technique des référentiels
37
		$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v2.1.ini');
6 jpm 38
		parent::__construct();
39
	}
40
 
26 jpm 41
	//+----------------------------------------------------------------------------------------------------------------+
42
	// Accesseurs
43
 
6 jpm 44
	/**
26 jpm 45
	 * Retourne le tableau de sortie à utiliser dans le controleur principal de l'application.
46
	 */
47
	public function getSortie() {
48
		return $this->sortie;
49
	}
50
 
51
	/**
6 jpm 52
	 * Attribue à la bonne position de sortie un contenu.
53
	 */
54
	protected function setSortie($position, $contenu, $fusionner = false) {
55
		if ($this->verifierExistencePosition($position)) {
56
			if ($fusionner) {
57
				$this->sortie[$position] .= $contenu;
58
			} else {
59
				$this->sortie[$position] = $contenu;
60
			}
61
		}
62
	}
63
 
64
	/**
26 jpm 65
	 * Retourne le tableau des messages
66
	 */
67
	protected function getMessages() {
68
		return $this->messages;
69
	}
70
	/**
71
	 * Ajoute un message
72
	 */
73
	protected function addMessage($message) {
74
		if ('' != $message) {
75
			$this->messages[] = $message;
76
		}
77
	}
78
 
79
 
80
	//+----------------------------------------------------------------------------------------------------------------+
81
	// Méthodes
82
 
83
	/**
6 jpm 84
	 * Vérifie l'existence de la position indiquée pour son utilisation dans le tableau de sortie.
85
	 * @param string la position à tester.
86
	 * @return bool true si la position est valide, sinon false.
87
	 */
88
	private function verifierExistencePosition($position) {
89
		$existe = true;
90
		if ($position != self::RENDU_TETE &&
91
			$position != self::RENDU_CORPS &&
37 jpm 92
			$position != self::RENDU_PIED &&
93
			$position != self::RENDU_NAVIGATION &&
94
			$position != self::RENDU_MENU) {
6 jpm 95
			trigger_error("La position '$position' n'est pas une valeur prédéfinie.", E_USER_WARNING);
96
			$existe = false;
97
		}
98
		return $existe;
99
	}
100
 
101
	/**
102
	 * Execute l'action d'un module donnée et fusionne le résultat avec le tableau de sortie.
103
	 */
104
	protected function executerAction($ClasseModule, $action) {
105
		$module = new $ClasseModule();
106
		$module->$action();
107
		$this->fusionnerSortie($module->getSortie());
108
 
109
	}
110
 
111
	/**
112
	 * Fusionne un tableau de sortie par défaut avec le tableau passé en paramêtre.
113
	 * @param array le tableau à fusionner
114
	 */
115
	private function fusionnerSortie($sortie) {
116
		$this->sortie = array_merge($this->sortie, $sortie);
117
	}
118
 
119
	protected function postraiterDonnees(&$tableau) {
120
		if (count($tableau) > 0) {
121
			foreach ($tableau as $cle => &$valeur) {
122
				if ($valeur == '') {
123
					$valeur = '&nbsp;';
124
				} else if (is_string($valeur)) {
33 jpm 125
					$valeur = $this->remplacerEsperluette($valeur);
6 jpm 126
				} else if (is_array($valeur)) {
127
					$this->postraiterDonnees($valeur);
128
				}
129
			}
130
		}
131
	}
33 jpm 132
 
133
	protected function traiterEsperluette(&$tableau) {
134
		if (count($tableau) > 0) {
135
			foreach ($tableau as $cle => &$valeur) {
136
				if (is_string($valeur)) {
137
					$valeur = $this->remplacerEsperluette($valeur);
138
				} else if (is_array($valeur)) {
139
					$this->traiterEsperluette($valeur);
140
				}
141
			}
142
		}
143
	}
144
 
57 jpm 145
	protected function remplacerEsperluette($txt) {
33 jpm 146
		$txt = preg_replace('/&(?!([a-z]+|#[0-9]+|#x[0-9a-f]+);)/i', '&amp;', $txt, -1);
147
		return $txt;
148
	}
45 jpm 149
 
57 jpm 150
	protected function supprimerSlash($doc) {
151
		if (is_string($doc)) {
152
			$doc = stripslashes($doc);
153
		} else if (is_array($doc)) {
154
			if (count($doc) > 0) {
155
				foreach ($doc as $cle => $valeur) {
156
					$doc[$cle] = $this->supprimerSlash($valeur);
157
				}
158
			}
159
		}
160
		return $doc;
161
	}
162
 
45 jpm 163
	protected function initialiserModulePrincipal() {
164
		$_SESSION['module_principal'] = null;
165
	}
166
 
167
	protected function definirCommeModulePrincipal($module_nom) {
168
		$_SESSION['module_principal'] = $module_nom;
169
	}
170
 
171
	private function getModulePrincipalCourant() {
172
		return $_SESSION['module_principal'];
173
	}
174
 
37 jpm 175
	/**
176
	 * Construction du menu et stockage dans le conteneur de sortie RENDU_MENU.
177
	 *
178
	 * @param string $referentiel code du référentiel.
179
	 */
180
	protected function construireMenu($referentiel) {
181
		$menu['nom'] = 'Accueil';
47 jpm 182
		$menu['url'] = $this->obtenirUrlMenuAccueil();
183
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Accueil') ? 'actif' : 'inactif');
37 jpm 184
		$donnees['menus'][] = $menu;
185
		$menu['nom'] = 'Tests';
186
		$menu['url'] = $this->obtenirUrlMenuTest($referentiel);
47 jpm 187
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Test') ? 'actif' : 'inactif');
37 jpm 188
		$donnees['menus'][] = $menu;
189
		$menu['nom'] = 'Versionnage';
190
		$menu['url'] = $this->obtenirUrlMenuVersionnage($referentiel);
47 jpm 191
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Versionnage') ? 'actif' : 'inactif');
37 jpm 192
		$donnees['menus'][] = $menu;
193
		$menu['nom'] = 'Consultation';
194
		$menu['url'] = $this->obtenirUrlMenuConsultation($referentiel);
47 jpm 195
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Consultation') ? 'actif' : 'inactif');
37 jpm 196
		$donnees['menus'][] = $menu;
197
		$this->setSortie(self::RENDU_MENU, $this->getVue('menu', $donnees), false);
198
	}
199
	/**
200
	 * Construction du fil d'ariane et stockage dans le conteneur de sortie RENDU_NAVIGATION.
201
	 *
202
	 * @param $referentiel code du référentiel
203
	 * @param $id_traitement id du traitement
204
	 * @param $id_resultat id du résultat
205
	 */
206
	protected function construireFilAriane($referentiel = null, $id_traitement = null, $id_resultat = null) {
207
		$entree['nom'] = 'Accueil';
208
		$entree['url'] = $this->obtenirUrlMenuAccueil();
209
		$donnees['entrees'][] = $entree;
210
 
211
		if (isset($referentiel)) {
212
			$entree['nom'] = strtoupper($referentiel);
213
			$entree['url'] = $this->obtenirUrlDetailReferentiel($referentiel);
214
			$donnees['entrees'][] = $entree;
215
 
45 jpm 216
			$module_principal = $this->getModulePrincipalCourant();
217
			if (isset($module_principal)) {
218
				$entree['nom'] = $module_principal;
219
				$entree['url'] = $this->obtenirUrlMenu($module_principal, $referentiel);
37 jpm 220
				$donnees['entrees'][] = $entree;
221
			}
222
 
223
			if (isset($id_traitement)) {
224
				$entree['nom'] = "Traitement #$id_traitement";
225
				$entree['url'] = $this->obtenirUrlFicheTraitement($referentiel, $id_traitement);
226
				$donnees['entrees'][] = $entree;
227
			}
228
 
229
			if (isset($id_resultat)) {
230
				$entree['nom'] = "Résultat #$id_resultat";
231
				$entree['url'] = $this->obtenirUrlFicheResultat($referentiel, $id_resultat);
232
				$donnees['entrees'][] = $entree;
233
			}
234
		}
235
 
236
		$this->setSortie(self::RENDU_NAVIGATION, $this->getVue('fil_ariane', $donnees), false);
237
	}
33 jpm 238
 
37 jpm 239
	protected function obtenirUrlDetailReferentiel($referentiel) {
240
		$this->url->setRequete(false);
241
		$this->url->setVariableRequete('module', 'Accueil');
242
		$this->url->setVariableRequete('action', 'afficherDetail');
243
		$this->url->setVariableRequete('ref', $referentiel);
244
		$url = $this->url->getURL();
245
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref'));
246
		return $url;
247
	}
248
 
249
	protected function obtenirUrlMenuAccueil() {
250
		return $this->obtenirUrlMenu('Accueil');
251
	}
252
 
253
	protected function obtenirUrlMenuTest($referentiel) {
254
		return $this->obtenirUrlMenu('Test', $referentiel);
255
	}
256
 
257
	protected function obtenirUrlMenuVersionnage($referentiel) {
258
		return $this->obtenirUrlMenu('Versionnage', $referentiel);
259
	}
260
 
46 jpm 261
	protected function obtenirUrlDemandeVersionnage($referentiel) {
262
		$this->url->setRequete(false);
263
		$this->url->setVariableRequete('module', 'Versionnage');
264
		$this->url->setVariableRequete('action', 'demanderTraitement');
265
		$this->url->setVariableRequete('ref', $referentiel);
266
		$url = $this->url->getURL();
267
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref'));
268
		return $url;
269
	}
270
 
37 jpm 271
	protected function obtenirUrlMenuConsultation($referentiel) {
272
		return $this->obtenirUrlMenu('Consultation', $referentiel);
273
	}
274
 
275
	private function obtenirUrlMenu($menu, $referentiel = null) {
276
		$this->url->setRequete(false);
277
		$this->url->setVariableRequete('module', $menu);
278
		if (isset($referentiel)) {
279
			$this->url->setVariableRequete('ref', $referentiel);
280
		}
281
		$url = $this->url->getURL();
282
		$this->url->unsetVariablesRequete(array('module', 'ref'));
283
		return $url;
284
	}
285
 
286
	protected function obtenirUrlFicheTraitement($referentiel, $id_traitement) {
287
		$this->url->setRequete(false);
288
		$this->url->setVariableRequete('module', 'Traitement');
289
		$this->url->setVariableRequete('id-t', $id_traitement);
290
		$this->url->setVariableRequete('ref', $referentiel);
291
		$url = $this->url->getURL();
292
		$this->url->unsetVariablesRequete(array('module', 'id-t', 'ref'));
293
		return $url;
294
	}
295
 
296
	protected function obtenirUrlFicheResultat($referentiel, $id_resultat) {
297
		$this->url->setRequete(false);
298
		$this->url->setVariableRequete('module', 'Resultat');
299
		$this->url->setVariableRequete('id-r', $id_resultat);
300
		$this->url->setVariableRequete('ref', $referentiel);
301
		$url = $this->url->getURL();
302
		$this->url->unsetVariablesRequete(array('module', 'id-r', 'ref'));
303
		return $url;
304
	}
39 jpm 305
 
306
	/**
307
	 * Lance l'ajout d'un traitement
308
	 */
309
	protected function ajouterTraitement($referentiel_code, $script_nom) {
51 jpm 310
		$this->ajouterTraitementParametre($referentiel_code, null, $script_nom);
311
	}
312
 
313
	/**
314
	 * Lance l'ajout d'un traitement
315
	 */
316
	protected function ajouterTraitementParametre($referentiel_code, $parametres_serialises, $script_nom) {
39 jpm 317
		if (is_null($referentiel_code)) {
318
			$this->addMessage("Aucun code de projet de référentiel n'est indiqué (Ex. bdnff).");
319
		} else {
46 jpm 320
			$traitements_a_supprimer = null;
39 jpm 321
			$traitementDao = new TraitementDao();
322
			$resultat_traitement_en_attente = $traitementDao->getTraitementsEnAttente($referentiel_code, $script_nom);
323
			if ($resultat_traitement_en_attente) {
46 jpm 324
				foreach ($resultat_traitement_en_attente as $traitement) {
325
					$difference = $this->differenceEnSecondeEntreDeuxDates($traitement['meta_date_creation'], date ("Y-m-d H:i:s"));
326
					Debug::printr("Différence attente : $difference > ".Config::get('ddv_traitement_attente'));
327
					if ($difference > Config::get('ddv_traitement_attente')) {
328
						$traitements_a_supprimer[] = $traitement['id_traitement'];
329
						$this->addMessage("Le traitement #{$traitement['id_traitement']} était en attente depuis plus de 5mn, il a été supprimé.");
330
					} else {
331
						$this->addMessage("Un traitement est déjà en attente...");
332
					}
333
				}
39 jpm 334
			} else {
335
				$resultat_traitement_en_cours = $traitementDao->getTraitementsEnCours($referentiel_code, $script_nom);
336
				if ($resultat_traitement_en_cours) {
46 jpm 337
					foreach ($resultat_traitement_en_cours as $traitement) {
338
						$difference = $this->differenceEnSecondeEntreDeuxDates($traitement['date_debut'], date ("Y-m-d H:i:s"));
339
						Debug::printr("Différence en cours : $difference > ".Config::get('ddv_traitement_en_cours'));
340
						if ($difference > Config::get('ddv_traitement_en_cours')) {
341
							$traitements_a_supprimer[] = $traitement['id_traitement'];
342
							$this->addMessage("Le traitement #{$traitement['id_traitement']} était en cours depuis plus de 5mn, il a été supprimé.");
343
						} else {
344
							$this->addMessage("Un traitement est déjà en cours...");
345
						}
346
					}
39 jpm 347
				} else {
51 jpm 348
					$resultat = $traitementDao->ajouterTraitementParametre($referentiel_code, $parametres_serialises, $script_nom);
39 jpm 349
					if ($resultat != false) {
350
						$this->addMessage("Le traitement #'$resultat' a été ajouté.");
351
						$this->lancerScript($referentiel_code, $script_nom);
352
					} else {
353
						$this->addMessage("Un problème est survenu lors de la tentative d'ajout du traitement.");
354
					}
355
				}
356
			}
46 jpm 357
			// Suppression des traitements posant problème
358
			if (count($traitements_a_supprimer) > 0) {
359
				$traitementDao->supprimer($traitements_a_supprimer);
360
			}
39 jpm 361
		}
362
	}
363
 
46 jpm 364
	private function differenceEnSecondeEntreDeuxDates($date_01, $date_02) {
365
		if (floatval(phpversion()) >= 5.3 ) {
366
			$d1 = new DateTime($date_01);
367
			$d2 = new DateTime($date_02);
368
			$difference_absolue = true;
369
			$diff = $d1->diff($d2, $difference_absolue);
370
			$nbre_secondes = $diff->format('s');
371
		} else {
372
			$nbre_secondes = abs(round((strtotime($date_01) - strtotime($date_02))));
373
		}
374
		return $nbre_secondes;
375
	}
376
 
39 jpm 377
	/**
378
	 * Lance le script d'execution des traitements
379
	 */
380
	protected function lancerScript($referentiel_code, $script_nom) {
381
		$php = Config::get('chemin_bin_php');
382
		$exe = Config::get('chemin_script');
383
		$action = 'tout';
384
		$log = Config::get('chemin_script_log');
46 jpm 385
		$limite_memoire = Config::get('script_limite_memoire');
386
		$commande = "$php -d memory_limit=$limite_memoire -f $exe $script_nom -p $referentiel_code -a $action > $log &";
39 jpm 387
 
388
		if ($this->verifierSafeModeOff() === false) {
389
			$e = "Le safe_mode est actif sur ce serveur.";
390
		} else if ($this->verifierAccesFonctionExec() === false) {
391
			$e = "La fonction 'exec()' fait partie des fonctions désactivées sur ce serveur (voir disable_functions).";
392
		} else {
393
			$this->addMessage("Lancement du script effectuant les traitements.");
394
			exec($commande);
395
		}
396
 
397
		// Affichage des message de paramêtrage du serveur si nécessaire
398
		if (Config::get('script_messages') == true) {
399
			$message_erreur_tpl = "%s\n.".
400
				"Il est nécessaire de configurer le lancement du script via une tache dans le cron.\n".
401
				"La commande à lancer est : <code>$commande</code>";
402
			$this->addMessage(sprintf($message_erreur_tpl, $e));
403
		}
404
	}
405
 
406
	private function verifierSafeModeOff() {
407
		return ('1' == ini_get('safe_mode')) ? false : true;
408
	}
409
 
410
	private function verifierAccesFonctionExec() {
411
		$disabled = explode(', ', ini_get('disable_functions'));
412
		return !in_array('exec', $disabled);
413
	}
6 jpm 414
}