Subversion Repositories Applications.referentiel

Rev

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

Rev 272 Rev 276
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.Config::get('manuel'));
37
		$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.Config::get('manuel'));
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
		$menu['title'] = "Liste des référentiels consultables.";
188
		$menu['title'] = "Liste des référentiels consultables.";
189
		$donnees['menus'][] = $menu;
189
		$donnees['menus'][] = $menu;
190
		$menu['nom'] = 'Consultation';
190
		$menu['nom'] = 'Consultation';
191
		$menu['url'] = $this->obtenirUrlMenuConsultation($referentiel);
191
		$menu['url'] = $this->obtenirUrlMenuConsultation($referentiel);
192
		$menu['activite'] = ((preg_match('/^(?:Consultation|Recherche|FicheTaxon)$/', $this->getModulePrincipalCourant())) ? 'actif' : 'inactif');
192
		$menu['activite'] = ((preg_match('/^(?:Consultation|Recherche|FicheTaxon)$/', $this->getModulePrincipalCourant())) ? 'actif' : 'inactif');
193
		$menu['title'] = "Interroger la base en cours de travail.";
193
		$menu['title'] = "Interroger la base en cours de travail.";
194
		$donnees['menus'][] = $menu;
194
		$donnees['menus'][] = $menu;
195
		$menu['nom'] = 'Tests';
195
		$menu['nom'] = 'Tests';
196
		$menu['url'] = $this->obtenirUrlMenuTest($referentiel); 
196
		$menu['url'] = $this->obtenirUrlMenuTest($referentiel); 
197
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Test') ? 'actif' : 'inactif securise');
197
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Test') ? 'actif' : 'inactif securise');
198
		$menu['title'] = "Réservé aux coordinateurs. Contrôler les données saisies.";
198
		$menu['title'] = "Réservé aux coordinateurs. Contrôler les données saisies.";
199
		$donnees['menus'][] = $menu;
199
		$donnees['menus'][] = $menu;
200
		$menu['nom'] = 'Versionnage';
200
		$menu['nom'] = 'Versionnage';
201
		$menu['url'] = $this->obtenirUrlMenuVersionnage($referentiel);
201
		$menu['url'] = $this->obtenirUrlMenuVersionnage($referentiel);
202
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Versionnage') ? 'actif' : 'inactif securise');
202
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Versionnage') ? 'actif' : 'inactif securise');
203
		$menu['title'] = "Réservé aux coordinateurs. Générer une version de la base.";
203
		$menu['title'] = "Réservé aux coordinateurs. Générer une version de la base.";
204
		$donnees['menus'][] = $menu;
204
		$donnees['menus'][] = $menu;
205
		$menu['nom'] = 'Informations';
205
		$menu['nom'] = 'Informations et téléchargements';
206
		$menu['url'] = $this->obtenirUrlMenuInformations($referentiel);
206
		$menu['url'] = $this->obtenirUrlMenuInformations($referentiel);
207
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Informations') ? 'actif' : 'inactif');
207
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Informations') ? 'actif' : 'inactif');
208
		$menu['title'] = "Informations sur le projet.";
208
		$menu['title'] = "Informations sur le projet et téléchargements.";
209
		$donnees['menus'][] = $menu;
209
		$donnees['menus'][] = $menu;
210
		$this->setSortie(self::RENDU_MENU, $this->getVue('menu', $donnees), false);
210
		$this->setSortie(self::RENDU_MENU, $this->getVue('menu', $donnees), false);
211
	}
211
	}
212
	/**
212
	/**
213
	 * Construction du fil d'ariane et stockage dans le conteneur de sortie RENDU_NAVIGATION.
213
	 * Construction du fil d'ariane et stockage dans le conteneur de sortie RENDU_NAVIGATION.
214
	 * 
214
	 * 
215
	 * @param $referentiel code du référentiel
215
	 * @param $referentiel code du référentiel
216
	 * @param $id_traitement id du traitement
216
	 * @param $id_traitement id du traitement
217
	 * @param $id_resultat id du résultat
217
	 * @param $id_resultat id du résultat
218
	 */
218
	 */
219
	protected function construireFilAriane($referentiel = null, $id_traitement = null, $id_resultat = null) {
219
	protected function construireFilAriane($referentiel = null, $id_traitement = null, $id_resultat = null) {
220
		$entree['nom'] = 'Accueil';
220
		$entree['nom'] = 'Accueil';
221
		$entree['url'] = $this->obtenirUrlMenuAccueil();
221
		$entree['url'] = $this->obtenirUrlMenuAccueil();
222
		$donnees['entrees'][] = $entree;
222
		$donnees['entrees'][] = $entree;
223
		
223
		
224
		if (isset($referentiel)) {
224
		if (isset($referentiel)) {
225
			$entree['nom'] = 'Informations '.strtoupper($referentiel);
225
			$entree['nom'] = 'Informations '.strtoupper($referentiel);
226
			$entree['url'] = $this->obtenirUrlDetailReferentiel($referentiel);
226
			$entree['url'] = $this->obtenirUrlDetailReferentiel($referentiel);
227
			$donnees['entrees'][] = $entree;
227
			$donnees['entrees'][] = $entree;
228
			
228
			
229
			$module_principal = $this->getModulePrincipalCourant();
229
			$module_principal = $this->getModulePrincipalCourant();
230
			if (isset($module_principal)) {
230
			if (isset($module_principal)) {
231
				$entree['nom'] = $module_principal;
231
				$entree['nom'] = $module_principal;
232
				$entree['url'] = $this->obtenirUrlMenu($module_principal, $referentiel);
232
				$entree['url'] = $this->obtenirUrlMenu($module_principal, $referentiel);
233
				$donnees['entrees'][] = $entree;
233
				$donnees['entrees'][] = $entree;
234
			}
234
			}
235
			
235
			
236
			if (isset($id_traitement)) {
236
			if (isset($id_traitement)) {
237
				$entree['nom'] = "Traitement #$id_traitement";
237
				$entree['nom'] = "Traitement #$id_traitement";
238
				$entree['url'] = $this->obtenirUrlFicheTraitement($referentiel, $id_traitement);
238
				$entree['url'] = $this->obtenirUrlFicheTraitement($referentiel, $id_traitement);
239
				$donnees['entrees'][] = $entree;
239
				$donnees['entrees'][] = $entree;
240
			}
240
			}
241
			
241
			
242
			if (isset($id_resultat)) {
242
			if (isset($id_resultat)) {
243
				$entree['nom'] = "Résultat #$id_resultat";
243
				$entree['nom'] = "Résultat #$id_resultat";
244
				$entree['url'] = $this->obtenirUrlFicheResultat($referentiel, $id_resultat);
244
				$entree['url'] = $this->obtenirUrlFicheResultat($referentiel, $id_resultat);
245
				$donnees['entrees'][] = $entree;
245
				$donnees['entrees'][] = $entree;
246
			}
246
			}
247
		}
247
		}
248
		
248
		
249
		$this->setSortie(self::RENDU_NAVIGATION, $this->getVue('fil_ariane', $donnees), false);
249
		$this->setSortie(self::RENDU_NAVIGATION, $this->getVue('fil_ariane', $donnees), false);
250
	}
250
	}
251
	
251
	
252
	protected function obtenirUrlDetailReferentiel($referentiel) {
252
	protected function obtenirUrlDetailReferentiel($referentiel) {
253
		$this->url->setRequete(false);
253
		$this->url->setRequete(false);
254
		$this->url->setVariableRequete('module', 'Informations');
254
		$this->url->setVariableRequete('module', 'Informations');
255
		$this->url->setVariableRequete('ref', $referentiel);
255
		$this->url->setVariableRequete('ref', $referentiel);
256
		$url = $this->url->getURL();
256
		$url = $this->url->getURL();
257
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref'));
257
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref'));
258
		return $url;
258
		return $url;
259
	}
259
	}
260
	
260
	
261
	protected function obtenirUrlMenuInformations($referentiel) {
261
	protected function obtenirUrlMenuInformations($referentiel) {
262
		return $this->obtenirUrlMenu('Informations', $referentiel);
262
		return $this->obtenirUrlMenu('Informations', $referentiel);
263
	}
263
	}
264
	
264
	
265
	protected function obtenirUrlMenuAccueil() {
265
	protected function obtenirUrlMenuAccueil() {
266
		return $this->obtenirUrlMenu('Accueil');
266
		return $this->obtenirUrlMenu('Accueil');
267
	}
267
	}
268
	
268
	
269
	protected function obtenirUrlMenuTest($referentiel) {
269
	protected function obtenirUrlMenuTest($referentiel) {
270
		return $this->obtenirUrlMenu('Test', $referentiel);
270
		return $this->obtenirUrlMenu('Test', $referentiel);
271
	}
271
	}
272
	
272
	
273
	protected function obtenirUrlMenuVersionnage($referentiel) {
273
	protected function obtenirUrlMenuVersionnage($referentiel) {
274
		return $this->obtenirUrlMenu('Versionnage', $referentiel);
274
		return $this->obtenirUrlMenu('Versionnage', $referentiel);
275
	}
275
	}
276
	
276
	
277
	protected function obtenirUrlDemandeVersionnage($referentiel) {
277
	protected function obtenirUrlDemandeVersionnage($referentiel) {
278
		$this->url->setRequete(false);
278
		$this->url->setRequete(false);
279
		$this->url->setVariableRequete('module', 'Versionnage');
279
		$this->url->setVariableRequete('module', 'Versionnage');
280
		$this->url->setVariableRequete('action', 'demanderTraitement');
280
		$this->url->setVariableRequete('action', 'demanderTraitement');
281
		$this->url->setVariableRequete('ref', $referentiel);
281
		$this->url->setVariableRequete('ref', $referentiel);
282
		$url = $this->url->getURL();
282
		$url = $this->url->getURL();
283
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref'));
283
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref'));
284
		return $url;
284
		return $url;
285
	}
285
	}
286
	
286
	
287
	protected function obtenirUrlMenuConsultation($referentiel) {
287
	protected function obtenirUrlMenuConsultation($referentiel) {
288
		return $this->obtenirUrlMenu('Consultation', $referentiel);
288
		return $this->obtenirUrlMenu('Consultation', $referentiel);
289
	}
289
	}
290
	
290
	
291
	private function obtenirUrlMenu($menu, $referentiel = null) {
291
	private function obtenirUrlMenu($menu, $referentiel = null) {
292
		$this->url->setRequete(false);
292
		$this->url->setRequete(false);
293
		$this->url->setVariableRequete('module', $menu);
293
		$this->url->setVariableRequete('module', $menu);
294
		if (isset($referentiel)) {
294
		if (isset($referentiel)) {
295
			$this->url->setVariableRequete('ref', $referentiel);
295
			$this->url->setVariableRequete('ref', $referentiel);
296
		}
296
		}
297
		$url = $this->url->getURL();
297
		$url = $this->url->getURL();
298
		$this->url->unsetVariablesRequete(array('module', 'ref'));
298
		$this->url->unsetVariablesRequete(array('module', 'ref'));
299
		return $url;
299
		return $url;
300
	}
300
	}
301
	
301
	
302
	protected function obtenirUrlFicheTraitement($referentiel, $id_traitement) {
302
	protected function obtenirUrlFicheTraitement($referentiel, $id_traitement) {
303
		$this->url->setRequete(false);
303
		$this->url->setRequete(false);
304
		$this->url->setVariableRequete('module', 'Traitement');
304
		$this->url->setVariableRequete('module', 'Traitement');
305
		$this->url->setVariableRequete('id-t', $id_traitement);
305
		$this->url->setVariableRequete('id-t', $id_traitement);
306
		$this->url->setVariableRequete('ref', $referentiel);
306
		$this->url->setVariableRequete('ref', $referentiel);
307
		$url = $this->url->getURL();
307
		$url = $this->url->getURL();
308
		$this->url->unsetVariablesRequete(array('module', 'id-t', 'ref'));
308
		$this->url->unsetVariablesRequete(array('module', 'id-t', 'ref'));
309
		return $url;
309
		return $url;
310
	}
310
	}
311
	
311
	
312
	protected function obtenirUrlFicheResultat($referentiel, $id_resultat) {
312
	protected function obtenirUrlFicheResultat($referentiel, $id_resultat) {
313
		$this->url->setRequete(false);
313
		$this->url->setRequete(false);
314
		$this->url->setVariableRequete('module', 'Resultat');
314
		$this->url->setVariableRequete('module', 'Resultat');
315
		$this->url->setVariableRequete('id-r', $id_resultat);
315
		$this->url->setVariableRequete('id-r', $id_resultat);
316
		$this->url->setVariableRequete('ref', $referentiel);
316
		$this->url->setVariableRequete('ref', $referentiel);
317
		$url = $this->url->getURL();
317
		$url = $this->url->getURL();
318
		$this->url->unsetVariablesRequete(array('module', 'id-r', 'ref'));
318
		$this->url->unsetVariablesRequete(array('module', 'id-r', 'ref'));
319
		return $url;
319
		return $url;
320
	}
320
	}
321
	
321
	
322
	protected function obtenirUrlRecherche($referentiel = null, $txt = null) {
322
	protected function obtenirUrlRecherche($referentiel = null, $txt = null) {
323
		$this->url->setRequete(false);
323
		$this->url->setRequete(false);
324
		if (!is_null($referentiel)) {
324
		if (!is_null($referentiel)) {
325
			$this->url->setVariableRequete('ref', $referentiel);
325
			$this->url->setVariableRequete('ref', $referentiel);
326
		}
326
		}
327
		$this->url->setVariableRequete('module', 'Recherche');
327
		$this->url->setVariableRequete('module', 'Recherche');
328
		$this->url->setVariableRequete('action', 'rechercher');
328
		$this->url->setVariableRequete('action', 'rechercher');
329
		if (!is_null($txt)) {
329
		if (!is_null($txt)) {
330
			$this->url->setVariableRequete('recherche', $txt);
330
			$this->url->setVariableRequete('recherche', $txt);
331
		}
331
		}
332
		$url = $this->url->getURL();
332
		$url = $this->url->getURL();
333
		$this->url->unsetVariablesRequete(array('ref', 'module', 'action', 'recherche'));
333
		$this->url->unsetVariablesRequete(array('ref', 'module', 'action', 'recherche'));
334
		return $url;
334
		return $url;
335
	}
335
	}
336
	protected function obtenirUrlFicheTaxon($referentiel, $num_nom = null) {
336
	protected function obtenirUrlFicheTaxon($referentiel, $num_nom = null) {
337
		$this->url->setRequete(false);
337
		$this->url->setRequete(false);
338
		$this->url->setVariableRequete('ref', $referentiel);
338
		$this->url->setVariableRequete('ref', $referentiel);
339
		$this->url->setVariableRequete('module', 'FicheTaxon');
339
		$this->url->setVariableRequete('module', 'FicheTaxon');
340
		if (!is_null($num_nom)) {
340
		if (!is_null($num_nom)) {
341
			$this->url->setVariableRequete('num_nom', $num_nom);
341
			$this->url->setVariableRequete('num_nom', $num_nom);
342
		}
342
		}
343
		$url = clone $this->url;
343
		$url = clone $this->url;
344
		$this->url->unsetVariablesRequete(array('module', 'id'));
344
		$this->url->unsetVariablesRequete(array('module', 'id'));
345
		return $url->getURL();
345
		return $url->getURL();
346
	}
346
	}
347
	
347
	
348
	/**
348
	/**
349
	 * Lance l'ajout d'un traitement
349
	 * Lance l'ajout d'un traitement
350
	 */
350
	 */
351
	protected function ajouterTraitement($referentiel_code, $script_nom) {
351
	protected function ajouterTraitement($referentiel_code, $script_nom) {
352
		$this->ajouterTraitementParametre($referentiel_code, null, $script_nom);
352
		$this->ajouterTraitementParametre($referentiel_code, null, $script_nom);
353
	}
353
	}
354
	
354
	
355
	/**
355
	/**
356
	 * Lance l'ajout d'un traitement
356
	 * Lance l'ajout d'un traitement
357
	 */
357
	 */
358
	protected function ajouterTraitementParametre($referentiel_code, $parametres_serialises, $script_nom) {
358
	protected function ajouterTraitementParametre($referentiel_code, $parametres_serialises, $script_nom) {
359
		if (is_null($referentiel_code)) {
359
		if (is_null($referentiel_code)) {
360
			$this->addMessage("Aucun code de projet de référentiel n'est indiqué (Ex. bdtfx).");
360
			$this->addMessage("Aucun code de projet de référentiel n'est indiqué (Ex. bdtfx).");
361
		} else {
361
		} else {
362
			$traitements_a_supprimer = null;
362
			$traitements_a_supprimer = null;
363
			$traitementDao = new TraitementDao();
363
			$traitementDao = new TraitementDao();
364
			$resultat_traitement_en_attente = $traitementDao->getTraitementsEnAttente($referentiel_code, $script_nom);
364
			$resultat_traitement_en_attente = $traitementDao->getTraitementsEnAttente($referentiel_code, $script_nom);
365
			if ($resultat_traitement_en_attente) {
365
			if ($resultat_traitement_en_attente) {
366
				foreach ($resultat_traitement_en_attente as $traitement) {
366
				foreach ($resultat_traitement_en_attente as $traitement) {
367
					$difference = $this->differenceEnSecondeEntreDeuxDates($traitement['meta_date_creation'], date ("Y-m-d H:i:s"));
367
					$difference = $this->differenceEnSecondeEntreDeuxDates($traitement['meta_date_creation'], date ("Y-m-d H:i:s"));
368
					Debug::printr("Différence attente : $difference > ".Config::get('ddv_traitement_attente'));
368
					Debug::printr("Différence attente : $difference > ".Config::get('ddv_traitement_attente'));
369
					if ($difference > Config::get('ddv_traitement_attente')) {
369
					if ($difference > Config::get('ddv_traitement_attente')) {
370
						$traitements_a_supprimer[] = $traitement['id_traitement'];
370
						$traitements_a_supprimer[] = $traitement['id_traitement'];
371
						$this->addMessage("Le traitement #{$traitement['id_traitement']} était en attente depuis plus de 5mn, il a été supprimé.");
371
						$this->addMessage("Le traitement #{$traitement['id_traitement']} était en attente depuis plus de 5mn, il a été supprimé.");
372
					} else {
372
					} else {
373
						$this->addMessage("Un traitement est déjà en attente...");
373
						$this->addMessage("Un traitement est déjà en attente...");
374
					}
374
					}
375
				}
375
				}
376
			} else {
376
			} else {
377
				$resultat_traitement_en_cours = $traitementDao->getTraitementsEnCours($referentiel_code, $script_nom);
377
				$resultat_traitement_en_cours = $traitementDao->getTraitementsEnCours($referentiel_code, $script_nom);
378
				if ($resultat_traitement_en_cours) {
378
				if ($resultat_traitement_en_cours) {
379
					foreach ($resultat_traitement_en_cours as $traitement) {
379
					foreach ($resultat_traitement_en_cours as $traitement) {
380
						$difference = $this->differenceEnSecondeEntreDeuxDates($traitement['date_debut'], date ("Y-m-d H:i:s"));
380
						$difference = $this->differenceEnSecondeEntreDeuxDates($traitement['date_debut'], date ("Y-m-d H:i:s"));
381
						Debug::printr("Différence en cours : $difference > ".Config::get('ddv_traitement_en_cours'));
381
						Debug::printr("Différence en cours : $difference > ".Config::get('ddv_traitement_en_cours'));
382
						if ($difference > Config::get('ddv_traitement_en_cours')) {
382
						if ($difference > Config::get('ddv_traitement_en_cours')) {
383
							$traitements_a_supprimer[] = $traitement['id_traitement'];
383
							$traitements_a_supprimer[] = $traitement['id_traitement'];
384
							$this->addMessage("Le traitement #{$traitement['id_traitement']} était en cours depuis plus de 5mn, il a été supprimé.");
384
							$this->addMessage("Le traitement #{$traitement['id_traitement']} était en cours depuis plus de 5mn, il a été supprimé.");
385
						} else {
385
						} else {
386
							$this->addMessage("Un traitement est déjà en cours...");
386
							$this->addMessage("Un traitement est déjà en cours...");
387
						}
387
						}
388
					}
388
					}
389
				} else {
389
				} else {
390
					$resultat = $traitementDao->ajouterTraitementParametre($referentiel_code, $parametres_serialises, $script_nom);
390
					$resultat = $traitementDao->ajouterTraitementParametre($referentiel_code, $parametres_serialises, $script_nom);
391
					if ($resultat != false) {
391
					if ($resultat != false) {
392
						$this->addMessage("Le traitement #'$resultat' a été ajouté.");
392
						$this->addMessage("Le traitement #'$resultat' a été ajouté.");
393
						$this->lancerScript($referentiel_code, $script_nom);
393
						$this->lancerScript($referentiel_code, $script_nom);
394
					} else {
394
					} else {
395
						$this->addMessage("Un problème est survenu lors de la tentative d'ajout du traitement.");
395
						$this->addMessage("Un problème est survenu lors de la tentative d'ajout du traitement.");
396
					}
396
					}
397
				}
397
				}
398
			}
398
			}
399
			// Suppression des traitements posant problème
399
			// Suppression des traitements posant problème
400
			if (count($traitements_a_supprimer) > 0) {
400
			if (count($traitements_a_supprimer) > 0) {
401
				$traitementDao->supprimer($traitements_a_supprimer);
401
				$traitementDao->supprimer($traitements_a_supprimer);
402
			}
402
			}
403
		}
403
		}
404
	}
404
	}
405
	
405
	
406
	private function differenceEnSecondeEntreDeuxDates($date_01, $date_02) {
406
	private function differenceEnSecondeEntreDeuxDates($date_01, $date_02) {
407
		if (floatval(phpversion()) >= 5.3 ) {
407
		if (floatval(phpversion()) >= 5.3 ) {
408
			$d1 = new DateTime($date_01);
408
			$d1 = new DateTime($date_01);
409
			$d2 = new DateTime($date_02);
409
			$d2 = new DateTime($date_02);
410
			$difference_absolue = true;
410
			$difference_absolue = true;
411
			$diff = $d1->diff($d2, $difference_absolue);
411
			$diff = $d1->diff($d2, $difference_absolue);
412
			$nbre_secondes = $diff->format('s');
412
			$nbre_secondes = $diff->format('s');
413
		} else {
413
		} else {
414
			$nbre_secondes = abs(round((strtotime($date_01) - strtotime($date_02)))); 
414
			$nbre_secondes = abs(round((strtotime($date_01) - strtotime($date_02)))); 
415
		}
415
		}
416
		return $nbre_secondes;
416
		return $nbre_secondes;
417
	}
417
	}
418
	
418
	
419
	/**
419
	/**
420
	 * Lance le script d'execution des traitements
420
	 * Lance le script d'execution des traitements
421
	 */
421
	 */
422
	protected function lancerScript($referentiel_code, $script_nom) {
422
	protected function lancerScript($referentiel_code, $script_nom) {
423
		$php = Config::get('chemin_bin_php');
423
		$php = Config::get('chemin_bin_php');
424
		$exe = Config::get('chemin_script');
424
		$exe = Config::get('chemin_script');
425
		$action = 'tout';
425
		$action = 'tout';
426
		$log = Config::get('chemin_script_log');
426
		$log = Config::get('chemin_script_log');
427
		$limite_memoire = Config::get('script_limite_memoire');
427
		$limite_memoire = Config::get('script_limite_memoire');
428
		$commande = "$php -d memory_limit=$limite_memoire -f $exe $script_nom -p $referentiel_code -a $action > $log &";
428
		$commande = "$php -d memory_limit=$limite_memoire -f $exe $script_nom -p $referentiel_code -a $action > $log &";
429
		
429
		
430
		if ($this->verifierSafeModeOff() === false) {
430
		if ($this->verifierSafeModeOff() === false) {
431
			$e = "Le safe_mode est actif sur ce serveur.";
431
			$e = "Le safe_mode est actif sur ce serveur.";
432
		} else if ($this->verifierAccesFonctionExec() === false) {
432
		} else if ($this->verifierAccesFonctionExec() === false) {
433
			$e = "La fonction 'exec()' fait partie des fonctions désactivées sur ce serveur (voir disable_functions).";
433
			$e = "La fonction 'exec()' fait partie des fonctions désactivées sur ce serveur (voir disable_functions).";
434
		} else {
434
		} else {
435
			$this->addMessage("Lancement du script effectuant les traitements.");
435
			$this->addMessage("Lancement du script effectuant les traitements.");
436
			exec($commande);
436
			exec($commande);
437
		}
437
		}
438
 
438
 
439
		// Affichage des message de paramêtrage du serveur si nécessaire
439
		// Affichage des message de paramêtrage du serveur si nécessaire
440
		if (Config::get('script_messages') == true) {
440
		if (Config::get('script_messages') == true) {
441
			$message_erreur_tpl = "%s\n.".
441
			$message_erreur_tpl = "%s\n.".
442
				"Il est nécessaire de configurer le lancement du script via une tache dans le cron.\n".
442
				"Il est nécessaire de configurer le lancement du script via une tache dans le cron.\n".
443
				"La commande à lancer est : <code>$commande</code>";
443
				"La commande à lancer est : <code>$commande</code>";
444
			$this->addMessage(sprintf($message_erreur_tpl, $e));
444
			$this->addMessage(sprintf($message_erreur_tpl, $e));
445
		}
445
		}
446
	}
446
	}
447
	
447
	
448
	private function verifierSafeModeOff() {
448
	private function verifierSafeModeOff() {
449
		return ('1' == ini_get('safe_mode')) ? false : true;
449
		return ('1' == ini_get('safe_mode')) ? false : true;
450
	}
450
	}
451
	
451
	
452
	private function verifierAccesFonctionExec() {
452
	private function verifierAccesFonctionExec() {
453
		$disabled = explode(', ', ini_get('disable_functions'));
453
		$disabled = explode(', ', ini_get('disable_functions'));
454
		return !in_array('exec', $disabled);
454
		return !in_array('exec', $disabled);
455
	}
455
	}
-
 
456
	
-
 
457
	//+----------------------------------------------------------------------------------------------------------------+
-
 
458
	// GESTION DES FICHIERS A TELECHARGER
-
 
459
	
-
 
460
	/**
-
 
461
	* Crée la liste d'url des fichiers à télécharger pour un traitement donné
-
 
462
	* @param Array $infos_traitement tableau contenant les informations du traitement
-
 
463
	* 
-
 
464
	* @return Array un tableau contenant la liste des urls des fichiers à télécharger
-
 
465
	*/
-
 
466
	protected function obtenirUrlsZipPourTraitement($infos_traitement) {
-
 
467
		$urls_zip = null;
-
 
468
		if (isset($infos_traitement['script']) && $infos_traitement['script'] == 'versionnage') {
-
 
469
			$meta = unserialize($infos_traitement['script_parametres']);
-
 
470
			$projet = strtolower($infos_traitement['referentiel_code']);
-
 
471
			$version = str_replace('.', '_', $meta['version']);
-
 
472
			$fichier_zip_bdnt = $projet.'_v'.$version.'.zip';
-
 
473
			$url_zip_bdnt = sprintf(Config::get('url_zip_tpl'), $fichier_zip_bdnt);
-
 
474
			if ($this->testerUrl($url_zip_bdnt)) {
-
 
475
				$urls_zip[$fichier_zip_bdnt] = $url_zip_bdnt;
-
 
476
			}
-
 
477
	
-
 
478
			$fichier_zip_partiel_ancien = $projet.'_v'.$version.'_partiel.zip';
-
 
479
			$url_zip_partiel_ancienne = sprintf(Config::get('url_zip_tpl'), $fichier_zip_partiel_ancien);
-
 
480
			$fichier_zip_partiel = $projet.'_v'.$version.$this->manuel['suffixe_partiel'].'.zip';
-
 
481
			$url_zip_partiel = sprintf(Config::get('url_zip_tpl'), $fichier_zip_partiel);
-
 
482
			if ($this->testerUrl($url_zip_partiel)) {
-
 
483
				$urls_zip[$fichier_zip_partiel] = $url_zip_partiel;
-
 
484
			} else if ($this->testerUrl($url_zip_partiel_ancienne)) {
-
 
485
				$urls_zip[$fichier_zip_partiel_ancien] = $url_zip_partiel_ancienne;
-
 
486
			}
-
 
487
	
-
 
488
		}
-
 
489
		return $urls_zip;
-
 
490
	}
-
 
491
	
-
 
492
	/**
-
 
493
	* Teste une url donnée, en tentant de l'ouvrir et de la fermer
-
 
494
	*
-
 
495
	* @return boolean un booléen indiquant le succès ou non de l'opération
-
 
496
	*/
-
 
497
	protected function testerUrl($url) {
-
 
498
		//TODO: voir si on peut inclure cette fonction dans le framework
-
 
499
		ini_set('allow_url_fopen', '1');
-
 
500
		return (@fclose(@fopen($url, 'r'))) ? true : false;
-
 
501
	}
456
	
502
	
457
	//+----------------------------------------------------------------------------------------------------------------+
503
	//+----------------------------------------------------------------------------------------------------------------+
458
	// GESTION DU CLIENT REST
504
	// GESTION DU CLIENT REST
459
	
505
	
460
	protected function getRestClient() {
506
	protected function getRestClient() {
461
		if (! isset($this->restClient)) {
507
		if (! isset($this->restClient)) {
462
			$this->restClient = new RestClient();
508
			$this->restClient = new RestClient();
463
		}
509
		}
464
		return $this->restClient;
510
		return $this->restClient;
465
	}
511
	}
466
	
512
	
467
	//+----------------------------------------------------------------------------------------------------------------+
513
	//+----------------------------------------------------------------------------------------------------------------+
468
	// GESTION DE L'IDENTIFICATION
514
	// GESTION DE L'IDENTIFICATION
469
	
515
	
470
	protected function getAuthIdentifiant() {
516
	protected function getAuthIdentifiant() {
471
		$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
517
		$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
472
		return $id;
518
		return $id;
473
	}
519
	}
474
	
520
	
475
	protected function getAuthMotDePasse() {
521
	protected function getAuthMotDePasse() {
476
		$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
522
		$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
477
		return $mdp;
523
		return $mdp;
478
	}
524
	}
479
	
525
	
480
	public function authentifierCoordinateur() { 
526
	public function authentifierCoordinateur() { 
481
		$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
527
		$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
482
		$message_echec = "Accès limité aux coordinateurs du projet.\n".
528
		$message_echec = "Accès limité aux coordinateurs du projet.\n".
483
			"Votre tentative d'identification a échoué.\n".
529
			"Votre tentative d'identification a échoué.\n".
484
			"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme coordinateur.";
530
			"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme coordinateur.";
485
		return $this->authentifier($message_accueil, $message_echec);
531
		return $this->authentifier($message_accueil, $message_echec);
486
	}
532
	}
487
	
533
	
488
	private function authentifier($message_accueil, $message_echec) {
534
	private function authentifier($message_accueil, $message_echec) {
489
		$id = $this->getAuthIdentifiant();
535
		$id = $this->getAuthIdentifiant();
490
		if (!isset($id)) {
536
		if (!isset($id)) {
491
			$this->envoyerAuth($message_accueil, $message_echec);
537
			$this->envoyerAuth($message_accueil, $message_echec);
492
		} else {
538
		} else {
493
			$autorisation = $this->etreCoordinateurAutorise();
539
			$autorisation = $this->etreCoordinateurAutorise();
494
			if ($autorisation == false) {
540
			if ($autorisation == false) {
495
				$this->envoyerAuth($message_accueil, $message_echec);
541
				$this->envoyerAuth($message_accueil, $message_echec);
496
			}
542
			}
497
		}
543
		}
498
		return true;
544
		return true;
499
	} 
545
	} 
500
	
546
	
501
	public function etreCoordinateurAutorise($identifiant) {
547
	public function etreCoordinateurAutorise($identifiant) {
502
		$identifiant = $this->getAuthIdentifiant();
548
		$identifiant = $this->getAuthIdentifiant();
503
		$mdp = md5($this->getAuthMotDePasse());
549
		$mdp = md5($this->getAuthMotDePasse());
504
		$url = sprintf(Config::get('authentification.serviceUrlTpl'), $identifiant, $mdp);
550
		$url = sprintf(Config::get('authentification.serviceUrlTpl'), $identifiant, $mdp);
505
		$json = $this->getRestClient()->envoyerRequeteConsultation($url);
551
		$json = $this->getRestClient()->envoyerRequeteConsultation($url);
506
		$existe = json_decode($json);
552
		$existe = json_decode($json);
507
		$admin = $this->etreCoordinateur($identifiant) ? true : false;
553
		$admin = $this->etreCoordinateur($identifiant) ? true : false;
508
		$autorisation = ($existe && $admin) ? true : false;
554
		$autorisation = ($existe && $admin) ? true : false;
509
		return $autorisation;
555
		return $autorisation;
510
	}
556
	}
511
	
557
	
512
	public function etreCoordinateur($courriel) {
558
	public function etreCoordinateur($courriel) {
513
		$coordinateurs = Config::get('authentification.coordinateurs');
559
		$coordinateurs = Config::get('authentification.coordinateurs');
514
		$courriels_autorises = explode(',', $coordinateurs);
560
		$courriels_autorises = explode(',', $coordinateurs);
515
 
561
 
516
		$autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ;
562
		$autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ;
517
		return $autorisation;
563
		return $autorisation;
518
	}
564
	}
519
	
565
	
520
	private function envoyerAuth($message_accueil, $message_echec) {
566
	private function envoyerAuth($message_accueil, $message_echec) {
521
		header('HTTP/1.0 401 Unauthorized');
567
		header('HTTP/1.0 401 Unauthorized');
522
		header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
568
		header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
523
		header('Content-type: text/plain; charset=UTF-8');
569
		header('Content-type: text/plain; charset=UTF-8');
524
		print $message_echec;
570
		print $message_echec;
525
		exit(0);
571
		exit(0);
526
	}
572
	}
527
}
573
}