Subversion Repositories Applications.referentiel

Rev

Rev 39 | Rev 46 | 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();
25
	private $sortie = array();
26
	private $messages = null;
6 jpm 27
 
26 jpm 28
	//+----------------------------------------------------------------------------------------------------------------+
29
	// Constructeur
30
 
6 jpm 31
	public function __construct()  {
32
		$registre = Registre::getInstance();
33
		$this->parametres = $registre->get('parametres');
34
		$this->url = $this->parametres['url'];
35
		parent::__construct();
36
	}
37
 
26 jpm 38
	//+----------------------------------------------------------------------------------------------------------------+
39
	// Accesseurs
40
 
6 jpm 41
	/**
26 jpm 42
	 * Retourne le tableau de sortie à utiliser dans le controleur principal de l'application.
43
	 */
44
	public function getSortie() {
45
		return $this->sortie;
46
	}
47
 
48
	/**
6 jpm 49
	 * Attribue à la bonne position de sortie un contenu.
50
	 */
51
	protected function setSortie($position, $contenu, $fusionner = false) {
52
		if ($this->verifierExistencePosition($position)) {
53
			if ($fusionner) {
54
				$this->sortie[$position] .= $contenu;
55
			} else {
56
				$this->sortie[$position] = $contenu;
57
			}
58
		}
59
	}
60
 
61
	/**
26 jpm 62
	 * Retourne le tableau des messages
63
	 */
64
	protected function getMessages() {
65
		return $this->messages;
66
	}
67
	/**
68
	 * Ajoute un message
69
	 */
70
	protected function addMessage($message) {
71
		if ('' != $message) {
72
			$this->messages[] = $message;
73
		}
74
	}
75
 
76
 
77
	//+----------------------------------------------------------------------------------------------------------------+
78
	// Méthodes
79
 
80
	/**
6 jpm 81
	 * Vérifie l'existence de la position indiquée pour son utilisation dans le tableau de sortie.
82
	 * @param string la position à tester.
83
	 * @return bool true si la position est valide, sinon false.
84
	 */
85
	private function verifierExistencePosition($position) {
86
		$existe = true;
87
		if ($position != self::RENDU_TETE &&
88
			$position != self::RENDU_CORPS &&
37 jpm 89
			$position != self::RENDU_PIED &&
90
			$position != self::RENDU_NAVIGATION &&
91
			$position != self::RENDU_MENU) {
6 jpm 92
			trigger_error("La position '$position' n'est pas une valeur prédéfinie.", E_USER_WARNING);
93
			$existe = false;
94
		}
95
		return $existe;
96
	}
97
 
98
	/**
99
	 * Execute l'action d'un module donnée et fusionne le résultat avec le tableau de sortie.
100
	 */
101
	protected function executerAction($ClasseModule, $action) {
102
		$module = new $ClasseModule();
103
		$module->$action();
104
		$this->fusionnerSortie($module->getSortie());
105
 
106
	}
107
 
108
	/**
109
	 * Fusionne un tableau de sortie par défaut avec le tableau passé en paramêtre.
110
	 * @param array le tableau à fusionner
111
	 */
112
	private function fusionnerSortie($sortie) {
113
		$this->sortie = array_merge($this->sortie, $sortie);
114
	}
115
 
116
	protected function postraiterDonnees(&$tableau) {
117
		if (count($tableau) > 0) {
118
			foreach ($tableau as $cle => &$valeur) {
119
				if ($valeur == '') {
120
					$valeur = '&nbsp;';
121
				} else if (is_string($valeur)) {
33 jpm 122
					$valeur = $this->remplacerEsperluette($valeur);
6 jpm 123
				} else if (is_array($valeur)) {
124
					$this->postraiterDonnees($valeur);
125
				}
126
			}
127
		}
128
	}
33 jpm 129
 
130
	protected function traiterEsperluette(&$tableau) {
131
		if (count($tableau) > 0) {
132
			foreach ($tableau as $cle => &$valeur) {
133
				if (is_string($valeur)) {
134
					$valeur = $this->remplacerEsperluette($valeur);
135
				} else if (is_array($valeur)) {
136
					$this->traiterEsperluette($valeur);
137
				}
138
			}
139
		}
140
	}
141
 
142
	private function remplacerEsperluette($txt) {
143
		$txt = preg_replace('/&(?!([a-z]+|#[0-9]+|#x[0-9a-f]+);)/i', '&amp;', $txt, -1);
144
		return $txt;
145
	}
45 jpm 146
 
147
	protected function initialiserModulePrincipal() {
148
		$_SESSION['module_principal'] = null;
149
	}
150
 
151
	protected function definirCommeModulePrincipal($module_nom) {
152
		$_SESSION['module_principal'] = $module_nom;
153
	}
154
 
155
	private function getModulePrincipalCourant() {
156
		return $_SESSION['module_principal'];
157
	}
158
 
37 jpm 159
	/**
160
	 * Construction du menu et stockage dans le conteneur de sortie RENDU_MENU.
161
	 *
162
	 * @param string $referentiel code du référentiel.
163
	 */
164
	protected function construireMenu($referentiel) {
165
		$menu['nom'] = 'Accueil';
166
		$menu['url'] = $this->obtenirUrlMenuAccueil();
167
		$donnees['menus'][] = $menu;
168
		$menu['nom'] = 'Tests';
169
		$menu['url'] = $this->obtenirUrlMenuTest($referentiel);
170
		$donnees['menus'][] = $menu;
171
		$menu['nom'] = 'Versionnage';
172
		$menu['url'] = $this->obtenirUrlMenuVersionnage($referentiel);
173
		$donnees['menus'][] = $menu;
174
		$menu['nom'] = 'Consultation';
175
		$menu['url'] = $this->obtenirUrlMenuConsultation($referentiel);
176
		$donnees['menus'][] = $menu;
177
		$this->setSortie(self::RENDU_MENU, $this->getVue('menu', $donnees), false);
178
	}
179
	/**
180
	 * Construction du fil d'ariane et stockage dans le conteneur de sortie RENDU_NAVIGATION.
181
	 *
182
	 * @param $referentiel code du référentiel
183
	 * @param $id_traitement id du traitement
184
	 * @param $id_resultat id du résultat
185
	 */
186
	protected function construireFilAriane($referentiel = null, $id_traitement = null, $id_resultat = null) {
187
		$entree['nom'] = 'Accueil';
188
		$entree['url'] = $this->obtenirUrlMenuAccueil();
189
		$donnees['entrees'][] = $entree;
190
 
191
		if (isset($referentiel)) {
192
			$entree['nom'] = strtoupper($referentiel);
193
			$entree['url'] = $this->obtenirUrlDetailReferentiel($referentiel);
194
			$donnees['entrees'][] = $entree;
195
 
45 jpm 196
			$module_principal = $this->getModulePrincipalCourant();
197
			if (isset($module_principal)) {
198
				$entree['nom'] = $module_principal;
199
				$entree['url'] = $this->obtenirUrlMenu($module_principal, $referentiel);
37 jpm 200
				$donnees['entrees'][] = $entree;
201
			}
202
 
203
			if (isset($id_traitement)) {
204
				$entree['nom'] = "Traitement #$id_traitement";
205
				$entree['url'] = $this->obtenirUrlFicheTraitement($referentiel, $id_traitement);
206
				$donnees['entrees'][] = $entree;
207
			}
208
 
209
			if (isset($id_resultat)) {
210
				$entree['nom'] = "Résultat #$id_resultat";
211
				$entree['url'] = $this->obtenirUrlFicheResultat($referentiel, $id_resultat);
212
				$donnees['entrees'][] = $entree;
213
			}
214
		}
215
 
216
		$this->setSortie(self::RENDU_NAVIGATION, $this->getVue('fil_ariane', $donnees), false);
217
	}
33 jpm 218
 
37 jpm 219
	protected function obtenirUrlDetailReferentiel($referentiel) {
220
		$this->url->setRequete(false);
221
		$this->url->setVariableRequete('module', 'Accueil');
222
		$this->url->setVariableRequete('action', 'afficherDetail');
223
		$this->url->setVariableRequete('ref', $referentiel);
224
		$url = $this->url->getURL();
225
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref'));
226
		return $url;
227
	}
228
 
229
	protected function obtenirUrlMenuAccueil() {
230
		return $this->obtenirUrlMenu('Accueil');
231
	}
232
 
233
	protected function obtenirUrlMenuTest($referentiel) {
234
		return $this->obtenirUrlMenu('Test', $referentiel);
235
	}
236
 
237
	protected function obtenirUrlMenuVersionnage($referentiel) {
238
		return $this->obtenirUrlMenu('Versionnage', $referentiel);
239
	}
240
 
241
	protected function obtenirUrlMenuConsultation($referentiel) {
242
		return $this->obtenirUrlMenu('Consultation', $referentiel);
243
	}
244
 
245
	private function obtenirUrlMenu($menu, $referentiel = null) {
246
		$this->url->setRequete(false);
247
		$this->url->setVariableRequete('module', $menu);
248
		if (isset($referentiel)) {
249
			$this->url->setVariableRequete('ref', $referentiel);
250
		}
251
		$url = $this->url->getURL();
252
		$this->url->unsetVariablesRequete(array('module', 'ref'));
253
		return $url;
254
	}
255
 
256
	protected function obtenirUrlFicheTraitement($referentiel, $id_traitement) {
257
		$this->url->setRequete(false);
258
		$this->url->setVariableRequete('module', 'Traitement');
259
		$this->url->setVariableRequete('id-t', $id_traitement);
260
		$this->url->setVariableRequete('ref', $referentiel);
261
		$url = $this->url->getURL();
262
		$this->url->unsetVariablesRequete(array('module', 'id-t', 'ref'));
263
		return $url;
264
	}
265
 
266
	protected function obtenirUrlFicheResultat($referentiel, $id_resultat) {
267
		$this->url->setRequete(false);
268
		$this->url->setVariableRequete('module', 'Resultat');
269
		$this->url->setVariableRequete('id-r', $id_resultat);
270
		$this->url->setVariableRequete('ref', $referentiel);
271
		$url = $this->url->getURL();
272
		$this->url->unsetVariablesRequete(array('module', 'id-r', 'ref'));
273
		return $url;
274
	}
39 jpm 275
 
276
	/**
277
	 * Lance l'ajout d'un traitement
278
	 */
279
	protected function ajouterTraitement($referentiel_code, $script_nom) {
280
		if (is_null($referentiel_code)) {
281
			$this->addMessage("Aucun code de projet de référentiel n'est indiqué (Ex. bdnff).");
282
		} else {
283
			$traitementDao = new TraitementDao();
284
			$resultat_traitement_en_attente = $traitementDao->getTraitementsEnAttente($referentiel_code, $script_nom);
285
			if ($resultat_traitement_en_attente) {
286
				$this->addMessage("Un traitement est déjà en attente...");
287
			} else {
288
				$resultat_traitement_en_cours = $traitementDao->getTraitementsEnCours($referentiel_code, $script_nom);
289
				if ($resultat_traitement_en_cours) {
290
					$this->addMessage("Un traitement est déjà en cours...");
291
				} else {
292
					$resultat = $traitementDao->ajouterTraitement($referentiel_code, $script_nom);
293
					if ($resultat != false) {
294
						$this->addMessage("Le traitement #'$resultat' a été ajouté.");
295
						$this->lancerScript($referentiel_code, $script_nom);
296
					} else {
297
						$this->addMessage("Un problème est survenu lors de la tentative d'ajout du traitement.");
298
					}
299
				}
300
			}
301
		}
302
	}
303
 
304
	/**
305
	 * Lance le script d'execution des traitements
306
	 */
307
	protected function lancerScript($referentiel_code, $script_nom) {
308
		$php = Config::get('chemin_bin_php');
309
		$exe = Config::get('chemin_script');
310
		$action = 'tout';
311
		$log = Config::get('chemin_script_log');
312
		$commande = "$php -d memory_limit=1073741824 -f $exe $script_nom -p $referentiel_code -a $action > $log &";
313
 
314
		if ($this->verifierSafeModeOff() === false) {
315
			$e = "Le safe_mode est actif sur ce serveur.";
316
		} else if ($this->verifierAccesFonctionExec() === false) {
317
			$e = "La fonction 'exec()' fait partie des fonctions désactivées sur ce serveur (voir disable_functions).";
318
		} else {
319
			$this->addMessage("Lancement du script effectuant les traitements.");
320
			exec($commande);
321
		}
322
 
323
		// Affichage des message de paramêtrage du serveur si nécessaire
324
		if (Config::get('script_messages') == true) {
325
			$message_erreur_tpl = "%s\n.".
326
				"Il est nécessaire de configurer le lancement du script via une tache dans le cron.\n".
327
				"La commande à lancer est : <code>$commande</code>";
328
			$this->addMessage(sprintf($message_erreur_tpl, $e));
329
		}
330
	}
331
 
332
	private function verifierSafeModeOff() {
333
		return ('1' == ini_get('safe_mode')) ? false : true;
334
	}
335
 
336
	private function verifierAccesFonctionExec() {
337
		$disabled = explode(', ', ini_get('disable_functions'));
338
		return !in_array('exec', $disabled);
339
	}
6 jpm 340
}