Subversion Repositories eFlore/Applications.del

Rev

Rev 1443 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1443 Rev 1448
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
	* Le web service image récupère toutes les données de la table del_obs_images
4
	* Le web service image récupère toutes les données de la table del_obs_images
5
 * pour retourner une liste d'images associée à une observation
5
 * pour retourner une liste d'images associée à une observation
6
 *
6
 *
7
 * @category	php 5.2
7
 * @category	php 5.2
8
 * @package	del
8
 * @package	del
9
 * @subpackage images
9
 * @subpackage images
10
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
 * @copyright	Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
11
 * @copyright	Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
12
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
12
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
13
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
13
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
14
 * @version	$Id: Bdd.php 403 2012-02-22 14:35:20Z gduche $
14
 * @version	$Id: Bdd.php 403 2012-02-22 14:35:20Z gduche $
15
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images
15
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images
16
 */
16
 */
17
 
17
 
18
 
18
 
19
/**
19
/**
20
 * FONCTION TEMPORAIRE de debug pour afficher le contenu d'une variable en format lisible
20
 * FONCTION TEMPORAIRE de debug pour afficher le contenu d'une variable en format lisible
21
 * @param $r la variable à afficher
21
 * @param $r la variable à afficher
22
 * */
22
 * */
23
function debug($r) {
23
function debug($r) {
24
	echo '<pre>'.print_r($r, true).'</pre>';
24
	echo '<pre>'.print_r($r, true).'</pre>';
25
}
25
}
26
 
26
 
27
 
27
 
28
/**
28
/**
29
 * Le service ListeImages récupère les données des tables observation et images
29
 * Le service ListeImages récupère les données des tables observation et images
30
 * et les mets au format JSON pour identiplante / pictoflora 
30
 * et les mets au format JSON pour identiplante / pictoflora 
31
 * */
31
 * */
32
class ListeImages {
32
class ListeImages {
33
	
33
	
34
	
34
	
35
	// Variables :
35
	// Variables :
36
	// Configuration générale du service
36
	// Configuration générale du service
37
	private $conteneur;
37
	private $conteneur;
38
	private $navigation;
38
	private $navigation;
39
	private $bdd;
39
	private $bdd;
40
	private $gestionBdd;
40
	private $gestionBdd;
41
	
41
	
42
	// Parametres
42
	// Parametres
43
	private $ressources = array();
43
	private $ressources = array();
44
	private $parametres = array();
44
	private $parametres = array();
45
	private $masque;
45
	private $masque;
46
	
46
	
47
	private $tri = 'date_transmission';
47
	private $tri = 'date_transmission';
48
	private $directionTri = 'desc';
48
	private $directionTri = 'desc';
49
	private $formatRetour = 'XL';
49
	private $formatRetour = 'XL';
50
	
50
	
51
	private $imageIds = array();
51
	private $imageIds = array();
52
	
52
	
53
	
53
	
54
	/**
54
	/**
55
	 * Constructeur de l'application 
55
	 * Constructeur de l'application 
56
	 * Initialisation des variables générale de l'application
56
	 * Initialisation des variables générale de l'application
57
	 * @param Conteneu $conteneur le conteneur de classes de l'application
57
	 * @param Conteneu $conteneur le conteneur de classes de l'application
58
	 * */
58
	 * */
59
	public function __construct(Conteneur $conteneur = null) {
59
	public function __construct(Conteneur $conteneur = null) {
60
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
60
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
61
		$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
61
		$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
62
		$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
62
		$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
63
		$this->conteneur->chargerConfiguration('config_images.ini');
63
		$this->conteneur->chargerConfiguration('config_images.ini');
64
		$this->navigation = $conteneur->getNavigation();
64
		$this->navigation = $conteneur->getNavigation();
65
		$this->masque = $conteneur->getMasque();
65
		$this->masque = $conteneur->getMasque();
66
		$this->gestionBdd = $conteneur->getGestionBdd();
66
		$this->gestionBdd = $conteneur->getGestionBdd();
67
		$this->bdd = $this->gestionBdd->getBdd();	
67
		$this->bdd = $this->gestionBdd->getBdd();	
68
	}
68
	}
69
	
69
	
70
	
70
	
71
	/**
71
	/**
72
	 * Méthode principale de la classe.
72
	 * Méthode principale de la classe.
73
	 * Lance la récupération des images dans la base et les place dans un objet ResultatService
73
	 * Lance la récupération des images dans la base et les place dans un objet ResultatService
74
	 * pour l'afficher.
74
	 * pour l'afficher.
75
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
75
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
76
	 * @param array $parametres les paramètres situés après le ? dans l'url
76
	 * @param array $parametres les paramètres situés après le ? dans l'url
77
	 * */
77
	 * */
78
	public function consulter($ressources, $parametres) {
78
	public function consulter($ressources, $parametres) {
79
	
79
	
80
		$this->initialiserRessourcesEtParametres($ressources, $parametres);
80
		$this->initialiserRessourcesEtParametres($ressources, $parametres);
81
		
81
		
82
		$this->configurer();
82
		$this->configurer();
83
		$this->verifierConfiguration();
83
		$this->verifierConfiguration();
84
	
84
	
85
		$this->verifierParametresTri();
85
		$this->verifierParametresTri();
86
		$this->initialiserTri();
86
		$this->initialiserTri();
87
		
87
		
88
		$this->verifierParametreFormatRetour();
88
		$this->verifierParametreFormatRetour();
89
		$this->initialiserFormatRetour();
89
		$this->initialiserFormatRetour();
90
	
90
	
91
		$parametres = $this->nettoyerParametres($parametres);
91
		$parametres = $this->nettoyerParametres($parametres);
92
	
92
	
93
		// En fonction des paramètres de recherche, on n'effectue
93
		// En fonction des paramètres de recherche, on n'effectue
94
		// pas la même requête, pour optimiser les jointures et les
94
		// pas la même requête, pour optimiser les jointures et les
95
		// rapidités d'éxécution.
95
		// rapidités d'éxécution.
96
		$type = $this->getTypeRequete($ressources, $parametres);
96
		$type = $this->getTypeRequete($ressources, $parametres);
97
	
97
	
98
		switch ($type) {
98
		switch ($type) {
99
			case 'obs' :
99
			case 'obs' :
100
				$liaisons = $this->chargerLiaisonsObs();
100
				$liaisons = $this->chargerLiaisonsObs();
101
			break;
101
			break;
102
			case 'images' :
102
			case 'images' :
103
				$liaisons = $this->chargerLiaisonsImages();
103
				$liaisons = $this->chargerLiaisonsImages();
104
			break;
104
			break;
105
			case 'obs-images' :
105
			case 'obs-images' :
106
				$liaisons = $this->chargerLiaisons();
106
				$liaisons = $this->chargerLiaisons();
107
			break;
107
			break;
108
			case 'id':
108
			case 'id':
109
				$liaisons = $this->chargerLiaisonsParId();
109
				$liaisons = $this->chargerLiaisonsParId();
110
			break;
110
			break;
111
			default : //case simple !
111
			default : //case simple !
112
				$liaisons = $this->chargerLiaisonsSimple();
112
				$liaisons = $this->chargerLiaisonsSimple();
113
		}
113
		}
114
	
114
	
115
		$images = array();
115
		$images = array();
116
		if($liaisons) {
116
		if($liaisons) {
117
			// Partie commune à tous les cas : on complète les liaisons avec les informations des votes
117
			// Partie commune à tous les cas : on complète les liaisons avec les informations des votes
118
			// et des images, puis on affiche sous forme de JSON
118
			// et des images, puis on affiche sous forme de JSON
119
			$images = $this->chargerImage($liaisons);
119
			$images = $this->chargerImage($liaisons);
120
			$images = $this->chargerVotes($images);
120
			$images = $this->chargerVotes($images);
121
		}
121
		}
122
 
122
 
123
		$resultat = new ResultatService();
123
		$resultat = new ResultatService();
-
 
124
		if ($type == 'id') {
-
 
125
			$clefsImages =array_keys($images);
-
 
126
			$resultat->corps = $images[$clefsImages[0]];
-
 
127
		} else {
124
		$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
128
			$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
-
 
129
		}
125
		
130
 
126
		return $resultat;
131
		return $resultat;
127
	}
132
	}
128
	
133
	
129
	
134
	
130
	
135
	
131
	/**************************************************************************************
136
	/**************************************************************************************
132
	 *								FONCTION LIEES AUX REQUETES 						  *
137
	 *								FONCTION LIEES AUX REQUETES 						  *
133
	 **************************************************************************************/
138
	 **************************************************************************************/
134
	
139
	
135
	/**
140
	/**
136
	 * Charger la clause WHERE en fonction des paramètres de masque
141
	 * Charger la clause WHERE en fonction des paramètres de masque
137
	 * */
142
	 * */
138
	private function chargerClauseWhere() {
143
	private function chargerClauseWhere() {
139
 
144
 
140
		$where = array();
145
		$where = array();
141
		$tableauMasque = $this->masque->getMasque();
146
		$tableauMasque = $this->masque->getMasque();
142
		if (!empty($tableauMasque)) {
147
		if (!empty($tableauMasque)) {
143
			foreach($tableauMasque as $idMasque => $valeurMasque) {
148
			foreach($tableauMasque as $idMasque => $valeurMasque) {
144
				//TODO: scinder ceci en fonctions réutilisables ?
149
				//TODO: scinder ceci en fonctions réutilisables ?
145
				// voir si c'est interessant par rapport à la recherche générale
150
				// voir si c'est interessant par rapport à la recherche générale
146
				$idMasque = str_replace('masque.', '', $idMasque);
151
				$idMasque = str_replace('masque.', '', $idMasque);
147
				switch ($idMasque) {
152
				switch ($idMasque) {
148
				// nom du masque => nom BDD
153
				// nom du masque => nom BDD
149
					case 'auteur' :
154
					case 'auteur' :
150
							$whereAuteur = ' '.$this->creerFiltreAuteur($this->masque->getMasque('auteur'));
155
							$whereAuteur = ' '.$this->creerFiltreAuteur($this->masque->getMasque('auteur'));
151
									if($whereAuteur != '') {
156
									if($whereAuteur != '') {
152
										$where[] = $whereAuteur;
157
										$where[] = $whereAuteur;
153
									}
158
									}
154
									break;
159
									break;
155
					case 'date' :
160
					case 'date' :
156
					$whereDate = ' '.$this->creerFiltreDate($valeurMasque);
161
					$whereDate = ' '.$this->creerFiltreDate($valeurMasque);
157
					if($whereDate != '') {
162
					if($whereDate != '') {
158
						$where[] = $whereDate;
163
						$where[] = $whereDate;
159
					}
164
					}
160
					break;
165
					break;
161
					case 'departement' :
166
					case 'departement' :
162
						$where[] = ' '.$this->creerFiltreIdZoneGeo($valeurMasque);
167
						$where[] = ' '.$this->creerFiltreIdZoneGeo($valeurMasque);
163
						break;
168
						break;
164
					case 'genre' :
169
					case 'genre' :
165
						$where[] = ' '.$this->mappingFiltre['ns'].' LIKE '.$this->proteger($valeurMasque.' %');
170
						$where[] = ' '.$this->mappingFiltre['ns'].' LIKE '.$this->proteger($valeurMasque.' %');
166
						break;
171
						break;
167
					case 'tag' :
172
					case 'tag' :
168
						$where[] = ' '.$this->creerFiltreMotsCles($valeurMasque);
173
						$where[] = ' '.$this->creerFiltreMotsCles($valeurMasque);
169
						break;
174
						break;
170
					case 'referentiel' :
175
					case 'referentiel' :
171
						$where[] = ' dob.nom_referentiel LIKE '.$this->proteger($valeurMasque.'%');
176
						$where[] = ' dob.nom_referentiel LIKE '.$this->proteger($valeurMasque.'%');
172
						break;
177
						break;
173
					case 'ns' :
178
					case 'ns' :
174
						$where[] = ' nom_sel LIKE '.$this->proteger($valeurMasque.'%');
179
						$where[] = ' nom_sel LIKE '.$this->proteger($valeurMasque.'%');
175
						break;
180
						break;
176
					case 'nn' :
181
					case 'nn' :
177
						$where[] = ' (nom_sel_nn = '.intval($valeurMasque).' OR '.
182
						$num_noms = $valeurMasque;
-
 
183
						$num_noms = explode(',', $num_noms);
178
								   ' nom_ret_nn = '.intval($valeurMasque).') ';
184
						$num_noms = array_map('intval', $num_noms);
-
 
185
						$num_noms = array_filter($num_noms);
-
 
186
						$num_noms = implode(',', $num_noms);
-
 
187
						$where[] = "(nom_sel_nn IN ($num_noms) OR nom_ret_nn IN ($num_noms)) ";
179
						break;
188
						break;
180
					case 'commune' :
189
					case 'commune' :
181
						$where[] = ' '.$this->mappingFiltre[$idMasque].' LIKE '.$this->proteger(str_replace(array('-',' '), '_', $valeurMasque).'%');
190
						$where[] = ' '.$this->mappingFiltre[$idMasque].' LIKE '.$this->proteger(str_replace(array('-',' '), '_', $valeurMasque).'%');
182
						break;
191
						break;
183
					case 'masque' :
192
					case 'masque' :
184
						$where[] = ' '.$this->creerFiltreMasqueGeneral($valeurMasque);
193
						$where[] = ' '.$this->creerFiltreMasqueGeneral($valeurMasque);
185
						break;
194
						break;
186
					default:
195
					default:
187
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->proteger($valeurMasque);
196
						$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->proteger($valeurMasque);
188
						break;
197
						break;
189
				}
198
				}
190
			}
199
			}
191
		}
200
		}
192
	
201
	
193
		if (!empty($where)) {
202
		if (!empty($where)) {
194
			return ' WHERE '.implode('AND', $where);
203
			return ' WHERE '.implode('AND', $where);
195
		} else {
204
		} else {
196
			return;
205
			return;
197
		}
206
		}
198
	}
207
	}
199
	
208
	
200
	/**
209
	/**
201
	 * Créer un masque général lorsque l'on souhaite utiliser le passe partout
210
	 * Créer un masque général lorsque l'on souhaite utiliser le passe partout
202
	 * @param la valeur du passe partout
211
	 * @param la valeur du passe partout
203
	 * */
212
	 * */
204
	private function creerFiltreMasqueGeneral($valeurMasque) {
213
	private function creerFiltreMasqueGeneral($valeurMasque) {
205
		//TODO: affecter d'aborder les variables, puis les tester pour les
214
		//TODO: affecter d'aborder les variables, puis les tester pour les
206
		// ajouter à la chaine
215
		// ajouter à la chaine
207
		$whereAuteur = $this->creerFiltreAuteur($valeurMasque);
216
		$whereAuteur = $this->creerFiltreAuteur($valeurMasque);
208
		$whereIdZoneGeo = $this->creerFiltreIdZoneGeo($valeurMasque);
217
		$whereIdZoneGeo = $this->creerFiltreIdZoneGeo($valeurMasque);
209
	
218
	
210
		$masqueGeneral = '( '.
219
		$masqueGeneral = '( '.
211
				(($whereAuteur != '') ? $whereAuteur.' OR ' : '' ).
220
				(($whereAuteur != '') ? $whereAuteur.' OR ' : '' ).
212
				(($whereIdZoneGeo != '') ? $whereIdZoneGeo.' OR ' : '' ).
221
				(($whereIdZoneGeo != '') ? $whereIdZoneGeo.' OR ' : '' ).
213
				'zone_geo LIKE '.$this->proteger($this->remplacerParJokerCaractere($valeurMasque).'%').' OR '.
222
				'zone_geo LIKE '.$this->proteger($this->remplacerParJokerCaractere($valeurMasque).'%').' OR '.
214
				$this->creerFiltreMotsCles($valeurMasque).' OR '.
223
				$this->creerFiltreMotsCles($valeurMasque).' OR '.
215
				'nom_sel LIKE '.$this->proteger($valeurMasque.'%').' OR '.
224
				'nom_sel LIKE '.$this->proteger($valeurMasque.'%').' OR '.
216
				'famille LIKE '.$this->proteger($valeurMasque.'%').' OR '.
225
				'famille LIKE '.$this->proteger($valeurMasque.'%').' OR '.
217
				'milieu LIKE '.$this->proteger($valeurMasque).' OR '.
226
				'milieu LIKE '.$this->proteger($valeurMasque).' OR '.
218
				$this->mappingFiltre['ns'].' LIKE '.$this->proteger('%'.$valeurMasque.'% %').' OR '.
227
				$this->mappingFiltre['ns'].' LIKE '.$this->proteger('%'.$valeurMasque.'% %').' OR '.
219
				$this->creerFiltreDate($valeurMasque).
228
				$this->creerFiltreDate($valeurMasque).
220
				') ';
229
				') ';
221
	
230
	
222
		return $masqueGeneral;
231
		return $masqueGeneral;
223
	}
232
	}
224
	
233
	
225
	/**
234
	/**
226
	 * Créer le filtre auteur en recherchant dans son nom, prénom, adresse email en fonction 
235
	 * Créer le filtre auteur en recherchant dans son nom, prénom, adresse email en fonction 
227
	 * de la chaine donnée 
236
	 * de la chaine donnée 
228
	 * @param la valeur recherchée
237
	 * @param la valeur recherchée
229
	 * */
238
	 * */
230
	private function creerFiltreAuteur($valeurMasque) {
239
	private function creerFiltreAuteur($valeurMasque) {
231
		$masque = '';
240
		$masque = '';
232
		$auteurId = $valeurMasque;
241
		$auteurId = $valeurMasque;
233
		if (is_numeric($auteurId)) {
242
		if (is_numeric($auteurId)) {
234
			$masque = ' ce_utilisateur = '.$auteurId;
243
			$masque = ' ce_utilisateur = '.$auteurId;
235
		} else {
244
		} else {
236
			if (strpos($auteurId, '@') === false) {
245
			if (strpos($auteurId, '@') === false) {
237
				$tableauNomPrenom = explode(' ',$auteurId, 2);
246
				$tableauNomPrenom = explode(' ',$auteurId, 2);
238
				if(count($tableauNomPrenom) == 2) {
247
				if(count($tableauNomPrenom) == 2) {
239
					// on teste potentiellement un nom prenom ou bien un prénom nom
248
					// on teste potentiellement un nom prenom ou bien un prénom nom
240
					$masque = '('.
249
					$masque = '('.
241
							'(nom LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '.
250
							'(nom LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '.
242
							'prenom LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '.
251
							'prenom LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '.
243
							'(nom LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
252
							'(nom LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
244
							'prenom LIKE '.$this->proteger($tableauNomPrenom[0].'%').') OR '.
253
							'prenom LIKE '.$this->proteger($tableauNomPrenom[0].'%').') OR '.
245
							'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '.
254
							'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '.
246
							'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '.
255
							'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '.
247
							'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
256
							'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
248
							'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').') OR '.
257
							'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').') OR '.
249
							'(nom LIKE '.$this->proteger($valeurMasque.'%').') OR '.
258
							'(nom LIKE '.$this->proteger($valeurMasque.'%').') OR '.
250
							'(prenom LIKE '.$this->proteger($valeurMasque.'%').') OR '.
259
							'(prenom LIKE '.$this->proteger($valeurMasque.'%').') OR '.
251
							'(dob.nom_utilisateur LIKE '.$this->proteger($valeurMasque.'%').') OR '.
260
							'(dob.nom_utilisateur LIKE '.$this->proteger($valeurMasque.'%').') OR '.
252
							'(dob.prenom_utilisateur LIKE '.$this->proteger($valeurMasque.'%').') '.
261
							'(dob.prenom_utilisateur LIKE '.$this->proteger($valeurMasque.'%').') '.
253
							')';
262
							')';
254
				} else {
263
				} else {
255
					$masque = '(
264
					$masque = '(
256
						            (nom LIKE '.$this->proteger($auteurId.'%').' OR '.
265
						            (nom LIKE '.$this->proteger($auteurId.'%').' OR '.
257
							            'prenom LIKE '.$this->proteger($auteurId.'%').' OR '.
266
							            'prenom LIKE '.$this->proteger($auteurId.'%').' OR '.
258
							            'dob.nom_utilisateur LIKE '.$this->proteger($auteurId.'%').' OR '.
267
							            'dob.nom_utilisateur LIKE '.$this->proteger($auteurId.'%').' OR '.
259
							            'dob.prenom_utilisateur LIKE '.$this->proteger($auteurId.'%').')'.
268
							            'dob.prenom_utilisateur LIKE '.$this->proteger($auteurId.'%').')'.
260
							            ')';
269
							            ')';
261
				}
270
				}
262
			} else {
271
			} else {
263
				$masque = " ( courriel LIKE ".$this->proteger($valeurMasque.'%').
272
				$masque = " ( courriel LIKE ".$this->proteger($valeurMasque.'%').
264
				" OR dob.courriel_utilisateur LIKE ".$this->proteger($valeurMasque.'%').")  ";
273
				" OR dob.courriel_utilisateur LIKE ".$this->proteger($valeurMasque.'%').")  ";
265
			}
274
			}
266
		}
275
		}
267
		return $masque;
276
		return $masque;
268
	}
277
	}
269
	
278
	
270
	
279
	
271
	/**
280
	/**
272
	 * Obtenir une chaine de caractère concaténant nom et prénom séparé par une virgule
281
	 * Obtenir une chaine de caractère concaténant nom et prénom séparé par une virgule
273
	 * @param String $auteurId l'identifiant de l'auteur
282
	 * @param String $auteurId l'identifiant de l'auteur
274
	 * @return String la chaine de concaténation
283
	 * @return String la chaine de concaténation
275
	 * */
284
	 * */
276
	private function getChaineNomPrenom($auteurId) {
285
	private function getChaineNomPrenom($auteurId) {
277
		$nomPrenom = explode(' ', $auteurId);
286
		$nomPrenom = explode(' ', $auteurId);
278
		$nomPrenom = $this->proteger($nomPrenom);
287
		$nomPrenom = $this->proteger($nomPrenom);
279
		$chaineNomPrenom = implode(', ', $nomPrenom);
288
		$chaineNomPrenom = implode(', ', $nomPrenom);
280
		return $chaineNomPrenom;
289
		return $chaineNomPrenom;
281
	}
290
	}
282
	
291
	
283
	/**
292
	/**
284
	 * Créer le filtre de recherche par zone géographique en fonction du masque
293
	 * Créer le filtre de recherche par zone géographique en fonction du masque
285
	 * @param $valeurMasque le terme de la recherche
294
	 * @param $valeurMasque le terme de la recherche
286
	 * */
295
	 * */
287
	private function creerFiltreIdZoneGeo($valeurMasque) {
296
	private function creerFiltreIdZoneGeo($valeurMasque) {
288
		$masque = '';
297
		$masque = '';
289
		$dept = $valeurMasque;
298
		$dept = $valeurMasque;
290
		if (is_numeric($dept)) {
299
		if (is_numeric($dept)) {
291
			$dept = sprintf('%02s', $dept);
300
			$dept = sprintf('%02s', $dept);
292
			$dept = sprintf("%-'_5s", $dept);
301
			$dept = sprintf("%-'_5s", $dept);
293
			$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$dept);
302
			$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$dept);
294
		} else {
303
		} else {
295
			$deptId = $this->conteneur->getParametre($dept);
304
			$deptId = $this->conteneur->getParametre($dept);
296
			if ($deptId != null) {
305
			if ($deptId != null) {
297
				$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$deptId.'%');
306
				$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$deptId.'%');
298
			} else {
307
			} else {
299
				$id = $this->obtenirIdDepartement($valeurMasque);
308
				$id = $this->obtenirIdDepartement($valeurMasque);
300
				$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$id.'%');
309
				$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$id.'%');
301
			}
310
			}
302
		}
311
		}
303
		return $masque;
312
		return $masque;
304
	}
313
	}
305
	
314
	
306
	/**
315
	/**
307
	 * Générer la chaine de recherche pour la date en  fonction du masque
316
	 * Générer la chaine de recherche pour la date en  fonction du masque
308
	 * @param $valeurMasque la date recherchée (AAAA ou JJ/MM/AAAA)
317
	 * @param $valeurMasque la date recherchée (AAAA ou JJ/MM/AAAA)
309
	 * */
318
	 * */
310
	private function creerFiltreDate($valeurMasque) {
319
	private function creerFiltreDate($valeurMasque) {
311
		//TODO: définir dans le fichier de config un tableau contenant plusieurs format de date
320
		//TODO: définir dans le fichier de config un tableau contenant plusieurs format de date
312
		// autorisés pour la recherche, qui seraient ajoutés au OR
321
		// autorisés pour la recherche, qui seraient ajoutés au OR
313
		$masque = '(';
322
		$masque = '(';
314
		$masque .= (is_numeric($valeurMasque)) ? ' YEAR(date_observation) = '.$this->proteger($valeurMasque).' OR ' : '';
323
		$masque .= (is_numeric($valeurMasque)) ? ' YEAR(date_observation) = '.$this->proteger($valeurMasque).' OR ' : '';
315
		$masque .= " DATE_FORMAT(date_observation, '%d/%m/%Y') = ".$this->proteger($valeurMasque).' '.
324
		$masque .= " DATE_FORMAT(date_observation, '%d/%m/%Y') = ".$this->proteger($valeurMasque).' '.
316
				')';
325
				')';
317
		return $masque;
326
		return $masque;
318
	}
327
	}
319
	
328
	
320
	/**
329
	/**
321
	 * Générer la chaine de recherche dans les mots clés en fonction du masque
330
	 * Générer la chaine de recherche dans les mots clés en fonction du masque
322
	 * @param $valeurMasque le mot clé recherché
331
	 * @param $valeurMasque le mot clé recherché
323
	 * */
332
	 * */
324
	private function creerFiltreMotsCles($valeurMasque) {
333
	private function creerFiltreMotsCles($valeurMasque) {
325
	
334
	
326
		$mots_cles = explode(' ', $valeurMasque);
335
		$mots_cles = explode(' ', $valeurMasque);
327
		$requeteMotsClesImg = array();
336
		$requeteMotsClesImg = array();
328
		$requeteMotsClesObs = array();
337
		$requeteMotsClesObs = array();
329
		$requeteMotsClesImgPublic = array();
338
		$requeteMotsClesImgPublic = array();
330
	
339
	
331
		foreach($mots_cles as $mot_cle) {
340
		foreach($mots_cles as $mot_cle) {
332
			//TODO: rechercher sur les mots clés normalisés dans tous les cas ?
341
			//TODO: rechercher sur les mots clés normalisés dans tous les cas ?
333
			$requeteMotsCles = $this->proteger('%'.$mot_cle.'%');
342
			$requeteMotsCles = $this->proteger('%'.$mot_cle.'%');
334
			$motsCleProtege = $this->proteger($this->normaliserMotCle('%'.$mot_cle.'%'));
343
			$motsCleProtege = $this->proteger($this->normaliserMotCle('%'.$mot_cle.'%'));
335
			$requeteMotsClesImgPublic[] = 'di.id_image IN (SELECT ce_image FROM del_image_tag WHERE tag_normalise LIKE '.$motsCleProtege.' AND actif = 1)';
344
			$requeteMotsClesImgPublic[] = 'di.id_image IN (SELECT ce_image FROM del_image_tag WHERE tag_normalise LIKE '.$motsCleProtege.' AND actif = 1)';
336
			$requeteMotsClesImg[] = 'di.mots_cles_texte LIKE '.$requeteMotsCles;
345
			$requeteMotsClesImg[] = 'di.mots_cles_texte LIKE '.$requeteMotsCles;
337
			$requeteMotsClesObs[] = 'dob.mots_cles_texte LIKE '.$requeteMotsCles;
346
			$requeteMotsClesObs[] = 'dob.mots_cles_texte LIKE '.$requeteMotsCles;
338
		}
347
		}
339
	
348
	
340
		$requeteMotsClesImgPublic = implode(' AND ', $requeteMotsClesImgPublic);
349
		$requeteMotsClesImgPublic = implode(' AND ', $requeteMotsClesImgPublic);
341
		$requeteMotsClesImg = implode(' AND ', $requeteMotsClesImg);
350
		$requeteMotsClesImg = implode(' AND ', $requeteMotsClesImg);
342
		$requeteMotsClesObs = implode(' AND ', $requeteMotsClesObs);
351
		$requeteMotsClesObs = implode(' AND ', $requeteMotsClesObs);
343
	
352
	
344
		$masque = '('.
353
		$masque = '('.
345
				'('.$requeteMotsClesImgPublic.') OR '.
354
				'('.$requeteMotsClesImgPublic.') OR '.
346
				'('.$requeteMotsClesImg.') OR '.
355
				'('.$requeteMotsClesImg.') OR '.
347
				'('.$requeteMotsClesObs.') '.
356
				'('.$requeteMotsClesObs.') '.
348
				')';
357
				')';
349
	
358
	
350
		return $masque;
359
		return $masque;
351
	}
360
	}
352
	
361
	
353
	// ??
362
	// ??
354
	private function assemblercomptageOccurencesMotsClesCel() {
363
	private function assemblercomptageOccurencesMotsClesCel() {
355
		$chaineMotsClesAffiches = $this->conteneur->getParametre('mots_cles_cel_affiches');
364
		$chaineMotsClesAffiches = $this->conteneur->getParametre('mots_cles_cel_affiches');
356
		$tabMotsClesAffiches = explode(',',$chaineMotsClesAffiches);
365
		$tabMotsClesAffiches = explode(',',$chaineMotsClesAffiches);
357
		$chaineSql = '';
366
		$chaineSql = '';
358
	
367
	
359
		// Comptage du nombre de mots clés officiels présents dans la chaine mots clés texte
368
		// Comptage du nombre de mots clés officiels présents dans la chaine mots clés texte
360
		foreach ($tabMotsClesAffiches as $motCle) {
369
		foreach ($tabMotsClesAffiches as $motCle) {
361
			if($chaineSql != '') {
370
			if($chaineSql != '') {
362
				$chaineSql .= ' + ';
371
				$chaineSql .= ' + ';
363
			}
372
			}
364
			$chaineSql .= 'IF(FIND_IN_SET('.$this->proteger($motCle).',di.mots_cles_texte) != 0, 1, 0)';
373
			$chaineSql .= 'IF(FIND_IN_SET('.$this->proteger($motCle).',di.mots_cles_texte) != 0, 1, 0)';
365
		}
374
		}
366
	
375
	
367
		return '('.$chaineSql.')';
376
		return '('.$chaineSql.')';
368
	}
377
	}
369
	
378
	
370
	private function getTri() {
379
	private function getTri() {
371
		$order = '';
380
		$order = '';
372
		if($this->doitJoindreTableVotes()) {
381
		if($this->doitJoindreTableVotes()) {
373
			$order = ' GROUP BY dvote.ce_image, dob.id_observation ORDER BY total_votes '.$this->directionTri.', date_transmission desc ';
382
			$order = ' GROUP BY dvote.ce_image, dob.id_observation ORDER BY total_votes '.$this->directionTri.', date_transmission desc ';
374
		} else if($this->doitJoindreTableTags()) {
383
		} else if($this->doitJoindreTableTags()) {
375
			$order = ' GROUP BY doi.id_image ORDER BY total_tags '.$this->directionTri.', date_transmission desc ';
384
			$order = ' GROUP BY doi.id_image ORDER BY total_tags '.$this->directionTri.', date_transmission desc ';
376
		} else {
385
		} else {
377
			$order = ' ORDER BY '.$this->tri.' '.$this->directionTri.' ';
386
			$order = ' ORDER BY '.$this->tri.' '.$this->directionTri.' ';
378
		}
387
		}
379
		return $order;
388
		return $order;
380
	}
389
	}
381
	
390
	
382
	/**
391
	/**
383
	 * Compter le nombre total d'images dans la base pour affichage dans entete.
392
	 * Compter le nombre total d'images dans la base pour affichage dans entete.
384
	 * */
393
	 * */
385
	private function getFoundRows() {
394
	private function getFoundRows() {
386
		$requete = 'SELECT FOUND_ROWS() AS nbre ';
395
		$requete = 'SELECT FOUND_ROWS() AS nbre ';
387
		$resultats = $this->bdd->recuperer($requete);
396
		$resultats = $this->bdd->recuperer($requete);
388
		return (int) $resultats['nbre'];
397
		return (int) $resultats['nbre'];
389
	}
398
	}
390
	
399
	
391
	
400
	
392
	/**
401
	/**
393
	 * En fonction des paramètres, générer les conditions de recherche 
402
	 * En fonction des paramètres, générer les conditions de recherche 
394
	 * des observations
403
	 * des observations
395
	 * */
404
	 * */
396
	private function getConditionsObs() {
405
	private function getConditionsObs() {
397
		$conditionsObs = array();
406
		$conditionsObs = array();
398
		$masques = $this->masque->getMasque();
407
		$masques = $this->masque->getMasque();
399
		if (isset($masques['masque'])) {
408
		if (isset($masques['masque'])) {
400
			$passe = $masques['masque'];
409
			$passe = $masques['masque'];
401
				
410
				
402
			// Si on a saisi le masque passe partout, alors on doit chercher dans tous les champs
411
			// Si on a saisi le masque passe partout, alors on doit chercher dans tous les champs
403
			// de la table observation (OR)
412
			// de la table observation (OR)
404
			$conditionLibre = array();
413
			$conditionLibre = array();
405
		
414
		
406
			if (!isset($masques['masque.ns'])) {
415
			if (!isset($masques['masque.ns'])) {
407
				$conditionsLibre[] = "nom_sel LIKE '$passe%'";
416
				$conditionsLibre[] = "nom_sel LIKE '$passe%'";
408
			}
417
			}
409
		
418
		
410
			if (!isset($masques['masque.famille'])) {
419
			if (!isset($masques['masque.famille'])) {
411
				$conditionsLibre[] = "famille LIKE '$passe%'";
420
				$conditionsLibre[] = "famille LIKE '$passe%'";
412
			}
421
			}
413
		
422
		
414
			if (!isset($masques['masque.milieu'])) {
423
			if (!isset($masques['masque.milieu'])) {
415
				$conditionsLibre[] = "nom_sel LIKE '$passe%'";
424
				$conditionsLibre[] = "nom_sel LIKE '$passe%'";
416
			}
425
			}
417
		
426
		
418
			if (!isset($masques['masque.date'])) {
427
			if (!isset($masques['masque.date'])) {
419
				$conditionsLibre[] = $this->creerFiltreDate($passe);
428
				$conditionsLibre[] = $this->creerFiltreDate($passe);
420
			}
429
			}
421
		
430
		
422
			if (!isset($masques['masque.auteur'])) {
431
			if (!isset($masques['masque.auteur'])) {
423
				$conditionsLibre[] = $this->creerFiltreAuteur($passe);
432
				$conditionsLibre[] = $this->creerFiltreAuteur($passe);
424
			}
433
			}
425
		
434
		
426
			/*
435
			/*
427
			 * FIXME : remplacer par motcle projet !
436
			 * FIXME : remplacer par motcle projet !
428
			* if (!isset($masques['masque.tag'])) {
437
			* if (!isset($masques['masque.tag'])) {
429
			$conditionsLibre[] = "mots_cles_texte LIKE '%$passe%'";
438
			$conditionsLibre[] = "mots_cles_texte LIKE '%$passe%'";
430
			}*/
439
			}*/
431
				
440
				
432
			$conditionsObs[] = implode(' OR ', $conditionsLibre);
441
			$conditionsObs[] = implode(' OR ', $conditionsLibre);
433
		}
442
		}
434
 
443
 
435
		// referentiel
444
		// referentiel
436
		if (isset($masques['masque.referentiel'])) {
445
		if (isset($masques['masque.referentiel'])) {
437
			$ref = $masques['masque.referentiel'];
446
			$ref = $masques['masque.referentiel'];
438
			$conditionsObs[] = "dob.nom_referentiel LIKE '$ref%'";
447
			$conditionsObs[] = "dob.nom_referentiel LIKE '$ref%'";
439
		}
448
		}
440
		
449
		
441
		// nom sel
450
		// nom sel
442
		if (isset($masques['masque.ns'])) {
451
		if (isset($masques['masque.ns'])) {
443
			$nom_sel = $masques['masque.ns'];
452
			$nom_sel = $masques['masque.ns'];
444
			$conditionsObs[] = "nom_sel LIKE '$nom_sel%'";
453
			$conditionsObs[] = "nom_sel LIKE '$nom_sel%'";
445
		}
454
		}
446
		
455
		
447
		// nom sel
456
		// num nom
448
		if (isset($masques['masque.nn'])) {
457
		if (isset($masques['masque.nn'])) {
-
 
458
			$num_noms = $masques['masque.nn'];
-
 
459
			$num_noms = explode(',', $num_noms);
-
 
460
			$num_noms = array_map('intval', $num_noms);
-
 
461
			$num_noms = array_filter($num_noms);
449
			$num_nom = $masques['masque.nn'];
462
			$num_noms = implode(',', $num_noms);
-
 
463
			$conditionsObs[] = "(nom_sel_nn IN ($num_noms) OR nom_ret_nn IN ($num_noms)) ";
-
 
464
		}
-
 
465
		
-
 
466
		// num taxon
-
 
467
		if (isset($masques['masque.nt'])) {
-
 
468
			$num_taxon = $masques['masque.nt'];
450
			$conditionsObs[] = "(nom_sel_nn = '$num_nom' OR nom_ret_nn = '$num_nom') ";
469
			$conditionsObs[] = 'nt = '.intval($num_taxon);
451
		}
470
		}
452
		
471
		
453
		// famille
472
		// famille
454
		if (isset($masques['masque.famille'])) {
473
		if (isset($masques['masque.famille'])) {
455
			$famille = $masques['masque.famille'];
474
			$famille = $masques['masque.famille'];
456
			$conditionsObs[] = "famille LIKE '$famille%'";
475
			$conditionsObs[] = "famille LIKE '$famille%'";
457
		}
476
		}
458
		
477
		
459
		// genre
478
		// genre
460
		if (isset($masques['masque.genre'])) {
479
		if (isset($masques['masque.genre'])) {
461
			$genre = $masques['masque.genre'];
480
			$genre = $masques['masque.genre'];
462
			$conditionsObs[] = "nom_sel LIKE '$genre%'";
481
			$conditionsObs[] = "nom_sel LIKE '$genre%'";
463
		}
482
		}
464
			
483
			
465
		// milieu
484
		// milieu
466
		if (isset($masques['masque.milieu'])) {
485
		if (isset($masques['masque.milieu'])) {
467
			$milieu = $masques['masque.milieu'];
486
			$milieu = $masques['masque.milieu'];
468
			$conditionsObs[] = "nom_sel LIKE '$milieu%'";
487
			$conditionsObs[] = "nom_sel LIKE '$milieu%'";
469
		}
488
		}
470
		
489
		
471
		// date
490
		// date
472
		if (isset($masques['masque.date'])) {
491
		if (isset($masques['masque.date'])) {
473
			$date = $masques['masque.date'];
492
			$date = $masques['masque.date'];
474
			$conditionsObs[] = $this->creerFiltreDate($date);
493
			$conditionsObs[] = $this->creerFiltreDate($date);
475
		}
494
		}
476
		
495
		
477
		// utilisateur
496
		// utilisateur
478
		if (isset($masques['masque.auteur'])) {
497
		if (isset($masques['masque.auteur'])) {
479
			$auteur = $masques['masque.auteur'];
498
			$auteur = $masques['masque.auteur'];
480
			$conditionsObs[] = $this->creerFiltreAuteur($auteur);
499
			$conditionsObs[] = $this->creerFiltreAuteur($auteur);
481
		}
500
		}
482
		
501
		
483
		// commune
502
		// commune
484
		if (isset($masques['masque.commune'])) {
503
		if (isset($masques['masque.commune'])) {
485
			$commune = $masques['masque.commune'];
504
			$commune = $masques['masque.commune'];
486
			$conditionsObs[] = " zone_geo LIKE ".$this->proteger(str_replace(array('-',' '), '_', $commune).'%');
505
			$conditionsObs[] = " zone_geo LIKE ".$this->proteger(str_replace(array('-',' '), '_', $commune).'%');
487
		}
506
		}
488
		
507
		
489
		// commune
508
		// commune
490
		if (isset($masques['masque.departement'])) {
509
		if (isset($masques['masque.departement'])) {
491
			$dept = $masques['masque.departement'];
510
			$dept = $masques['masque.departement'];
492
			$conditionsObs[] = $this->creerFiltreIdZoneGeo($dept);
511
			$conditionsObs[] = $this->creerFiltreIdZoneGeo($dept);
493
		}
512
		}
494
 
513
 
495
		return $conditionsObs;
514
		return $conditionsObs;
496
	}
515
	}
497
	
516
	
498
	/**
517
	/**
499
	 * Obtenir le tableu de chaines de condition de requete images en fonction des masques
518
	 * Obtenir le tableu de chaines de condition de requete images en fonction des masques
500
	 * */
519
	 * */
501
	private function getConditionsImages() {
520
	private function getConditionsImages() {
502
		$conditionsImg = array();
521
		$conditionsImg = array();
503
		$masques = $this->masque->getMasque();
522
		$masques = $this->masque->getMasque();
504
		if (isset($masques['masque.tag'])) {
523
		if (isset($masques['masque.tag'])) {
505
			$tag = $masques['masque.tag'];
524
			$tag = $masques['masque.tag'];
506
			$conditionsImg[] = " dit.tag_normalise LIKE '$tag%' ";
525
			$conditionsImg[] = " dit.tag_normalise LIKE '$tag%' ";
507
			$conditionsImg[] = " di.mots_cles_texte LIKE '%$tag%' ";
526
			$conditionsImg[] = " di.mots_cles_texte LIKE '%$tag%' ";
508
		}
527
		}
509
		
528
		
510
		return $conditionsImg;
529
		return $conditionsImg;
511
	}
530
	}
512
	
531
	
513
	
532
	
514
	/*-------------------------------------------------------------------------------
533
	/*-------------------------------------------------------------------------------
515
	 CHARGEMENT DES IMAGES
534
	 CHARGEMENT DES IMAGES
516
	--------------------------------------------------------------------------------*/
535
	--------------------------------------------------------------------------------*/
517
	/**
536
	/**
518
	 * Chargement depuis la bdd de toutes les liaisons entre images et observations
537
	 * Chargement depuis la bdd de toutes les liaisons entre images et observations
519
	 * Méthode appelée uniquement lorsque les paramètres sont vides
538
	 * Méthode appelée uniquement lorsque les paramètres sont vides
520
	 * */
539
	 * */
521
	private function chargerLiaisonsSimple() {
540
	private function chargerLiaisonsSimple() {
522
	
541
	
523
		// On récupère d'abord les N images de del_obs_image, éventuellement triées, 
542
		// On récupère d'abord les N images de del_obs_image, éventuellement triées, 
524
		// Et on complète avec les informations des observations associées
543
		// Et on complète avec les informations des observations associées
525
		$requeteImages = ' SELECT *, di.mots_cles_texte as mots_cles_texte_image '.
544
		$requeteImages = ' SELECT *, di.mots_cles_texte as mots_cles_texte_image '.
526
						 ' FROM del_obs_image doi '.
545
						 ' FROM del_obs_image doi '.
527
						 ' INNER JOIN del_image di ON doi.id_image = di.id_image ';
546
						 ' INNER JOIN del_image di ON doi.id_image = di.id_image ';
528
 
547
 
529
		// Si le tri se fait par date d'observation, on récupère les identifiants de N observations triées
548
		// Si le tri se fait par date d'observation, on récupère les identifiants de N observations triées
530
		if (isset($this->parametres['tri']) && $this->parametres['tri'] == 'date_observation') {
549
		if (isset($this->parametres['tri']) && $this->parametres['tri'] == 'date_observation') {
531
			
550
			
532
			$ordre = isset($this->parametres['ordre']) ? $this->parametres['ordre'] : 'DESC';
551
			$ordre = isset($this->parametres['ordre']) ? $this->parametres['ordre'] : 'DESC';
533
	
552
	
534
			$requeteIdObs = ' SELECT doi.id_image  as id_image '.
553
			$requeteIdObs = ' SELECT doi.id_image  as id_image '.
535
							' FROM del_obs_image doi '.
554
							' FROM del_obs_image doi '.
536
							' INNER JOIN del_observation dob ON dob.id_observation = doi.id_observation '.
555
							' INNER JOIN del_observation dob ON dob.id_observation = doi.id_observation '.
537
							' INNER JOIN del_image di ON doi.id_image = di.id_image '.
556
							' INNER JOIN del_image di ON doi.id_image = di.id_image '.
538
							' ORDER BY date_observation '.$ordre.', dob.id_observation '.$ordre;
557
							' ORDER BY date_observation '.$ordre.', dob.id_observation '.$ordre;
539
			$requeteIdObs .= $this->gestionBdd->getLimitSql();
558
			$requeteIdObs .= $this->gestionBdd->getLimitSql();
540
			
559
			
541
			// Récupérer les N observations triées par date
560
			// Récupérer les N observations triées par date
542
			$observations = $this->bdd->recupererTous($requeteIdObs . ' -- ' . __FILE__ . ':' . __LINE__);
561
			$observations = $this->bdd->recupererTous($requeteIdObs . ' -- ' . __FILE__ . ':' . __LINE__);
543
			
562
			
544
			$idsImages = array();
563
			$idsImages = array();
545
			foreach ($observations as $observation) {
564
			foreach ($observations as $observation) {
546
				$idsImages[] = $observation['id_image'];
565
				$idsImages[] = $observation['id_image'];
547
			}
566
			}
548
			
567
			
549
			$chaineIdImages = implode(',', $idsImages);
568
			$chaineIdImages = implode(',', $idsImages);
550
			$requeteImages .= ' WHERE doi.id_image IN ('.$chaineIdImages.') '.
569
			$requeteImages .= ' WHERE doi.id_image IN ('.$chaineIdImages.') '.
551
							  ' GROUP BY doi.id_image, doi.id_observation '.
570
							  ' GROUP BY doi.id_image, doi.id_observation '.
552
							  ' ORDER BY FIELD(doi.id_image,  '.$chaineIdImages.')'.
571
							  ' ORDER BY FIELD(doi.id_image,  '.$chaineIdImages.')'.
553
							  ' LIMIT '.$this->navigation->getLimite(); // On limite sur le nombre car les obs peuvent avoir plusieurs images
572
							  ' LIMIT '.$this->navigation->getLimite(); // On limite sur le nombre car les obs peuvent avoir plusieurs images
554
			
573
			
555
		} else {
574
		} else {
556
			$requeteImages .= ' GROUP BY doi.id_image, doi.id_observation ';
575
			$requeteImages .= ' GROUP BY doi.id_image, doi.id_observation ';
557
			$requeteImages .= ' ORDER BY doi.id_observation DESC';
576
			$requeteImages .= ' ORDER BY doi.id_observation DESC';
558
			$requeteImages .= $this->gestionBdd->getLimitSql();
577
			$requeteImages .= $this->gestionBdd->getLimitSql();
559
		}
578
		}
560
	
579
	
561
		$liaisons = $this->bdd->recupererTous($requeteImages . ' -- ' . __FILE__ . ':' . __LINE__);
580
		$liaisons = $this->bdd->recupererTous($requeteImages . ' -- ' . __FILE__ . ':' . __LINE__);
562
			
581
			
563
		// Ce n'est pas la peine de continuer s'il n'y a pas eu de résultats dans la table del_obs_images
582
		// Ce n'est pas la peine de continuer s'il n'y a pas eu de résultats dans la table del_obs_images
564
		if (!empty($liaisons)) {
583
		if (!empty($liaisons)) {
565
			
584
			
566
			$idsObservations = array();
585
			$idsObservations = array();
567
			foreach ($liaisons as $image) {
586
			foreach ($liaisons as $image) {
568
				$idObs = $image['id_observation'];
587
				$idObs = $image['id_observation'];
569
				$idsObservations[$idObs] = $idObs;
588
				$idsObservations[$idObs] = $idObs;
570
			}
589
			}
571
			
590
			
572
			$chaineIdObs = implode(',', $idsObservations);
591
			$chaineIdObs = implode(',', $idsObservations);
573
			
592
			
574
			
593
			
575
			// On récupère les observations qui complètent la requête précédente
594
			// On récupère les observations qui complètent la requête précédente
576
			$requeteObservations = ' SELECT * '.
595
			$requeteObservations = ' SELECT * '.
577
								   ' FROM del_observation dob '.
596
								   ' FROM del_observation dob '.
578
								   ' LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur '.
597
								   ' LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur '.
579
								   ' WHERE id_observation IN ('.$chaineIdObs.')';
598
								   ' WHERE id_observation IN ('.$chaineIdObs.')';
580
								   		
599
								   		
581
			$resultatsObservations = $this->bdd->recupererTous($requeteObservations . ' -- ' . __FILE__ . ':' . __LINE__);
600
			$resultatsObservations = $this->bdd->recupererTous($requeteObservations . ' -- ' . __FILE__ . ':' . __LINE__);
582
		
601
		
583
			// FIXME : Ca ne doit pas arriver, mais que se passe-t-il s'il n'y a pas d'observation pour l'image ?! 
602
			// FIXME : Ca ne doit pas arriver, mais que se passe-t-il s'il n'y a pas d'observation pour l'image ?! 
584
			
603
			
585
			// On range les observations dans un tableau pour pouvoir les retrouver par leur id :
604
			// On range les observations dans un tableau pour pouvoir les retrouver par leur id :
586
			$observations = array();
605
			$observations = array();
587
			foreach ($resultatsObservations as $id => $observation) {
606
			foreach ($resultatsObservations as $id => $observation) {
588
				$idObs = $observation['id_observation'];
607
				$idObs = $observation['id_observation'];
589
				$observations[$idObs] = $observation;
608
				$observations[$idObs] = $observation;
590
			}
609
			}
591
		
610
		
592
			// Enfin, pour chaque image préalablement récupérées, on complète avec les informations de l'observation
611
			// Enfin, pour chaque image préalablement récupérées, on complète avec les informations de l'observation
593
			// FIXME : peut-être peut-on utiliser un array_merge ici ? 
612
			// FIXME : peut-être peut-on utiliser un array_merge ici ? 
594
			foreach ($liaisons as $id => $liaison) {
613
			foreach ($liaisons as $id => $liaison) {
595
				$idObs = $liaison['id_observation'];
614
				$idObs = $liaison['id_observation'];
596
		
615
		
597
				$observation = $observations[$idObs];
616
				$observation = $observations[$idObs];
598
				foreach ($observation as $cle => $valeur) {
617
				foreach ($observation as $cle => $valeur) {
599
					$liaisons[$id][$cle] = $valeur;
618
					$liaisons[$id][$cle] = $valeur;
600
				}
619
				}
601
			}
620
			}
602
			
621
			
603
			
622
			
604
			// On compte à part les images issues de la jointure de del_obs_image et del_image car la fonction
623
			// On compte à part les images issues de la jointure de del_obs_image et del_image car la fonction
605
			// SQL_CALC_FOUND_ROWS dans la fonction requete image fait passer le temps d'éxécution de 0.0011 à 15s !
624
			// SQL_CALC_FOUND_ROWS dans la fonction requete image fait passer le temps d'éxécution de 0.0011 à 15s !
606
			$requeteNbImages = 'SELECT SUM(t.nb) as nb FROM (SELECT count(DISTINCT doi.id_image) as nb '.
625
			$requeteNbImages = 'SELECT SUM(t.nb) as nb FROM (SELECT count(DISTINCT doi.id_image) as nb '.
607
							   'FROM del_obs_image doi '.
626
							   'FROM del_obs_image doi '.
608
							   'INNER JOIN del_image di '.
627
							   'INNER JOIN del_image di '.
609
							   'ON di.id_image = doi.id_image '.
628
							   'ON di.id_image = doi.id_image '.
610
							   'GROUP BY doi.id_image, doi.id_observation) t ';
629
							   'GROUP BY doi.id_image, doi.id_observation) t ';
611
			$resultatNbImages = $this->bdd->recupererTous($requeteNbImages . ' -- ' . __FILE__ . ':' . __LINE__);
630
			$resultatNbImages = $this->bdd->recupererTous($requeteNbImages . ' -- ' . __FILE__ . ':' . __LINE__);
612
 
631
 
613
			$total = (int) $resultatNbImages[0]['nb'];
632
			$total = (int) $resultatNbImages[0]['nb'];
614
			$this->navigation->setTotal($total);
633
			$this->navigation->setTotal($total);
615
		}
634
		}
616
 
635
 
617
		return $liaisons;
636
		return $liaisons;
618
	}
637
	}
619
 
638
 
620
	/**
639
	/**
621
	 * Charge les liaisons pour une seule image dont l'id est spécifié dans l'URL
640
	 * Charge les liaisons pour une seule image dont l'id est spécifié dans l'URL
622
	 * Copie de chargerLiaisonsObs avec critère sur l'id_image uniquement
641
	 * Copie de chargerLiaisonsObs avec critère sur l'id_image uniquement
623
	 * Supporte seulement le masque sur referentiel
642
	 * Supporte seulement le masque sur referentiel
624
	 */
643
	 */
625
	private function chargerLiaisonsParId() {
644
	private function chargerLiaisonsParId() {
626
 
645
 
627
		$idImage = $this->ressources[0];
646
		$idImage = $this->ressources[0];
628
 
647
 
629
		// Récupérer les liaisons
648
		// Récupérer les liaisons
630
		$requeteObs = ' SELECT SQL_CALC_FOUND_ROWS dob.id_observation as id_observation, dob.nom_referentiel, nom_sel, nom_sel_nn, nt, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, '.
649
		$requeteObs = ' SELECT SQL_CALC_FOUND_ROWS dob.id_observation as id_observation, dob.nom_referentiel, nom_sel, nom_sel_nn, nt, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, '.
631
				' date_observation, dob.mots_cles_texte as mots_cles_texte, dob.commentaire as commentaire, di.mots_cles_texte as mots_cles_texte_image , date_transmission, '.
650
				' date_observation, dob.mots_cles_texte as mots_cles_texte, dob.commentaire as commentaire, di.mots_cles_texte as mots_cles_texte_image , date_transmission, '.
632
				' doi.id_image as id_image, di.ce_utilisateur as ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, nom_original '.
651
				' doi.id_image as id_image, di.ce_utilisateur as ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, nom_original '.
633
				'FROM del_observation dob '.
652
				'FROM del_observation dob '.
634
				' INNER JOIN del_obs_image doi ON dob.id_observation = doi.id_observation '.
653
				' INNER JOIN del_obs_image doi ON dob.id_observation = doi.id_observation '.
635
				' INNER JOIN del_image di ON doi.id_image = di.id_image '.
654
				' INNER JOIN del_image di ON doi.id_image = di.id_image '.
636
				' LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur '.
655
				' LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur '.
637
				' WHERE doi.id_image = '.intval($idImage);
656
				' WHERE doi.id_image = '.intval($idImage);
638
 
657
 
639
		if (isset($this->parametres['masque.referentiel'])) {
658
		if (isset($this->parametres['masque.referentiel'])) {
640
			$requeteObs .= " AND dob.nom_referentiel LIKE '" . $this->parametres['masque.referentiel'] . "%'";
659
			$requeteObs .= " AND dob.nom_referentiel LIKE '" . $this->parametres['masque.referentiel'] . "%'";
641
		}
660
		}
642
 
661
 
643
		$observations = $this->bdd->recupererTous($requeteObs . ' -- ' . __FILE__ . ':' . __LINE__);
662
		$observations = $this->bdd->recupererTous($requeteObs . ' -- ' . __FILE__ . ':' . __LINE__);
644
 
663
 
645
		$total = $this->getFoundRows();
664
		$total = $this->getFoundRows();
646
		$this->navigation->setTotal($total);
665
		$this->navigation->setTotal($total);
647
 
666
 
648
		return $observations;
667
		return $observations;
649
	}
668
	}
650
 
669
 
651
	/**
670
	/**
652
	 * Chargement depuis la bdd de toutes les liaisons entre images et observations
671
	 * Chargement depuis la bdd de toutes les liaisons entre images et observations
653
	 * Méthode appelée uniquement lorsque les paramètres concernent une observation
672
	 * Méthode appelée uniquement lorsque les paramètres concernent une observation
654
	 * */
673
	 * */
655
	private function chargerLiaisonsObs() {
674
	private function chargerLiaisonsObs() {
656
	
675
	
657
		// Récupérer les liaisons
676
		// Récupérer les liaisons
658
		$requeteObs = ' SELECT SQL_CALC_FOUND_ROWS dob.id_observation as id_observation, dob.nom_referentiel, nom_sel, nom_sel_nn, nt, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, '.
677
		$requeteObs = ' SELECT SQL_CALC_FOUND_ROWS dob.id_observation as id_observation, dob.nom_referentiel, nom_sel, nom_sel_nn, nt, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, '.
659
				 	  ' date_observation, dob.mots_cles_texte as mots_cles_texte, dob.commentaire as commentaire, di.mots_cles_texte as mots_cles_texte_image , date_transmission, '.
678
				 	  ' date_observation, dob.mots_cles_texte as mots_cles_texte, dob.commentaire as commentaire, di.mots_cles_texte as mots_cles_texte_image , date_transmission, '.
660
					  ' doi.id_image as id_image, di.ce_utilisateur as ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, nom_original '.
679
					  ' doi.id_image as id_image, di.ce_utilisateur as ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, nom_original '.
661
					  'FROM del_observation dob '.
680
					  'FROM del_observation dob '.
662
					  ' INNER JOIN del_obs_image doi ON dob.id_observation = doi.id_observation '.
681
					  ' INNER JOIN del_obs_image doi ON dob.id_observation = doi.id_observation '.
663
					  ' INNER JOIN del_image di ON doi.id_image = di.id_image '.
682
					  ' INNER JOIN del_image di ON doi.id_image = di.id_image '.
664
					  ' LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur ';
683
					  ' LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur ';
665
	
684
	
666
		// Récupérer les conditions sous forme de tableau
685
		// Récupérer les conditions sous forme de tableau
667
		$conditionsObs = $this->getConditionsObs();
686
		$conditionsObs = $this->getConditionsObs();
668
		
687
		
669
		if (!empty($conditionsObs)) {
688
		if (!empty($conditionsObs)) {
670
			$where = ' WHERE '.implode(' AND ', $conditionsObs);
689
			$where = ' WHERE '.implode(' AND ', $conditionsObs);
671
			$requeteObs .= $where;
690
			$requeteObs .= $where;
672
		}
691
		}
673
	
692
	
674
		// Gérer le tri (uniquement si c'est date_observation)
693
		// Gérer le tri (uniquement si c'est date_observation)
675
		if (isset($this->parametres['tri']) && $this->parametres['tri'] == 'date_observation') {
694
		if (isset($this->parametres['tri']) && $this->parametres['tri'] == 'date_observation') {
676
			$ordre = isset($this->parametres['ordre']) ? $this->parametres['ordre'] : 'DESC';
695
			$ordre = isset($this->parametres['ordre']) ? $this->parametres['ordre'] : 'DESC';
677
			$tri = ' ORDER BY '.$this->parametres['tri'].' '.$ordre.', doi.id_observation '.$ordre.' ';
696
			$tri = ' ORDER BY '.$this->parametres['tri'].' '.$ordre.', doi.id_observation '.$ordre.' ';
678
			$requeteObs .= $tri;
697
			$requeteObs .= $tri;
679
		}
698
		}
680
		
699
		
681
		$requeteObs .= $this->gestionBdd->getLimitSql();
700
		$requeteObs .= $this->gestionBdd->getLimitSql();
682
		$observations = $this->bdd->recupererTous($requeteObs . ' -- ' . __FILE__ . ':' . __LINE__);
701
		$observations = $this->bdd->recupererTous($requeteObs . ' -- ' . __FILE__ . ':' . __LINE__);
683
 
702
 
684
		$total = $this->getFoundRows();
703
		$total = $this->getFoundRows();
685
		$this->navigation->setTotal($total);
704
		$this->navigation->setTotal($total);
686
 
705
 
687
		return $observations;
706
		return $observations;
688
	}
707
	}
689
	
708
	
690
	/**
709
	/**
691
	 * Chargement depuis la bdd de toutes les liaisons entre images et observations
710
	 * Chargement depuis la bdd de toutes les liaisons entre images et observations
692
	 * Méthode appelée uniquement lorsque les paramètres concernent les images
711
	 * Méthode appelée uniquement lorsque les paramètres concernent les images
693
	 * */
712
	 * */
694
	private function chargerLiaisonsImages() {
713
	private function chargerLiaisonsImages() {
695
	
714
	
696
		// FIXME : si on faisait une requete à part pour compter, ca irait plus vite
715
		// FIXME : si on faisait une requete à part pour compter, ca irait plus vite
697
		// Récupérer tous les ID d'image en fonction des paramètres de recherche
716
		// Récupérer tous les ID d'image en fonction des paramètres de recherche
698
		$requeteImages = ' SELECT SQL_CALC_FOUND_ROWS '.
717
		$requeteImages = ' SELECT SQL_CALC_FOUND_ROWS '.
699
						 ' doi.id_image as id_image, dob.id_observation as id_observation, dob.nom_referentiel, nom_sel, nom_sel_nn, nt, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, '.
718
						 ' doi.id_image as id_image, dob.id_observation as id_observation, dob.nom_referentiel, nom_sel, nom_sel_nn, nt, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, '.
700
						 ' date_observation, dob.mots_cles_texte as mots_cles_texte, dob.commentaire as commentaire, di.mots_cles_texte as mots_cles_texte_image , date_transmission, '.
719
						 ' date_observation, dob.mots_cles_texte as mots_cles_texte, dob.commentaire as commentaire, di.mots_cles_texte as mots_cles_texte_image , date_transmission, '.
701
						 ' di.ce_utilisateur as ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, nom_original '.
720
						 ' di.ce_utilisateur as ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, nom_original '.
702
						 ' FROM del_obs_image doi '.
721
						 ' FROM del_obs_image doi '.
703
						 ' INNER JOIN del_image di ON doi.id_image = di.id_image '.
722
						 ' INNER JOIN del_image di ON doi.id_image = di.id_image '.
704
						 ' INNER JOIN del_observation dob ON dob.id_observation = doi.id_observation '.
723
						 ' INNER JOIN del_observation dob ON dob.id_observation = doi.id_observation '.
705
						 ' LEFT JOIN del_image_tag dit ON dit.ce_image = di.id_image '.
724
						 ' LEFT JOIN del_image_tag dit ON dit.ce_image = di.id_image '.
706
						 ' LEFT JOIN del_utilisateur du ON du.id_utilisateur = di.ce_utilisateur ';
725
						 ' LEFT JOIN del_utilisateur du ON du.id_utilisateur = di.ce_utilisateur ';
707
 
726
 
708
		$conditionsImg = $this->getConditionsImages();
727
		$conditionsImg = $this->getConditionsImages();
709
	
728
	
710
		if (!empty($conditionsImg)) {
729
		if (!empty($conditionsImg)) {
711
			$where = ' WHERE ('.implode(' OR ', $conditionsImg).') ';
730
			$where = ' WHERE ('.implode(' OR ', $conditionsImg).') ';
712
			$where .= ' AND dit.actif = 1 ';
731
			$where .= ' AND dit.actif = 1 ';
713
			$requeteImages .= $where;
732
			$requeteImages .= $where;
714
		}
733
		}
715
	
734
	
716
		// Gérer le tri, sur les votes ou sur les tags
735
		// Gérer le tri, sur les votes ou sur les tags
717
		if (isset($this->parametres['tri'])) {
736
		if (isset($this->parametres['tri'])) {
718
			
737
			
719
			$chaineTri = '';
738
			$chaineTri = '';
720
			$chaineOrdre = '';
739
			$chaineOrdre = '';
721
			
740
			
722
			if ($this->parametres['tri'] == 'votes') {
741
			if ($this->parametres['tri'] == 'votes') {
723
	
742
	
724
				$protocole = isset($this->parametres['protocole']) ? $this->parametres['protocole'] : 1;
743
				$protocole = isset($this->parametres['protocole']) ? $this->parametres['protocole'] : 1;
725
	
744
	
726
				$requeteVotes = ' SELECT doi.id_image as id_image, IF(divo.ce_protocole = '.$protocole.', AVG(divo.valeur), 0) as total_votes '.
745
				$requeteVotes = ' SELECT doi.id_image as id_image, IF(divo.ce_protocole = '.$protocole.', AVG(divo.valeur), 0) as total_votes '.
727
								' FROM del_obs_image doi '.
746
								' FROM del_obs_image doi '.
728
								' INNER JOIN del_image di ON doi.id_image = di.id_image '.
747
								' INNER JOIN del_image di ON doi.id_image = di.id_image '.
729
								' INNER JOIN del_observation dob ON dob.id_observation = doi.id_observation '.
748
								' INNER JOIN del_observation dob ON dob.id_observation = doi.id_observation '.
730
								' LEFT JOIN del_image_vote divo ON doi.id_image = divo.ce_image '.
749
								' LEFT JOIN del_image_vote divo ON doi.id_image = divo.ce_image '.
731
                                ' AND ce_protocole = '.$protocole.' ';
750
                                ' AND ce_protocole = '.$protocole.' ';
732
	
751
	
733
				// Et si on a cherché par tag ?
752
				// Et si on a cherché par tag ?
734
				if (isset($this->parametres['masque.tag'])) {
753
				if (isset($this->parametres['masque.tag'])) {
735
					$tag = $this->parametres['masque.tag'];
754
					$tag = $this->parametres['masque.tag'];
736
					$requeteVotes .= ' LEFT JOIN del_image_tag dit ON dit.ce_image = di.id_image ';
755
					$requeteVotes .= ' LEFT JOIN del_image_tag dit ON dit.ce_image = di.id_image ';
737
					$requeteVotes .= " WHERE (dit.tag_normalise LIKE '$tag%' OR  di.mots_cles_texte LIKE '%$tag%') AND dit.actif = 1 ";
756
					$requeteVotes .= " WHERE (dit.tag_normalise LIKE '$tag%' OR  di.mots_cles_texte LIKE '%$tag%') AND dit.actif = 1 ";
738
				}
757
				}
739
	
758
	
740
				$requeteVotes .= ' GROUP BY doi.id_image, doi.id_observation '.
759
				$requeteVotes .= ' GROUP BY doi.id_image, doi.id_observation '.
741
								 ' ORDER by total_votes '.$this->directionTri .', doi.id_observation '.$this->directionTri.' '.
760
								 ' ORDER by total_votes '.$this->directionTri .', doi.id_observation '.$this->directionTri.' '.
742
						$this->gestionBdd->getLimitSql();
761
						$this->gestionBdd->getLimitSql();
743
	
762
	
744
 
763
 
745
				$resultatsVotes = $this->bdd->recupererTous($requeteVotes . ' -- ' . __FILE__ . ':' . __LINE__);
764
				$resultatsVotes = $this->bdd->recupererTous($requeteVotes . ' -- ' . __FILE__ . ':' . __LINE__);
746
				$tabVotes = array();
765
				$tabVotes = array();
747
				foreach ($resultatsVotes as $vote) {
766
				foreach ($resultatsVotes as $vote) {
748
					$tabVotes[] = $vote['id_image'];
767
					$tabVotes[] = $vote['id_image'];
749
				}
768
				}
750
	
769
	
751
				$strVotes = empty($tabVotes) ? "''" : implode(',', $tabVotes);
770
				$strVotes = empty($tabVotes) ? "''" : implode(',', $tabVotes);
752
	
771
	
753
				// Et si on a cherché par tag ?
772
				// Et si on a cherché par tag ?
754
				if (isset($this->parametres['masque.tag'])) {
773
				if (isset($this->parametres['masque.tag'])) {
755
					$chaineTri .= ' AND ';
774
					$chaineTri .= ' AND ';
756
				} else {
775
				} else {
757
					$chaineTri .= ' WHERE ';
776
					$chaineTri .= ' WHERE ';
758
				}
777
				}
759
				
778
				
760
				
779
				
761
				$chaineTri .= '  doi.id_image IN ('.$strVotes.') ';
780
				$chaineTri .= '  doi.id_image IN ('.$strVotes.') ';
762
				$chaineOrdre = ' ORDER BY FIELD(doi.id_image, '.$strVotes.')  ';
781
				$chaineOrdre = ' ORDER BY FIELD(doi.id_image, '.$strVotes.')  ';
763
			}
782
			}
764
			
783
			
765
			if ($this->parametres['tri'] == 'tags') {
784
			if ($this->parametres['tri'] == 'tags') {
766
					
785
					
767
				$requetetags = ' SELECT SQL_CALC_FOUND_ROWS doi.id_image, COUNT(id_tag) as total_tags '.
786
				$requetetags = ' SELECT SQL_CALC_FOUND_ROWS doi.id_image, COUNT(id_tag) as total_tags '.
768
						' FROM del_obs_image doi LEFT JOIN del_image_tag dit ON dit.ce_image = doi.id_image AND dit.actif = 1 '.
787
						' FROM del_obs_image doi LEFT JOIN del_image_tag dit ON dit.ce_image = doi.id_image AND dit.actif = 1 '.
769
						 ' INNER JOIN del_image di ON doi.id_image = di.id_image '.
788
						 ' INNER JOIN del_image di ON doi.id_image = di.id_image '.
770
						 ' INNER JOIN del_observation dob ON dob.id_observation = doi.id_observation ';
789
						 ' INNER JOIN del_observation dob ON dob.id_observation = doi.id_observation ';
771
 
790
 
772
				if (isset($this->parametres['masque.tag'])) {
791
				if (isset($this->parametres['masque.tag'])) {
773
					// Et si on a cherché par tag ?
792
					// Et si on a cherché par tag ?
774
					$tag = $this->parametres['masque.tag'];
793
					$tag = $this->parametres['masque.tag'];
775
					$requetetags .= " WHERE (dit.tag_normalise LIKE '$tag%' OR  di.mots_cles_texte LIKE '%$tag%') ";
794
					$requetetags .= " WHERE (dit.tag_normalise LIKE '$tag%' OR  di.mots_cles_texte LIKE '%$tag%') ";
776
				}
795
				}
777
				
796
				
778
				$requetetags .= ' GROUP BY doi.id_image, doi.id_observation '.
797
				$requetetags .= ' GROUP BY doi.id_image, doi.id_observation '.
779
						' ORDER by total_tags '.$this->directionTri.', doi.id_observation '.$this->directionTri.
798
						' ORDER by total_tags '.$this->directionTri.', doi.id_observation '.$this->directionTri.
780
						$this->gestionBdd->getLimitSql();
799
						$this->gestionBdd->getLimitSql();
781
 
800
 
782
				$resultatstags = $this->bdd->recupererTous($requetetags . ' -- ' . __FILE__ . ':' . __LINE__);
801
				$resultatstags = $this->bdd->recupererTous($requetetags . ' -- ' . __FILE__ . ':' . __LINE__);
783
				$tabtags = array();
802
				$tabtags = array();
784
				foreach ($resultatstags as $tag) {
803
				foreach ($resultatstags as $tag) {
785
					$tabtags[] = $tag['id_image'];
804
					$tabtags[] = $tag['id_image'];
786
				}
805
				}
787
				$strtags = empty($tabtags) ? "''" : implode(',', $tabtags);
806
				$strtags = empty($tabtags) ? "''" : implode(',', $tabtags);
788
				
807
				
789
	
808
	
790
				// Et si on a cherché par tag ?
809
				// Et si on a cherché par tag ?
791
				if (isset($this->parametres['masque.tag'])) {
810
				if (isset($this->parametres['masque.tag'])) {
792
					$chaineTri .= ' AND ';
811
					$chaineTri .= ' AND ';
793
				} else {
812
				} else {
794
					$chaineTri .= ' WHERE ';
813
					$chaineTri .= ' WHERE ';
795
				}
814
				}
796
	
815
	
797
				$chaineTri .= ' doi.id_image IN ('.$strtags.') ';
816
				$chaineTri .= ' doi.id_image IN ('.$strtags.') ';
798
				$chaineOrdre = ' ORDER BY FIELD(doi.id_image, '.$strtags.') ';
817
				$chaineOrdre = ' ORDER BY FIELD(doi.id_image, '.$strtags.') ';
799
			}
818
			}
800
						
819
						
801
			$requeteImages .= $chaineTri.' GROUP BY doi.id_image, doi.id_observation '.$chaineOrdre;
820
			$requeteImages .= $chaineTri.' GROUP BY doi.id_image, doi.id_observation '.$chaineOrdre;
802
		} else {
821
		} else {
803
			$requeteImages .= ' GROUP BY doi.id_image, doi.id_observation'; // des fois, on a plusieurs observations pour la même image ...
822
			$requeteImages .= ' GROUP BY doi.id_image, doi.id_observation'; // des fois, on a plusieurs observations pour la même image ...
804
			$requeteImages .= $this->gestionBdd->getLimitSql();
823
			$requeteImages .= $this->gestionBdd->getLimitSql();
805
		}
824
		}
806
 
825
 
807
		$retour  = $this->bdd->recupererTous($requeteImages . ' -- ' . __FILE__ . ':' . __LINE__);
826
		$retour  = $this->bdd->recupererTous($requeteImages . ' -- ' . __FILE__ . ':' . __LINE__);
808
		$total = $this->getFoundRows();
827
		$total = $this->getFoundRows();
809
		$this->navigation->setTotal($total);
828
		$this->navigation->setTotal($total);
810
		
829
		
811
		return $retour;
830
		return $retour;
812
	}
831
	}
813
	
832
	
814
	/**
833
	/**
815
	 * Chargement depuis la bdd de toutes les liaisons entre images et observations
834
	 * Chargement depuis la bdd de toutes les liaisons entre images et observations
816
	 * */
835
	 * */
817
	private function chargerLiaisons() {
836
	private function chargerLiaisons() {
818
	
837
	
819
		$champs = array('dob.id_observation as id_observation', 'nom_sel', 'nom_sel_nn', 'nt', 'famille', 'dob.nom_referentiel', 'ce_zone_geo', 'zone_geo',
838
		$champs = array('dob.id_observation as id_observation', 'nom_sel', 'nom_sel_nn', 'nt', 'famille', 'dob.nom_referentiel', 'ce_zone_geo', 'zone_geo',
820
				'lieudit', 'station', 'milieu', 'date_observation', 'dob.mots_cles_texte as mots_cles_texte', 'dob.commentaire as commentaire',
839
				'lieudit', 'station', 'milieu', 'date_observation', 'dob.mots_cles_texte as mots_cles_texte', 'dob.commentaire as commentaire',
821
				'di.mots_cles_texte as mots_cles_texte_image ', 'date_transmission', 'di.id_image as id_image', 'di.ce_utilisateur as ce_utilisateur',
840
				'di.mots_cles_texte as mots_cles_texte_image ', 'date_transmission', 'di.id_image as id_image', 'di.ce_utilisateur as ce_utilisateur',
822
				'prenom', 'nom', 'courriel', 'dob.prenom_utilisateur', 'dob.nom_utilisateur', 'dob.courriel_utilisateur', 'nom_original');
841
				'prenom', 'nom', 'courriel', 'dob.prenom_utilisateur', 'dob.nom_utilisateur', 'dob.courriel_utilisateur', 'nom_original');
823
		// Attention le LEFT JOIN est indispensable pour ramener les images n'ayant pas de votes
842
		// Attention le LEFT JOIN est indispensable pour ramener les images n'ayant pas de votes
824
		// en cas de tri par votes
843
		// en cas de tri par votes
825
		$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS '.implode(', ',$champs).' '.
844
		$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS '.implode(', ',$champs).' '.
826
				($this->doitJoindreTableVotes() ?
845
				($this->doitJoindreTableVotes() ?
827
						', IF(dvote.ce_protocole = '.$this->parametres['protocole'].', AVG(dvote.valeur), 0) as total_votes ' :
846
						', IF(dvote.ce_protocole = '.$this->parametres['protocole'].', AVG(dvote.valeur), 0) as total_votes ' :
828
						''
847
						''
829
				).
848
				).
830
				($this->doitJoindreTableTags() ?
849
				($this->doitJoindreTableTags() ?
831
						// attention le DISTINCT est indispensable !
850
						// attention le DISTINCT est indispensable !
832
						', (COUNT(DISTINCT dtag.id_tag) + '.$this->assemblercomptageOccurencesMotsClesCel().') as total_tags ' :
851
						', (COUNT(DISTINCT dtag.id_tag) + '.$this->assemblercomptageOccurencesMotsClesCel().') as total_tags ' :
833
						''
852
						''
834
				).
853
				).
835
				'FROM '.$this->gestionBdd->formaterTable('del_obs_image', 'doi').
854
				'FROM '.$this->gestionBdd->formaterTable('del_obs_image', 'doi').
836
				'INNER JOIN del_image di '.
855
				'INNER JOIN del_image di '.
837
				'ON doi.id_image = di.id_image '.
856
				'ON doi.id_image = di.id_image '.
838
				'INNER JOIN del_observation dob '.
857
				'INNER JOIN del_observation dob '.
839
				'ON doi.id_observation = dob.id_observation '.
858
				'ON doi.id_observation = dob.id_observation '.
840
				'LEFT JOIN del_utilisateur du '.
859
				'LEFT JOIN del_utilisateur du '.
841
				'ON du.id_utilisateur = di.ce_utilisateur '.
860
				'ON du.id_utilisateur = di.ce_utilisateur '.
842
				($this->doitJoindreTableTags() ?
861
				($this->doitJoindreTableTags() ?
843
						'LEFT JOIN del_image_tag dtag '.
862
						'LEFT JOIN del_image_tag dtag '.
844
						'ON doi.id_image = dtag.ce_image AND dtag.actif = 1 ' :
863
						'ON doi.id_image = dtag.ce_image AND dtag.actif = 1 ' :
845
						''
864
						''
846
								).
865
								).
847
								($this->doitJoindreTableVotes() ?
866
								($this->doitJoindreTableVotes() ?
848
								'LEFT JOIN del_image_vote dvote '.
867
								'LEFT JOIN del_image_vote dvote '.
849
								'ON doi.id_image = dvote.ce_image AND dvote.ce_protocole = '.$this->parametres['protocole'] :
868
								'ON doi.id_image = dvote.ce_image AND dvote.ce_protocole = '.$this->parametres['protocole'] :
850
								''
869
								''
851
										);
870
										);
852
				$requeteLiaisons .= $this->chargerClauseWhere();
871
				$requeteLiaisons .= $this->chargerClauseWhere();
853
				$requeteLiaisons .= $this->getTri();
872
				$requeteLiaisons .= $this->getTri();
854
				$requeteLiaisons .= $this->gestionBdd->getLimitSql();
873
				$requeteLiaisons .= $this->gestionBdd->getLimitSql();
855
 
874
 
856
				$retour = $this->bdd->recupererTous($requeteLiaisons . ' -- ' . __FILE__ . ':' . __LINE__);
875
				$retour = $this->bdd->recupererTous($requeteLiaisons . ' -- ' . __FILE__ . ':' . __LINE__);
857
				$total = $this->getFoundRows();
876
				$total = $this->getFoundRows();
858
				$this->navigation->setTotal($total);
877
				$this->navigation->setTotal($total);
859
				return $retour;
878
				return $retour;
860
	}
879
	}
861
	
880
	
862
	
881
	
863
	/**
882
	/**
864
	 * Retourner un tableau d'images formaté en fonction des liaisons trouvées
883
	 * Retourner un tableau d'images formaté en fonction des liaisons trouvées
865
	 * @param $liaisons les liaisons de la table del_obs_images
884
	 * @param $liaisons les liaisons de la table del_obs_images
866
	 * */
885
	 * */
867
	private function chargerImage($liaisons) {
886
	private function chargerImage($liaisons) {
868
	
887
	
869
		$images = array();
888
		$images = array();
870
		foreach ($liaisons as $liaison) {
889
		foreach ($liaisons as $liaison) {
871
			$idImage = $liaison['id_image'];
890
			$idImage = $liaison['id_image'];
872
				
891
				
873
			if($liaison['ce_utilisateur'] == 0) {
892
			if($liaison['ce_utilisateur'] == 0) {
874
				$liaison['prenom'] = $liaison['prenom_utilisateur'];
893
				$liaison['prenom'] = $liaison['prenom_utilisateur'];
875
				$liaison['nom'] = $liaison['nom_utilisateur'];
894
				$liaison['nom'] = $liaison['nom_utilisateur'];
876
			}
895
			}
877
			// On enregistre l'ID de l'image pour n'effectuer qu'une seule requête par la suite
896
			// On enregistre l'ID de l'image pour n'effectuer qu'une seule requête par la suite
878
			$this->imageIds[] = $idImage;
897
			$this->imageIds[] = $idImage;
879
			$index = $liaison['id_image'].'-'.$liaison['id_observation'];
898
			$index = $liaison['id_image'].'-'.$liaison['id_observation'];
880
			$images[$index] = array('id_image' => $idImage, 'binaire.href' => $this->formaterLienImage($idImage),
899
			$images[$index] = array('id_image' => $idImage, 'binaire.href' => $this->formaterLienImage($idImage),
881
					'protocoles_votes' => array(),
900
					'protocoles_votes' => array(),
882
					'mots_cles_texte' => $liaison['mots_cles_texte_image'], 'observation' => $this->formaterObservation($liaison));
901
					'mots_cles_texte' => $liaison['mots_cles_texte_image'], 'observation' => $this->formaterObservation($liaison));
883
		}
902
		}
884
		return $images;
903
		return $images;
885
	}
904
	}
886
	
905
	
887
	/**
906
	/**
888
	 * Charger les votes pour chaque image
907
	 * Charger les votes pour chaque image
889
	 * */
908
	 * */
890
	private function chargerVotes($images) {
909
	private function chargerVotes($images) {
891
		$requeteVotes = 'SELECT v.*, p.* FROM '.
910
		$requeteVotes = 'SELECT v.*, p.* FROM '.
892
				$this->gestionBdd->formaterTable('del_image_vote', 'v').
911
				$this->gestionBdd->formaterTable('del_image_vote', 'v').
893
				' INNER JOIN del_image_protocole p '.
912
				' INNER JOIN del_image_protocole p '.
894
				'ON v.ce_protocole = p.id_protocole '.
913
				'ON v.ce_protocole = p.id_protocole '.
895
				$this->chargerClauseWhereVotes();
914
				$this->chargerClauseWhereVotes();
896
		$resultatsVotes = $this->bdd->recupererTous($requeteVotes . ' -- ' . __FILE__ . ':' . __LINE__);
915
		$resultatsVotes = $this->bdd->recupererTous($requeteVotes . ' -- ' . __FILE__ . ':' . __LINE__);
897
			
916
			
898
			
917
			
899
		//TODO : faire une méthode formater vote
918
		//TODO : faire une méthode formater vote
900
		$votes = $this->formaterVotes($resultatsVotes);
919
		$votes = $this->formaterVotes($resultatsVotes);
901
	
920
	
902
		foreach ($images as $id => $image) {
921
		foreach ($images as $id => $image) {
903
			if (isset($votes[$image['id_image']])) {
922
			if (isset($votes[$image['id_image']])) {
904
				$images[$id]['protocoles_votes'] = $votes[$image['id_image']];
923
				$images[$id]['protocoles_votes'] = $votes[$image['id_image']];
905
			}
924
			}
906
		}
925
		}
907
	
926
	
908
		return $images;
927
		return $images;
909
	}
928
	}
910
	
929
	
911
	private function chargerClauseWhereVotes() {
930
	private function chargerClauseWhereVotes() {
912
		if (sizeof($this->imageIds) > 0) {
931
		if (sizeof($this->imageIds) > 0) {
913
			$chaineImageIds = implode(',', $this->imageIds);
932
			$chaineImageIds = implode(',', $this->imageIds);
914
			$where[] = 'v.ce_image  IN ('.$chaineImageIds.')';
933
			$where[] = 'v.ce_image  IN ('.$chaineImageIds.')';
915
		}
934
		}
916
		if (isset($this->parametres['protocole'])) {
935
		if (isset($this->parametres['protocole'])) {
917
			$where[] = 'v.ce_protocole = '.$this->proteger($this->parametres['protocole']);
936
			$where[] = 'v.ce_protocole = '.$this->proteger($this->parametres['protocole']);
918
		}
937
		}
919
	
938
	
920
		$where = (!empty($where)) ? 'WHERE '.implode(' AND ', $where) : '';
939
		$where = (!empty($where)) ? 'WHERE '.implode(' AND ', $where) : '';
921
		return $where;
940
		return $where;
922
	}
941
	}
923
	
942
	
924
	/**************************************************************************************
943
	/**************************************************************************************
925
	 *		    			FONCTION DE CONFIGURATION ET UTILITAIRES					  *
944
	 *		    			FONCTION DE CONFIGURATION ET UTILITAIRES					  *
926
	***************************************************************************************/
945
	***************************************************************************************/
927
	/**
946
	/**
928
	 * Enregistrer dans les variables de classe les paramètres et ressources
947
	 * Enregistrer dans les variables de classe les paramètres et ressources
929
	 * @param $ressources
948
	 * @param $ressources
930
	 * @param $parametres de recherche 
949
	 * @param $parametres de recherche 
931
	 * */
950
	 * */
932
	private function initialiserRessourcesEtParametres($ressources, $parametres) {
951
	private function initialiserRessourcesEtParametres($ressources, $parametres) {
933
		$this->ressources = $ressources;
952
		$this->ressources = $ressources;
934
		$this->parametres = $parametres;
953
		$this->parametres = $parametres;
935
	}
954
	}
936
	
955
	
937
	/**
956
	/**
938
	 * Configuration du service en fonction du fichier de config config_del.ini
957
	 * Configuration du service en fonction du fichier de config config_del.ini
939
	 * */
958
	 * */
940
	public function configurer() {
959
	public function configurer() {
941
		$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
960
		$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
942
		$this->mappingObservation = $this->conteneur->getParametre('mapping_observation');
961
		$this->mappingObservation = $this->conteneur->getParametre('mapping_observation');
943
		$this->mappingVotes = $this->conteneur->getParametre('mapping_votes');
962
		$this->mappingVotes = $this->conteneur->getParametre('mapping_votes');
944
	}
963
	}
945
	
964
	
946
	/**
965
	/**
947
	 * Vérifier que le service est bien configuré
966
	 * Vérifier que le service est bien configuré
948
	 * */
967
	 * */
949
	public function verifierConfiguration() {
968
	public function verifierConfiguration() {
950
	
969
	
951
		$erreurs = array();
970
		$erreurs = array();
952
		$tableauImages = $this->conteneur->getParametre('images');
971
		$tableauImages = $this->conteneur->getParametre('images');
953
		if (empty($tableauImages)) {
972
		if (empty($tableauImages)) {
954
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [images] ou celui-ci est vide ;';
973
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [images] ou celui-ci est vide ;';
955
		} else {
974
		} else {
956
			if ($this->conteneur->getParametre('url_service') == null) {
975
			if ($this->conteneur->getParametre('url_service') == null) {
957
				$erreurs[] = '- paramètre "url_service" manquant ;';
976
				$erreurs[] = '- paramètre "url_service" manquant ;';
958
			}
977
			}
959
				
978
				
960
			if ($this->conteneur->getParametre('url_images') == null) {
979
			if ($this->conteneur->getParametre('url_images') == null) {
961
				$erreurs[] = '- paramètre "url_images" manquant ;';
980
				$erreurs[] = '- paramètre "url_images" manquant ;';
962
			}
981
			}
963
				
982
				
964
		}
983
		}
965
	
984
	
966
		if (empty($this->mappingObservation)) {
985
		if (empty($this->mappingObservation)) {
967
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_observation] ou celui-ci est vide ;';
986
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_observation] ou celui-ci est vide ;';
968
		} else {
987
		} else {
969
			$champsMappingObs = array('id_observation', 'date_observation', 'date_transmission', 'famille', 'nom_sel', 'nom_sel_nn', 'nt',
988
			$champsMappingObs = array('id_observation', 'date_observation', 'date_transmission', 'famille', 'nom_sel', 'nom_sel_nn', 'nt',
970
					'ce_zone_geo', 'lieudit', 'station', 'milieu', 'ce_utilisateur', 'nom', 'prenom');
989
					'ce_zone_geo', 'lieudit', 'station', 'milieu', 'ce_utilisateur', 'nom', 'prenom');
971
			foreach ($champsMappingObs as $champ) {
990
			foreach ($champsMappingObs as $champ) {
972
				if (!isset($this->mappingObservation[$champ])) {
991
				if (!isset($this->mappingObservation[$champ])) {
973
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour l\'observation est manquant ;';
992
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour l\'observation est manquant ;';
974
				}
993
				}
975
			}
994
			}
976
		}
995
		}
977
	
996
	
978
		if (empty($this->mappingFiltre)) {
997
		if (empty($this->mappingFiltre)) {
979
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_masque] ou celui-ci est vide ;';
998
			$erreurs[] = '- le fichier de configuration ne contient pas le tableau [mapping_masque] ou celui-ci est vide ;';
980
		} else {
999
		} else {
981
			$champsMappingFiltre = array('famille', 'ns', 'nn', 'date', 'tag', 'commune');
1000
			$champsMappingFiltre = array('famille', 'ns', 'nn', 'date', 'tag', 'commune');
982
			foreach ($champsMappingFiltre as $champ) {
1001
			foreach ($champsMappingFiltre as $champ) {
983
				if (!isset($this->mappingFiltre[$champ])) {
1002
				if (!isset($this->mappingFiltre[$champ])) {
984
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour l\'observation est manquant ;';
1003
					$erreurs[] = '- le mapping du champ "'.$champ.'" pour l\'observation est manquant ;';
985
				}
1004
				}
986
			}
1005
			}
987
		}
1006
		}
988
	
1007
	
989
		$tris_possibles = $this->conteneur->getParametre('tris_possibles');
1008
		$tris_possibles = $this->conteneur->getParametre('tris_possibles');
990
		if (empty($tris_possibles)) {
1009
		if (empty($tris_possibles)) {
991
			$erreurs[] = '- le fichier de configuration ne contient pas le parametre tris_possibles ou celui-ci est vide ;';
1010
			$erreurs[] = '- le fichier de configuration ne contient pas le parametre tris_possibles ou celui-ci est vide ;';
992
		}
1011
		}
993
	
1012
	
994
		if (!empty($erreurs)) {
1013
		if (!empty($erreurs)) {
995
			$e = 'Erreur lors de la configuration : '."\n";
1014
			$e = 'Erreur lors de la configuration : '."\n";
996
			$e .= implode("\n", $erreurs);
1015
			$e .= implode("\n", $erreurs);
997
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
1016
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
998
		}
1017
		}
999
	}
1018
	}
1000
	
1019
	
1001
	/** 
1020
	/** 
1002
	 * Verifier que les paramètres de tri sont bien autorisés et qu'ils sont au bon format.
1021
	 * Verifier que les paramètres de tri sont bien autorisés et qu'ils sont au bon format.
1003
	 */
1022
	 */
1004
	private function verifierParametresTri() {
1023
	private function verifierParametresTri() {
1005
	
1024
	
1006
		$erreurs = array();
1025
		$erreurs = array();
1007
		$tris_possibles = $this->conteneur->getParametre('tris_possibles');
1026
		$tris_possibles = $this->conteneur->getParametre('tris_possibles');
1008
		$tris_possibles_tableau = explode(',', $tris_possibles);
1027
		$tris_possibles_tableau = explode(',', $tris_possibles);
1009
		if(isset($this->parametres['tri']) && !in_array($this->parametres['tri'], $tris_possibles_tableau)) {
1028
		if(isset($this->parametres['tri']) && !in_array($this->parametres['tri'], $tris_possibles_tableau)) {
1010
			$erreurs[] = '- le type de tri demandé est incorrect, les valeurs possibles sont '.$tris_possibles.' ;';
1029
			$erreurs[] = '- le type de tri demandé est incorrect, les valeurs possibles sont '.$tris_possibles.' ;';
1011
		}
1030
		}
1012
	
1031
	
1013
		if(isset($this->parametres['tri']) && $this->parametres['tri'] == "votes") {
1032
		if(isset($this->parametres['tri']) && $this->parametres['tri'] == "votes") {
1014
			if(!isset($this->parametres['protocole']) || !is_numeric($this->parametres['protocole'])) {
1033
			if(!isset($this->parametres['protocole']) || !is_numeric($this->parametres['protocole'])) {
1015
				$erreurs[] = '- Le paramètre protocole est obligatoire en cas de tri par vote et doit être un entier ;';
1034
				$erreurs[] = '- Le paramètre protocole est obligatoire en cas de tri par vote et doit être un entier ;';
1016
			}
1035
			}
1017
		}
1036
		}
1018
	
1037
	
1019
		$directions_tri = array('asc', 'desc');
1038
		$directions_tri = array('asc', 'desc');
1020
		if(isset($this->parametres['ordre']) && !in_array($this->parametres['ordre'], $directions_tri)) {
1039
		if(isset($this->parametres['ordre']) && !in_array($this->parametres['ordre'], $directions_tri)) {
1021
			$erreurs[] = '- la direction du tri demandé est incorrecte, les valeurs supportées sont asc ou desc ;';
1040
			$erreurs[] = '- la direction du tri demandé est incorrecte, les valeurs supportées sont asc ou desc ;';
1022
		}
1041
		}
1023
			
1042
			
1024
		if (!empty($erreurs)) {
1043
		if (!empty($erreurs)) {
1025
			$e = 'Erreur lors de l\'analyse des parametres du tri : '."\n";
1044
			$e = 'Erreur lors de l\'analyse des parametres du tri : '."\n";
1026
			$e .= implode("\n", $erreurs);
1045
			$e .= implode("\n", $erreurs);
1027
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
1046
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
1028
		}
1047
		}
1029
	}
1048
	}
1030
	
1049
	
1031
	private function verifierParametreFormatRetour() {
1050
	private function verifierParametreFormatRetour() {
1032
		$erreurs = array();
1051
		$erreurs = array();
1033
		$formats_possibles_str = $this->conteneur->getParametre('formats_possibles');
1052
		$formats_possibles_str = $this->conteneur->getParametre('formats_possibles');
1034
		$formats_possibles = explode(',',$formats_possibles_str);
1053
		$formats_possibles = explode(',',$formats_possibles_str);
1035
 
1054
 
1036
		if(isset($this->parametres['format']) && !in_array($this->parametres['format'], $formats_possibles)) {
1055
		if(isset($this->parametres['format']) && !in_array($this->parametres['format'], $formats_possibles)) {
1037
			$erreurs[] = "- le format d'image demandé n'est pas supporté ; Les format supportés sont : ".$formats_possibles_str;
1056
			$erreurs[] = "- le format d'image demandé n'est pas supporté ; Les format supportés sont : ".$formats_possibles_str;
1038
		}
1057
		}
1039
			
1058
			
1040
		if (!empty($erreurs)) {
1059
		if (!empty($erreurs)) {
1041
			$e = 'Erreur lors de l\'analyse du format de retour demandé : '."\n";
1060
			$e = 'Erreur lors de l\'analyse du format de retour demandé : '."\n";
1042
			$e .= implode("\n", $erreurs);
1061
			$e .= implode("\n", $erreurs);
1043
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
1062
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
1044
		}
1063
		}
1045
	}
1064
	}
1046
	
1065
	
1047
	private function initialiserFormatRetour() {
1066
	private function initialiserFormatRetour() {
1048
		$this->formatRetour = isset($this->parametres['format']) ? $this->parametres['format'] : $this->formatRetour;
1067
		$this->formatRetour = isset($this->parametres['format']) ? $this->parametres['format'] : $this->formatRetour;
1049
	}
1068
	}
1050
 
1069
 
1051
	/**
1070
	/**
1052
	 * Initialiser les variables de tri depuis les paramètres  
1071
	 * Initialiser les variables de tri depuis les paramètres  
1053
	 * */
1072
	 * */
1054
	private function initialiserTri() {
1073
	private function initialiserTri() {
1055
		$this->tri = isset($this->parametres['tri']) ? $this->parametres['tri'] : $this->tri;
1074
		$this->tri = isset($this->parametres['tri']) ? $this->parametres['tri'] : $this->tri;
1056
		$this->directionTri = isset($this->parametres['ordre']) ? $this->parametres['ordre'] : $this->directionTri;
1075
		$this->directionTri = isset($this->parametres['ordre']) ? $this->parametres['ordre'] : $this->directionTri;
1057
	}
1076
	}
1058
	
1077
	
1059
	/** Pour eviter les requêtes trop gourmandes, on supprime les caractères passe-partout
1078
	/** Pour eviter les requêtes trop gourmandes, on supprime les caractères passe-partout
1060
	 * @param les paramètres de l'application
1079
	 * @param les paramètres de l'application
1061
	 * */
1080
	 * */
1062
	public function nettoyerParametres($parametres) {
1081
	public function nettoyerParametres($parametres) {
1063
		$parametresRetour = array();
1082
		$parametresRetour = array();
1064
		foreach ($parametres as $cle => $valeur) {
1083
		foreach ($parametres as $cle => $valeur) {
1065
			$valSansPourcent = trim($valeur, "% ");
1084
			$valSansPourcent = trim($valeur, "% ");
1066
			if ($valSansPourcent != '') {
1085
			if ($valSansPourcent != '') {
1067
				$parametresRetour[$cle] = $valeur;
1086
				$parametresRetour[$cle] = $valeur;
1068
			}
1087
			}
1069
		}
1088
		}
1070
		
1089
		
1071
		return $parametresRetour;
1090
		return $parametresRetour;
1072
	}
1091
	}
1073
	
1092
	
1074
	/**
1093
	/**
1075
	 * Nettoyer les jokers
1094
	 * Nettoyer les jokers
1076
	 * @param la valeur du masque
1095
	 * @param la valeur du masque
1077
	 * */
1096
	 * */
1078
	private function remplacerParJokerCaractere($valeurMasque) {
1097
	private function remplacerParJokerCaractere($valeurMasque) {
1079
		return str_replace(array('-',' '), '_', $valeurMasque);
1098
		return str_replace(array('-',' '), '_', $valeurMasque);
1080
	}
1099
	}
1081
 
1100
 
1082
	//TODO: déplacer les fonctions ci dessus et dessous dans une classe
1101
	//TODO: déplacer les fonctions ci dessus et dessous dans une classe
1083
	// utilitaire
1102
	// utilitaire
1084
	
1103
	
1085
	/**
1104
	/**
1086
	 * Supprimer les accents des chaines de caractères
1105
	 * Supprimer les accents des chaines de caractères
1087
	 * */
1106
	 * */
1088
	function supprimerAccents($str, $charset='utf-8')
1107
	function supprimerAccents($str, $charset='utf-8')
1089
	{
1108
	{
1090
		$str = htmlentities($str, ENT_NOQUOTES, $charset);
1109
		$str = htmlentities($str, ENT_NOQUOTES, $charset);
1091
	
1110
	
1092
		$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
1111
		$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
1093
		$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. '&oelig;'
1112
		$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. '&oelig;'
1094
		$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
1113
		$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
1095
	
1114
	
1096
		return $str;
1115
		return $str;
1097
	}
1116
	}
1098
	
1117
	
1099
	/**
1118
	/**
1100
	 * Normaliser en supprimant les accents et en mettant en minuscule
1119
	 * Normaliser en supprimant les accents et en mettant en minuscule
1101
	 * @param $mot_cle le mot recherché
1120
	 * @param $mot_cle le mot recherché
1102
	 * */
1121
	 * */
1103
	private function normaliserMotCle($mot_cle) {
1122
	private function normaliserMotCle($mot_cle) {
1104
		return mb_strtolower($this->supprimerAccents(trim($mot_cle)));
1123
		return mb_strtolower($this->supprimerAccents(trim($mot_cle)));
1105
	}
1124
	}
1106
	
1125
	
1107
	/**
1126
	/**
1108
	 * Récupérer le numéro du département d'un fichier de configuration
1127
	 * Récupérer le numéro du département d'un fichier de configuration
1109
	 * */
1128
	 * */
1110
	private function obtenirIdDepartement($nomDpt) {
1129
	private function obtenirIdDepartement($nomDpt) {
1111
	
1130
	
1112
		$nomDpt = $this->supprimerAccents($nomDpt);
1131
		$nomDpt = $this->supprimerAccents($nomDpt);
1113
		$nomDpt = strtolower(str_replace(' ','-',$nomDpt));
1132
		$nomDpt = strtolower(str_replace(' ','-',$nomDpt));
1114
	
1133
	
1115
		$idDpt = $this->conteneur->getParametre($nomDpt);
1134
		$idDpt = $this->conteneur->getParametre($nomDpt);
1116
		if($idDpt == null || $idDpt == ' ') {
1135
		if($idDpt == null || $idDpt == ' ') {
1117
			$idDpt = ' ';
1136
			$idDpt = ' ';
1118
		}
1137
		}
1119
		return $idDpt;
1138
		return $idDpt;
1120
	}
1139
	}
1121
	
1140
	
1122
	
1141
	
1123
	/**
1142
	/**
1124
	 * Obtenir le type de requête à exécuter en fonction des paramètres de recherche
1143
	 * Obtenir le type de requête à exécuter en fonction des paramètres de recherche
1125
	 * @param $parametres les paramètres de l'application
1144
	 * @param $parametres les paramètres de l'application
1126
	 * */
1145
	 * */
1127
	private function getTypeRequete($ressources, $parametres) {
1146
	private function getTypeRequete($ressources, $parametres) {
1128
 
1147
 
1129
		// une image par id 
1148
		// une image par id 
1130
		if ((count($ressources) == 1) && is_numeric($ressources[0])) {
1149
		if ((count($ressources) == 1) && is_numeric($ressources[0])) {
1131
			return 'id';
1150
			return 'id';
1132
		}
1151
		}
1133
 
1152
 
1134
		$typeRequete = 'simple';
1153
		$typeRequete = 'simple';
1135
		
1154
		
1136
		// Dans ce cas précis, les informations concernant le depart, la limite ou l'ordre ne 
1155
		// Dans ce cas précis, les informations concernant le depart, la limite ou l'ordre ne 
1137
		// rentre pas en compte dans le type de requête ; ce ne sont que des compléments.
1156
		// rentre pas en compte dans le type de requête ; ce ne sont que des compléments.
1138
		unset($parametres['navigation.depart']);
1157
		unset($parametres['navigation.depart']);
1139
		unset($parametres['navigation.limite']);
1158
		unset($parametres['navigation.limite']);
1140
		unset($parametres['ordre']);
1159
		unset($parametres['ordre']);
1141
		
1160
		
1142
		// En revanche, chaque masque est associé à un type de requête particulier.
1161
		// En revanche, chaque masque est associé à un type de requête particulier.
1143
		$masquesObservation = array('masque', 'masque.departement', 'masque.ns', 'masque.genre', 'masque.date', 'masque.commune', 'masque.famille', 'masque.auteur', 'masque.nn', 'masque.referentiel');
1162
		$masquesObservation = array('masque', 'masque.departement', 'masque.ns', 'masque.genre', 'masque.date', 'masque.commune', 'masque.famille', 'masque.auteur', 'masque.nn', 'masque.referentiel');
1144
		$masquesImage = array('masque', 'masque.tag');
1163
		$masquesImage = array('masque', 'masque.tag');
1145
		
1164
		
1146
		// Le type de requête est défini par les tables qu'il doit inclure (observation, image, ou les deux) 
1165
		// Le type de requête est défini par les tables qu'il doit inclure (observation, image, ou les deux) 
1147
		$requeteSimple = false;
1166
		$requeteSimple = false;
1148
		$pourObservation = false;
1167
		$pourObservation = false;
1149
		$pourImage = false;
1168
		$pourImage = false;
1150
		
1169
		
1151
		// S'il n'y a aucun paramètre, on lance une requête simple
1170
		// S'il n'y a aucun paramètre, on lance une requête simple
1152
		if (empty($parametres)) {
1171
		if (empty($parametres)) {
1153
			$requeteSimple = true;
1172
			$requeteSimple = true;
1154
		}
1173
		}
1155
		
1174
		
1156
		// Si l'un des masques demandé concerne l'observation
1175
		// Si l'un des masques demandé concerne l'observation
1157
		foreach ($masquesObservation as $masque) {
1176
		foreach ($masquesObservation as $masque) {
1158
			if (isset($parametres[$masque])) {
1177
			if (isset($parametres[$masque])) {
1159
				$pourObservation = true;
1178
				$pourObservation = true;
1160
				break;
1179
				break;
1161
			}
1180
			}
1162
		}
1181
		}
1163
		
1182
		
1164
		// Si l'un des masques demandé concerne les images
1183
		// Si l'un des masques demandé concerne les images
1165
		foreach ($masquesImage as $masque) {
1184
		foreach ($masquesImage as $masque) {
1166
			if (isset($parametres[$masque])) {
1185
			if (isset($parametres[$masque])) {
1167
				$pourImage = true;
1186
				$pourImage = true;
1168
				break;
1187
				break;
1169
			}
1188
			}
1170
		}
1189
		}
1171
		
1190
		
1172
		// Selon les tri
1191
		// Selon les tri
1173
		if (isset($parametres['tri'])) {
1192
		if (isset($parametres['tri'])) {
1174
			switch ($parametres['tri']) {
1193
			switch ($parametres['tri']) {
1175
				case 'votes' :
1194
				case 'votes' :
1176
				case 'tags' :
1195
				case 'tags' :
1177
					$pourImage = true;
1196
					$pourImage = true;
1178
					break;
1197
					break;
1179
				default : //case 'date_observation' :
1198
				default : //case 'date_observation' :
1180
					if (sizeof($parametres) > 1) {
1199
					if (sizeof($parametres) > 1) {
1181
						$pourObservation = true;
1200
						$pourObservation = true;
1182
					}
1201
					}
1183
			}
1202
			}
1184
		}
1203
		}
1185
		
1204
		
1186
		// Vérifier la combinaison des booléens pour en déduire le type de requête
1205
		// Vérifier la combinaison des booléens pour en déduire le type de requête
1187
		if ($pourObservation && $pourImage) {
1206
		if ($pourObservation && $pourImage) {
1188
			$typeRequete = 'obs-images';
1207
			$typeRequete = 'obs-images';
1189
		} else {
1208
		} else {
1190
			if ($pourImage) {
1209
			if ($pourImage) {
1191
				$typeRequete = 'images';
1210
				$typeRequete = 'images';
1192
			} else if ($pourObservation) {
1211
			} else if ($pourObservation) {
1193
				$typeRequete = 'obs';
1212
				$typeRequete = 'obs';
1194
			} else { // if ($requeteSimple)
1213
			} else { // if ($requeteSimple)
1195
				$typeRequete = 'simple';
1214
				$typeRequete = 'simple';
1196
			}
1215
			}
1197
		}
1216
		}
1198
			
1217
			
1199
		return $typeRequete;
1218
		return $typeRequete;
1200
	}
1219
	}
1201
	
1220
	
1202
	
1221
	
1203
	private function doitJoindreTableVotes() {
1222
	private function doitJoindreTableVotes() {
1204
		return ($this->tri == 'votes');
1223
		return ($this->tri == 'votes');
1205
	}
1224
	}
1206
	
1225
	
1207
	private function doitJoindreTableTags() {
1226
	private function doitJoindreTableTags() {
1208
		return ($this->tri == 'tags');
1227
		return ($this->tri == 'tags');
1209
	}
1228
	}
1210
 
1229
 
1211
	/*-------------------------------------------------------------------------------
1230
	/*-------------------------------------------------------------------------------
1212
								FORMATER ET METTRE EN FORME
1231
								FORMATER ET METTRE EN FORME
1213
	--------------------------------------------------------------------------------*/
1232
	--------------------------------------------------------------------------------*/
1214
	
1233
	
1215
	/**
1234
	/**
1216
	*  Formater une observation depuis une ligne liaison
1235
	*  Formater une observation depuis une ligne liaison
1217
	*  @param $liaison liaison issue de la recherche
1236
	*  @param $liaison liaison issue de la recherche
1218
	*  @return $observation l'observation mise en forme
1237
	*  @return $observation l'observation mise en forme
1219
	* */
1238
	* */
1220
	private function formaterObservation($liaison) {
1239
	private function formaterObservation($liaison) {
1221
		$observation = array();
1240
		$observation = array();
1222
		foreach ($this->mappingObservation as $nomOriginal => $nomFinal) {
1241
		foreach ($this->mappingObservation as $nomOriginal => $nomFinal) {
1223
			$observation[$nomFinal] = $liaison[$nomOriginal];
1242
			$observation[$nomFinal] = $liaison[$nomOriginal];
1224
		}
1243
		}
1225
 
1244
 
1226
		return $observation;
1245
		return $observation;
1227
	}
1246
	}
1228
	
1247
	
1229
	/**
1248
	/**
1230
	*  Formater une observation depuis une ligne liaison
1249
	*  Formater une observation depuis une ligne liaison
1231
	*  @param $liaison liaison issue de la recherche
1250
	*  @param $liaison liaison issue de la recherche
1232
	*  @return $observation l'observation mise en forme
1251
	*  @return $observation l'observation mise en forme
1233
	* */
1252
	* */
1234
	private function formaterVotes($votes) {
1253
	private function formaterVotes($votes) {
1235
		$retour = array();
1254
		$retour = array();
1236
		foreach ($votes as $vote) {
1255
		foreach ($votes as $vote) {
1237
			$retour_vote = array();
1256
			$retour_vote = array();
1238
			foreach ($vote as $param=>$valeur) {
1257
			foreach ($vote as $param=>$valeur) {
1239
				if (strpos($this->mappingVotes[$param], 'protocole.') === 0) {
1258
				if (strpos($this->mappingVotes[$param], 'protocole.') === 0) {
1240
					$retour_protocole[$this->mappingVotes[$param]] = $valeur;
1259
					$retour_protocole[$this->mappingVotes[$param]] = $valeur;
1241
				} else {
1260
				} else {
1242
					$retour_vote[$this->mappingVotes[$param]] = $valeur;
1261
					$retour_vote[$this->mappingVotes[$param]] = $valeur;
1243
				}
1262
				}
1244
			}
1263
			}
1245
			if (!isset($retour[$vote['ce_image']][$vote['ce_protocole']])) {
1264
			if (!isset($retour[$vote['ce_image']][$vote['ce_protocole']])) {
1246
				$retour[$vote['ce_image']][$vote['ce_protocole']] = $retour_protocole;
1265
				$retour[$vote['ce_image']][$vote['ce_protocole']] = $retour_protocole;
1247
			}
1266
			}
1248
			$retour[$vote['ce_image']][$vote['ce_protocole']]['votes'][$vote['id_vote']] = $retour_vote;
1267
			$retour[$vote['ce_image']][$vote['ce_protocole']]['votes'][$vote['id_vote']] = $retour_vote;
1249
		}
1268
		}
1250
		
1269
		
1251
		return $retour;
1270
		return $retour;
1252
	}
1271
	}
1253
	
1272
	
1254
	/**
1273
	/**
1255
	 * Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
1274
	 * Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
1256
	 * */
1275
	 * */
1257
	private function formaterLienImage($idImage) {
1276
	private function formaterLienImage($idImage) {
1258
		$idImage = sprintf('%09s', $idImage);
1277
		$idImage = sprintf('%09s', $idImage);
1259
		$url = $this->conteneur->getParametre('url_images');
1278
		$url = $this->conteneur->getParametre('url_images');
1260
		$urlImage = sprintf($url, $idImage, $this->formatRetour);
1279
		$urlImage = sprintf($url, $idImage, $this->formatRetour);
1261
		return $urlImage;
1280
		return $urlImage;
1262
	}
1281
	}
1263
	
1282
	
1264
	private function proteger($valeur) {
1283
	private function proteger($valeur) {
1265
		if (is_array($valeur)) {
1284
		if (is_array($valeur)) {
1266
			return $this->bdd->protegerTableau($valeur);
1285
			return $this->bdd->protegerTableau($valeur);
1267
		} else {
1286
		} else {
1268
			return $this->bdd->proteger($valeur);
1287
			return $this->bdd->proteger($valeur);
1269
		}
1288
		}
1270
	}
1289
	}
1271
}
1290
}
1272
?>
1291
?>