Subversion Repositories Applications.referentiel

Rev

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

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