Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
416 aurelien 1
<?php
550 jpm 2
// declare(encoding='UTF-8');
416 aurelien 3
/**
2462 jpm 4
 * Service fournissant une carte dynamique (communes + points) des obsertions publiques du CEL.
416 aurelien 5
 *
6
 * Cas d'utilisation :
7
 * /CelWidgetMap/Carte/Utilisateur : carte des observations publiques d'un utilisateur.
8
 * /CelWidgetMap/Carte/Utilisateur/Projet : carte des observations publiques d'un utilisateur pour un projet.
485 delphine 9
 * /CelWidgetMap/Carte/Utilisateur/Projet/dept : carte des observations publiques d'un utilisateur pour un projet sur un département.
1339 aurelien 10
 * /CelWidgetMap/Carte/Utilisateur/Projet/dept/nt : carte des observations publiques d'un utilisateur pour un projet sur un département pour un taxon.
416 aurelien 11
 *
12
 * Carte = Type de carte. Valeurs possible : defaut,
13
 * Utilisateur = identifiant (= courriel) de l'utilisateur ou * pour tous les utilisateurs.
14
 * Projet = mot-clé du projet
2282 mathias 15
 * 		Plusieurs mots-clés peuvent être spécifiés:
2446 jpm 16
 * 			machin ET bidule ET chose => observations ayant tous les mots-clés (intersection)
2282 mathias 17
 * 			machin OU bildule OU chose => observations ayant au moins un des mots-clés (union)
18
 * 		ATTENTION
19
 * 			machin ET bidule OU chose donne un résultat indéterminé pour l'instant
416 aurelien 20
 *
2462 jpm 21
 * @internal   Mininum PHP version : 5.2
22
 * @category   CEL
23
 * @package    Services
24
 * @subpackage Widget
25
 * @version    0.1
26
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
27
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
28
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
29
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
30
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
31
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
416 aurelien 32
 */
519 jpm 33
// TODO : supprimer le TRIM quand les obs seront reliées correctements aux localisations (sur le code INSEE par exemple)
1092 aurelien 34
class CelWidgetMapPoint extends Cel {
981 jpm 35
	const MARQUEUR_GROUPE = 'GROUPE';
36
	const MARQUEUR_COMMUNE = 'COMMUNE';
37
	const MARQUEUR_STATION = 'STATION';
3685 delphine 38
	private $standard = "1";
39
	private $table_export = "cel_export";
3601 delphine 40
 
416 aurelien 41
	/**
42
	 * Méthode appelée avec une requête de type GET.
43
	 */
840 jpm 44
	public function getElement($ressources) {
416 aurelien 45
		$retour = null;
1132 aurelien 46
		if($this->parametres == null) {
47
			$this->parametres = array();
48
		}
840 jpm 49
		extract($this->parametres);
981 jpm 50
		//Chronometre::chrono("Avant groupage");
3602 delphine 51
		if (isset($this->parametres['standard']) && $this->parametres['standard'] == 0) {
3685 delphine 52
		    $this->standard = "0";
53
		    $this->table_export = "cel_export_total";
54
 
3601 delphine 55
		}
1003 jpm 56
 
840 jpm 57
		$action = array_shift($ressources);
58
		if (isset($action)) {
59
			$methode = $this->traiterNomMethodeGet($action);
416 aurelien 60
			if (method_exists($this, $methode)) {
840 jpm 61
				$retour = $this->$methode($ressources);
416 aurelien 62
			} else {
840 jpm 63
				$this->messages[] = "Ce type de ressource '$methode' n'est pas disponible.";
416 aurelien 64
			}
65
		} else {
840 jpm 66
			$this->messages[] = "Vous devez indiquer le type de ressource.";
416 aurelien 67
		}
1003 jpm 68
 
981 jpm 69
		//Chronometre::chrono("Apres traitement");
70
		//echo Chronometre::afficherChrono();
416 aurelien 71
		if (is_null($retour)) {
72
			$info = 'Un problème est survenu : '.print_r($this->messages, true);
73
			$this->envoyer($info);
1003 jpm 74
		} else if (isset($retour['type']) && $retour['type'] == 'jsonVar') {
694 jpm 75
			$this->envoyerJsonVar($retour['variable_js'], $retour['donnees']);
1003 jpm 76
		} else if (isset($retour['type']) && $retour['type'] == 'jsonP') {
584 jpm 77
			$this->envoyerJsonp($retour['donnees']);
1003 jpm 78
		} else if (isset($retour['type']) && $retour['type'] == 'png') {
981 jpm 79
			header("Content-type: image/png");
80
			imagepng($retour['img']);
81
			imagedestroy($retour['img']);
474 jpm 82
		} else {
938 jpm 83
			$this->envoyerJson($retour);
416 aurelien 84
		}
85
	}
1003 jpm 86
 
416 aurelien 87
	/**
981 jpm 88
	 * Les icones des groupes de stations
89
	 */
90
	public function getIconeGroupe($params) {
91
		extract($this->parametres);
1003 jpm 92
 
1033 aurelien 93
		$chemin_marqueur = sprintf($this->config['settings']['cheminCelMarkerObsTpl'], $type);
94
		$img = imagecreatefrompng($chemin_marqueur);
1003 jpm 95
 
981 jpm 96
		$noir = imagecolorallocate($img, 0, 0, 0);
97
		$texte = (String) $nbre;
98
		$x = (imagesx($img) - 6.0 * strlen($texte)) / 2;
99
		$y = (imagesy($img) - 16) / 2;
1003 jpm 100
 
981 jpm 101
		imagestring($img, 3, $x, $y, $texte, $noir);
1003 jpm 102
 
981 jpm 103
		imagealphablending($img, false);
104
		imagesavealpha($img, true);
1003 jpm 105
 
981 jpm 106
		return array('type' => 'png', 'img' => $img);
107
	}
1003 jpm 108
 
3616 delphine 109
	public function getTout($params) {
1622 aurelien 110
 
2143 jpm 111
		$emplacements = null;
3718 delphine 112
		$concatenation_id = "CONCAT(IFNULL(latitude,''),IFNULL(longitude,'')) ";
3685 delphine 113
		$transmission = ( $this->standard = 0) ? "transmission = '1' AND " : "";
1622 aurelien 114
		$requete =  'SELECT ce_zone_geo, zone_geo, station, '.
115
								"mots_cles_texte, ".
116
								"latitude, ".
3718 delphine 117
								"NULL as wgs84_latitude, ".
1622 aurelien 118
								"longitude, ".
3718 delphine 119
								"NULL as wgs84_longitude, ".
1622 aurelien 120
								$concatenation_id." as id_coord ".
3685 delphine 121
					'FROM '.$this->table_export.' AS co '.
3718 delphine 122
 
3685 delphine 123
                    "WHERE ".$transmission.
124
                    " (".
3719 delphine 125
                    $this->construireWhereRectangleStationOR()." ".
1622 aurelien 126
					$this->construireWhereRectangleCommuneOR().") ".
127
					$this->construireWhereDept().
128
                    $this->construireWhereCommune().
2560 aurelien 129
                    $this->construireWherePays().
1622 aurelien 130
                    $this->construireWhereUtilisateur().
131
					$this->construireWhereNumTaxonAvecSousTaxons().
132
					$this->construireWhereNomTaxon().
133
					$this->construireWhereReferentiel().
134
					$this->construireWhereDate().
135
					$this->construireWhereCommentaire().
136
					$this->construireWherePhotosSeulement().
137
					$this->construireWhereProjet().
138
					$this->construireWhereTag().
139
					$this->construireWhereNombreDeJours().
2291 mathias 140
					$this->construireWhereAnnee().
2681 aurelien 141
					$this->construireWhereGroupeZoneGeo().
1622 aurelien 142
					' GROUP BY id_coord';
2143 jpm 143
 
144
		$resultats_emplacements = Cel::db()->requeter($requete);
1106 aurelien 145
		$emplacements = $this->traiterEmplacements($resultats_emplacements, $this->compterObservations($params));
146
		return $emplacements;
981 jpm 147
	}
2143 jpm 148
 
1092 aurelien 149
	private function afficherRequeteFormatee($requete) {
150
		$requete = str_replace(')',')<br />',$requete);
151
		$requete = str_replace('(','	<br />	(',$requete);
152
		echo '<pre>'.$requete.'</pre>';
153
		exit;
154
	}
1003 jpm 155
 
1039 aurelien 156
	private $nb_obs = 0;
157
 
158
	private function compterObservations($params) {
3685 delphine 159
	    $transmission = ( $this->standard = 0) ? "transmission = '1' AND " : "";
1172 aurelien 160
		$requete =  'SELECT COUNT(*) as nb '.
3685 delphine 161
					'FROM '.$this->table_export.' AS co '.
162
                    "WHERE ".$transmission.
163
                    " (".
3617 delphine 164
                    $this->construireWhereRectangleStationOR()." OR ".
1622 aurelien 165
					$this->construireWhereRectangleCommuneOR().") ".
166
					$this->construireWhereDept().
167
                    $this->construireWhereCommune().
2560 aurelien 168
                    $this->construireWherePays().
1622 aurelien 169
                    $this->construireWhereUtilisateur().
170
					$this->construireWhereNumTaxonAvecSousTaxons().
171
					$this->construireWhereNomTaxon().
172
					$this->construireWhereReferentiel().
173
					$this->construireWhereDate().
174
					$this->construireWhereCommentaire().
175
					$this->construireWherePhotosSeulement().
176
					$this->construireWhereProjet().
177
					$this->construireWhereTag().
2296 mathias 178
					$this->construireWhereNombreDeJours().
2681 aurelien 179
					$this->construireWhereAnnee().
3619 delphine 180
					$this->construireWhereGroupeZoneGeo();
1568 aurelien 181
 
2143 jpm 182
		$resultats_nb_obs = Cel::db()->requeter($requete);
1039 aurelien 183
		return $resultats_nb_obs[0]['nb'];
184
	}
185
 
186
	private function traiterEmplacements(&$emplacements, $nb_total_observation) {
981 jpm 187
		$zoom = (int) array_key_exists('zoom', $this->parametres) ? $this->parametres['zoom'] : 11;
188
		$distance = (int) array_key_exists('distance', $this->parametres) ? $this->parametres['distance'] : 20;
1003 jpm 189
 
981 jpm 190
		$marqueurs = array(
191
			'stats' => array('stations' => 0, 'communes' => 0, 'observations' => 0),
192
			'points' => null
193
		);
1003 jpm 194
 
1132 aurelien 195
		if (isset($this->parametres['ne']) && $this->parametres['sw'] && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) {
981 jpm 196
			$ne = $this->decomposerLatLng($this->parametres['ne']);
197
			$sw = $this->decomposerLatLng($this->parametres['sw']);
198
			$marqueurs['points'] = CartoGroupage::creerGroupesQuadtree($emplacements, $ne['lat'], $ne['lng'], $sw['lat'], $sw['lng'], $zoom);
1003 jpm 199
 
200
			// laisser la classe cartoGroupage compter les élements simplifie le comptage
982 jpm 201
			// et permet de ne pas reparser le tableau pour compter les différents éléments
981 jpm 202
			$nb_elements = CartoGroupage::getNbElements();
1148 aurelien 203
			// les bornes servent à centrer la carte dans le cas ou l'on demande des paramètres précis
1106 aurelien 204
			$marqueurs['stats']['coordmax'] = CartoGroupage::getBornes();
981 jpm 205
			$marqueurs['stats']['stations'] = $nb_elements['stations'];
206
			$marqueurs['stats']['communes'] = $nb_elements['communes'];
1039 aurelien 207
			$marqueurs['stats']['observations'] = (int)$nb_total_observation;
981 jpm 208
		} else {
209
			$marqueurs['points'] = $emplacements;
938 jpm 210
		}
981 jpm 211
 
212
		return $marqueurs;
938 jpm 213
	}
1003 jpm 214
 
981 jpm 215
	private function traiterStations($communes, $stations) {
216
		$zoom = (int) array_key_exists('zoom', $this->parametres) ? $this->parametres['zoom'] : 11;
217
		$distance = (int) array_key_exists('distance', $this->parametres) ? $this->parametres['distance'] : 20;
1003 jpm 218
 
981 jpm 219
		$marqueurs = array(
954 jpm 220
			'stats' => array('stations' => 0, 'communes' => 0, 'observations' => 0),
221
			'points' => null
222
		);
981 jpm 223
		$marqueurs['stats']['observations'] = $this->traiterNbreObs($communes) + $this->traiterNbreObs($stations);
1003 jpm 224
 
954 jpm 225
		$points = array();
981 jpm 226
		if ($communes !== false) {
227
			foreach ($communes as $commune) {
228
				if (is_numeric($commune['lat']) && is_numeric($commune['lng'])) {
229
					extract($commune);
230
					$id = self::MARQUEUR_COMMUNE.':'.$lat.'|'.$lng;
231
					$lata = round($lat, 5);
232
					$lnga = round($lng, 5);
1003 jpm 233
 
954 jpm 234
					if (!isset($points[$id])) {
981 jpm 235
						$points[$id]['id'] = $id;
236
						$points[$id]['nom'] = $nom;
237
						$points[$id]['lat'] = $lata;
238
						$points[$id]['lng'] = $lnga;
954 jpm 239
						$points[$id]['nbre'] = 1;
981 jpm 240
						$marqueurs['stats']['communes']++;
840 jpm 241
					} else {
954 jpm 242
						$points[$id]['nbre']++;
840 jpm 243
					}
981 jpm 244
				}
245
			}
246
		}
247
		if ($stations !== false) {
248
			foreach ($stations as $station) {
249
				if (is_numeric($station['lat']) && is_numeric($station['lng'])) {
250
					extract($station);
251
					$id = self::MARQUEUR_STATION.':'.$lat.'|'.$lng;
252
					$lata = round($lat, 5);
253
					$lnga = round($lng, 5);
254
					$nom = $this->etreNull($nom) ? $lata.','.$lnga : $nom;
1003 jpm 255
 
954 jpm 256
					if (!isset($points[$id])) {
981 jpm 257
						$points[$id]['id'] = $id;
258
						$points[$id]['nom'] = $nom;
259
						$points[$id]['lat'] = $lata;
260
						$points[$id]['lng'] = $lnga;
954 jpm 261
						$points[$id]['nbre'] = 1;
981 jpm 262
						$marqueurs['stats']['stations']++;
954 jpm 263
					} else {
264
						$points[$id]['nbre']++;
265
					}
981 jpm 266
				}
416 aurelien 267
			}
268
		}
1003 jpm 269
 
1132 aurelien 270
		if (isset($this->parametres['ne']) && $this->parametres['sw'] && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) {
981 jpm 271
			$ne = $this->decomposerLatLng($this->parametres['ne']);
272
			$sw = $this->decomposerLatLng($this->parametres['sw']);
1898 mathias 273
			$marqueurs['points'] = CartoGroupage::creerGroupesQuadtree($points, $ne['lat'], $ne['lng'], $sw['lat'], $sw['lng'], $zoom);
981 jpm 274
		} else {
275
			$marqueurs['points'] = $points;
276
		}
1004 jpm 277
		//$marqueurs['stats']['latDiff'] = abs($marqueurs['stats']['latMin'] - $marqueurs['stats']['latMax']);
278
		//$marqueurs['stats']['lngDiff'] = abs($marqueurs['stats']['lngMin'] - $marqueurs['stats']['lngMax']);
1003 jpm 279
 
981 jpm 280
		return $marqueurs;
416 aurelien 281
	}
1003 jpm 282
 
981 jpm 283
	private function definirLatLngMaxMin(&$marqueurs, $lat, $lng) {
284
		if ($lat != null && $lng != null) {
285
			$marqueurs['stats']['latMin'] = $marqueurs['stats']['latMin'] > $lat ? $lat : $marqueurs['stats']['latMin'];
286
			$marqueurs['stats']['lngMin'] = $marqueurs['stats']['lngMin'] > $lng ? $lng : $marqueurs['stats']['lngMin'];
287
			$marqueurs['stats']['latMax'] = $marqueurs['stats']['latMax'] < $lat ? $lat : $marqueurs['stats']['latMax'];
288
			$marqueurs['stats']['lngMax'] = $marqueurs['stats']['lngMax'] < $lng ? $lng : $marqueurs['stats']['lngMax'];
289
		}
290
	}
1003 jpm 291
 
981 jpm 292
	private function traiterNbreObs($resultats) {
293
		$obs_nbre = 0;
294
		if ($resultats !== false) {
295
			$obs_nbre = count($resultats);
296
		}
297
		return $obs_nbre;
298
	}
1003 jpm 299
 
981 jpm 300
	private function verifierLatLng($lat, $lng) {
301
		$ok_lat = $this->etreLatitude($lat) ? true : false;
302
		$ok_lng = $this->etreLongitude($lng) ? true : false;
303
		$ok = $ok_lat && $ok_lng;
1003 jpm 304
		return $ok;
981 jpm 305
	}
1003 jpm 306
 
981 jpm 307
	private function etreLatitude($lat) {
308
		$ok = false;
309
		//$format =  preg_match('/^[-]?[0-9]+(?:[.][0-9]+|)$/', $lat) ? true : false;
310
		$ok = ($lat >= -90 && $lat <= 90) ? true : false;
311
		return $ok;
312
	}
1003 jpm 313
 
981 jpm 314
	private function etreLongitude($lng) {
315
		$ok = false;
316
		//$format =  preg_match('/^[-]?[0-9]+(?:[.][0-9]+|)$/', $lng) ? true : false;
317
		$ok = ($lng >= -180 && $lng <= 180) ? true : false;
318
		return $ok;
319
	}
1003 jpm 320
 
3587 delphine 321
 
322
	/* à changer pour localisation_floutage */
981 jpm 323
	private function etreObsSensible($tags) {
324
		$sensible = true;
325
		if (stristr($tags, 'sensible') === FALSE) {
326
			$sensible = false;
327
		}
328
		return $sensible;
329
	}
2143 jpm 330
 
1165 aurelien 331
	private function communeEstDemandee() {
1622 aurelien 332
	    $station_infos = $this->decomposerParametreStation();
333
	    $commune_demandee = true;
334
	    if($station_infos['type'] == self::MARQUEUR_STATION) {
1165 aurelien 335
			$commune_demandee = false;
1622 aurelien 336
	    }
337
	    return $commune_demandee;
1165 aurelien 338
	}
339
 
474 jpm 340
	/**
341
	 * Données pour l'affichage des obs d'une station
342
	 */
343
	public function getObservations($params) {
938 jpm 344
		$resultats = array();
345
		$total = 0;
3686 delphine 346
		$transmission = ( $this->standard = 0) ? "transmission = '1' " : " 1 ";
3685 delphine 347
 
1132 aurelien 348
		if (isset($this->parametres['station']) && !$this->etreNull($this->parametres['station'])) {
3620 delphine 349
			$requete = 	'SELECT SQL_CALC_FOUND_ROWS id_observation, ce_utilisateur, courriel_utilisateur, pseudo_utilisateur as nom_utilisateur, "" as prenom_utilisateur, '.
3621 delphine 350
						'	nom_sel, nom_ret, nom_sel_nn, nom_ret_nn, "" as nt, famille, '.
1622 aurelien 351
						'	lieudit, zone_geo, date_observation, milieu, commentaire, '.
3719 delphine 352
						'	null as utm_secteur, null as utm_x, null as utm_y, ce_zone_geo as code, date_transmission, nom_referentiel '.
3685 delphine 353
						'FROM '.$this->table_export.' AS co '.
354
						"WHERE ".$transmission.
1622 aurelien 355
						(($this->communeEstDemandee()) ? $this->construireWhereCommuneSansCoordonneesAvecSensibles() : $this->construireWhereCoordonneesSansSensibles()).
356
						$this->construireWhereDept().
2560 aurelien 357
						$this->construireWherePays().
1622 aurelien 358
						$this->construireWhereUtilisateur().
359
						$this->construireWhereNumTaxonAvecSousTaxons().
360
						$this->construireWhereNomTaxon().
361
						$this->construireWhereReferentiel().
362
						$this->construireWhereDate().
363
						$this->construireWhereCommentaire().
364
						$this->construireWherePhotosSeulement().
365
						$this->construireWhereProjet().
366
						$this->construireWhereTag().
367
						$this->construireWhereNombreDeJours().
2681 aurelien 368
						$this->construireWhereAnnee().
369
						$this->construireWhereGroupeZoneGeo().
1622 aurelien 370
	                    'ORDER BY nom_sel ASC '.
371
	                    "LIMIT {$this->start},{$this->limit} ";
1339 aurelien 372
			//echo $requete;exit;
1765 raphael 373
			$resultats = Cel::db()->requeter($requete, self::SQL_RETOUR_COMPLET, self::SQL_MODE_OBJET);
938 jpm 374
			$requete = 'SELECT FOUND_ROWS()';
1765 raphael 375
			$total = (int) Cel::db()->requeter($requete, self::SQL_RETOUR_COLONNE);
474 jpm 376
		}
1003 jpm 377
 
474 jpm 378
		// Post-traitement
938 jpm 379
		$observations = $this->traiterObservations($resultats, $total);
1039 aurelien 380
		$observations = $this->ajouterImagesAuxObs($observations);
381
		$observations = $this->ajouterAuteursAuxObs($observations);
938 jpm 382
		$observations = $this->supprimerIdDesObs($observations);
1003 jpm 383
 
938 jpm 384
		return $observations;
385
	}
1003 jpm 386
 
938 jpm 387
	private function traiterObservations($donnees, $total) {
388
		$observations = array('commune' => '', 'observations' => array(), 'observateurs' => array());
389
		$observations['total'] = (isset($total)) ? $total : 0;
390
		if (is_array($donnees) && count($donnees) > 0) {
391
			foreach ($donnees as $donnee) {
1339 aurelien 392
				//echo '<pre>'.print_r($donnee,true).'</pre>';exit;
938 jpm 393
				$observation = array();
1339 aurelien 394
				$observation['idObs'] = $donnee->id_observation;
395
				$observation['nn'] = $this->etreNull($donnee->nom_sel_nn) ? null : $donnee->nom_sel_nn;
938 jpm 396
				$observation['nomSci'] = $this->nettoyerTexte($donnee->nom_sel);
1411 aurelien 397
				$observation['date'] = ($donnee->date_observation != '0000-00-00 00:00:00') ? $this->formaterDate($donnee->date_observation, '%d/%m/%Y') : '';
938 jpm 398
				$observation['datePubli'] = $this->formaterDate($donnee->date_transmission);
399
				$observation['lieu'] = $this->traiterLieu($donnee);
1339 aurelien 400
				$observation['observateur'] = $donnee->courriel_utilisateur;
401
				$observation['observateurId'] = $donnee->ce_utilisateur;
1622 aurelien 402
				$observation['urlEflore'] = $this->getUrlEflore($donnee->nom_referentiel, $donnee->nom_sel_nn);
1003 jpm 403
 
1339 aurelien 404
				if (isset($donnee->zone_geo)) {
405
					$observations['commune'] = $this->nettoyerTexte($donnee->zone_geo);
938 jpm 406
				}
1339 aurelien 407
				$observations['observations'][$donnee->id_observation] = $observation;
1003 jpm 408
 
1339 aurelien 409
				if (! array_key_exists($donnee->ce_utilisateur, $observations['observateurs'])) {
410
					$observations['observateurs'][$donnee->courriel_utilisateur] = $donnee->courriel_utilisateur;
938 jpm 411
				}
412
			}
487 jpm 413
		}
938 jpm 414
		return $observations;
415
	}
1003 jpm 416
 
938 jpm 417
	private function traiterLieu($donnee) {
418
		$lieu = array();
419
		if (!$this->etreNull($donnee->lieudit)) {
420
			$lieu[] = $donnee->lieudit;
421
		}
422
		if (!$this->etreNull($donnee->milieu)) {
423
			$lieu[] = $donnee->milieu;
424
		}
425
		return implode(', ', $lieu);
426
	}
1003 jpm 427
 
938 jpm 428
	private function chargerImages(Array $obs_ids) {
429
		// Récupération des données au format Json
430
		$service = 'CelImage/liste-ids?obsId='.implode(',', $obs_ids);
431
		$url = sprintf($this->config['settings']['baseURLServicesCelTpl'], $service);
432
		$json = $this->getRestClient()->consulter($url);
433
		$donnees = json_decode($json);
1003 jpm 434
 
938 jpm 435
		// Post-traitement des données
436
		$images = $this->traiterImages($donnees);
1003 jpm 437
 
938 jpm 438
		return $images;
474 jpm 439
	}
1003 jpm 440
 
938 jpm 441
	private function traiterImages($donnees) {
442
		$images = array();
443
		if (count($donnees) > 0) {
444
			foreach ($donnees as $id_obs => $id_images) {
445
				foreach ($id_images as $id_img) {
446
					$urls['idImg'] = $id_img;
447
					$urls['guid'] = sprintf($this->config['settings']['guidImgTpl'], $id_img);
3632 delphine 448
					$urls['miniature'] = $this->getUrlImage($id_img, 'CXS').'.jpg';
3633 delphine 449
					$urls['normale'] = $this->getUrlImage($id_img, 'XL').'.jpg';
938 jpm 450
					$images[$id_obs][] = $urls;
1003 jpm 451
				}
938 jpm 452
			}
453
		}
454
		return $images;
455
	}
1003 jpm 456
 
938 jpm 457
	private function ajouterImagesAuxObs($observations) {
458
		$images = $this->chargerImages(array_keys($observations['observations']));
459
		foreach ($observations['observations'] as $id => $infos) {
1043 aurelien 460
			if(isset($images[$id])) {
461
				$infos['images'] = $images[$id];
462
				$observations['observations'][$id] = $infos;
463
			}
938 jpm 464
		}
465
		return $observations;
466
	}
2143 jpm 467
 
938 jpm 468
	private function ajouterAuteursAuxObs($observations) {
944 jpm 469
		$observateurs = $this->recupererUtilisateursIdentite(array_keys($observations['observateurs']));
938 jpm 470
		unset($observations['observateurs']);
471
		foreach ($observations['observations'] as $id => $infos) {
1482 aurelien 472
			$courriel = strtolower($infos['observateur']);
1339 aurelien 473
			if(isset($observateurs[$courriel])) {
474
				$infos['observateur'] = $observateurs[$courriel]['intitule'];
475
				$infos['observateurId'] = $observateurs[$courriel]['id'];
476
			}
938 jpm 477
			$observations['observations'][$id] = $infos;
478
		}
479
		return $observations;
480
	}
1003 jpm 481
 
938 jpm 482
	private function supprimerIdDesObs($observations) {
483
		// Le tableau de sortie ne doit pas avoir les id des obs en clé car sinon Jquery Template ne fonctionne pas
484
		$observationSansId = $observations;
485
		unset($observationSansId['observations']);
486
		foreach ($observations['observations'] as $id => $infos) {
487
			$observationSansId['observations'][] = $infos;
488
		}
489
		return $observationSansId;
490
	}
1003 jpm 491
 
478 jpm 492
	/**
938 jpm 493
	 * Liste des taxons présents sur la carte
840 jpm 494
	 */
938 jpm 495
	public function getTaxons($params) {
840 jpm 496
		$json = null;
3685 delphine 497
		$transmission = ( $this->standard = 0) ? "transmission = '1' AND " : "";
1339 aurelien 498
		$requete = 	'SELECT SQL_CALC_FOUND_ROWS DISTINCT nom_ret, nom_ret_nn, nt, famille '.
3685 delphine 499
					'FROM '.$this->table_export.' AS co '.
500
					"WHERE ".$transmission.
501
					"	nom_ret != '' ".
1622 aurelien 502
					$this->construireWhereDept().
503
                    $this->construireWhereCommune().
2560 aurelien 504
                    $this->construireWherePays().
1622 aurelien 505
                    $this->construireWhereUtilisateur().
506
					$this->construireWhereNumTaxon().
507
					$this->construireWhereNomTaxon().
508
					$this->construireWhereReferentiel().
509
					$this->construireWhereDate().
510
					$this->construireWhereCommentaire().
511
					$this->construireWherePhotosSeulement().
512
					$this->construireWhereProjet().
513
					$this->construireWhereTag().
514
					$this->construireWhereNombreDeJours().
2291 mathias 515
					$this->construireWhereAnnee().
2681 aurelien 516
					$this->construireWhereGroupeZoneGeo().
1622 aurelien 517
					'ORDER BY nom_ret ASC '.
518
                    "LIMIT {$this->start},{$this->limit} ";
938 jpm 519
		//$this->debug[] = $requete;
1765 raphael 520
		$resultats = Cel::db()->requeter($requete, self::SQL_RETOUR_COMPLET, self::SQL_MODE_OBJET);
1339 aurelien 521
		//echo $requete;exit;
938 jpm 522
		$requete = 'SELECT FOUND_ROWS()';
1765 raphael 523
		$taxons['total'] = (int) Cel::db()->requeter($requete, self::SQL_RETOUR_COLONNE);
1003 jpm 524
 
938 jpm 525
		// Post-traitement
526
		$taxons['taxons'] = $this->traiterTaxons($resultats);
1003 jpm 527
 
938 jpm 528
		return $taxons;
840 jpm 529
	}
1003 jpm 530
 
938 jpm 531
	private function traiterTaxons($donnees) {
532
		$taxons = array();
533
		if (is_array($donnees) && count($donnees) > 0) {
534
			foreach ($donnees as $donnee) {
1339 aurelien 535
				if (!isset($taxons[$donnee->nt]) && ! $this->etreNull($donnee->nom_ret)) {
938 jpm 536
					$taxon = array();
1339 aurelien 537
					$taxon['nn'] = $donnee->nom_ret_nn;
538
					$taxon['nt'] = $donnee->nt;
938 jpm 539
					$taxon['nom'] = $this->nettoyerTexte($donnee->nom_ret);
540
					$taxon['famille'] = $this->nettoyerTexte($donnee->famille);
1339 aurelien 541
					$taxons[$donnee->nt] = $taxon;
938 jpm 542
				}
543
			}
544
		}
545
		$taxons = array_values($taxons);
546
		return $taxons;
547
	}
1003 jpm 548
 
938 jpm 549
	private function construireWhereCoordonnees() {
550
		$sql = '';
551
		// Récupération des coordonnées depuis l'id station
940 jpm 552
		extract($this->decomposerParametreStation());
938 jpm 553
		if (isset($type)) {
981 jpm 554
			if ($type == self::MARQUEUR_COMMUNE) {
1765 raphael 555
				$lat = Cel::db()->proteger($lat.'%');
556
				$lng = Cel::db()->proteger($lng.'%');
3718 delphine 557
				//$sql = " AND wgs84_latitude LIKE $lat AND wgs84_longitude LIKE $lng ";
981 jpm 558
			}  else if ($type == self::MARQUEUR_STATION) {
1765 raphael 559
				$lat = Cel::db()->proteger($lat.'%');
560
				$lng = Cel::db()->proteger($lng.'%');
1339 aurelien 561
				$sql = " AND (latitude LIKE $lat AND longitude LIKE $lng) ";
938 jpm 562
			}
1003 jpm 563
		}
938 jpm 564
		return $sql;
565
	}
2143 jpm 566
 
1092 aurelien 567
	private function construireWhereCoordonneesSansSensibles() {
568
		$sql = '(';
569
		// Récupération des coordonnées depuis l'id station
570
		extract($this->decomposerParametreStation());
571
		if (isset($type)) {
572
			if ($type == self::MARQUEUR_COMMUNE) {
1765 raphael 573
				$lat = Cel::db()->proteger($lat);
574
				$lng = Cel::db()->proteger($lng);
3718 delphine 575
				//$sql = " AND wgs84_latitude LIKE $lat AND wgs84_longitude LIKE $lng ";
1092 aurelien 576
			}  else if ($type == self::MARQUEUR_STATION) {
1765 raphael 577
				$lat = Cel::db()->proteger($lat.'%');
578
				$lng = Cel::db()->proteger($lng.'%');
1339 aurelien 579
				$sql = " AND (latitude LIKE $lat AND longitude LIKE $lng) ";
1092 aurelien 580
			}
581
		}
3622 delphine 582
		//$sql .= ' AND (localisation_floutage IS NULL OR localisation_floutage = "précise" ) ';
1092 aurelien 583
		return $sql;
584
	}
1003 jpm 585
 
940 jpm 586
	private function construireWhereCommentaire() {
587
		$sql = '';
588
		list($type, $commentaire) = $this->decomposerParametreCommentaire();
589
		if (!$this->etreNull($commentaire)) {
1765 raphael 590
			$commentaire = Cel::db()->proteger('%'.$commentaire.'%');
940 jpm 591
			switch ($type) {
592
				case '*' :
593
					$sql = $this->obtenirConditionPourCommentaires($commentaire);
594
					$sql = " AND (commentaire LIKE $commentaire OR ($sql)) ";
595
					break;
596
				case 'observation' :
597
					$sql = " AND commentaire LIKE $commentaire ";
598
					break;
599
				case 'photo' :
600
					$sql = ' AND '.$this->obtenirConditionPourCommentaires($commentaire).' ';
601
					break;
602
				case 'photo.meta' :
603
					$sql = ' AND '.$this->obtenirConditionPourCommentaireMeta($commentaire).' ';
604
					break;
605
				case 'photo.utilisateur' :
606
					$sql = ' AND '.$this->obtenirConditionPourCommentaireUtilisateur($commentaire).' ';
607
					break;
608
				default:
609
					$sql = " AND commentaire LIKE $commentaire ";
1003 jpm 610
			}
940 jpm 611
		}
612
		return $sql;
613
	}
1003 jpm 614
 
615
 
938 jpm 616
	private function construireWhereNomTaxon() {
617
		$sql = '';
940 jpm 618
		list($type, $nom) = $this->decomposerParametreTaxon();
619
		if (!$this->etreNull($nom)) {
1765 raphael 620
			$nom = Cel::db()->proteger($nom.'%');
938 jpm 621
			switch ($type) {
622
				case '*' :
623
					$sql = " AND (nom_ret LIKE $nom OR nom_sel LIKE $nom OR famille LIKE $nom) ";
624
					break;
940 jpm 625
				case 'retenu' :
938 jpm 626
					$sql = " AND nom_ret LIKE $nom ";
627
					break;
940 jpm 628
				case 'selectionne' :
938 jpm 629
					$sql = " AND nom_sel LIKE $nom ";
630
					break;
940 jpm 631
				case 'famille' :
938 jpm 632
					$sql = " AND famille LIKE $nom ";
633
					break;
634
				default:
635
					$sql = " AND nom_ret LIKE $nom ";
1003 jpm 636
			}
938 jpm 637
		}
638
		return $sql;
639
	}
2143 jpm 640
 
1497 aurelien 641
	private function construireWhereReferentiel() {
642
		$sql = '';
643
		extract($this->parametres);
644
		if (isset($referentiel) && !$this->etreNull($referentiel)) {
3685 delphine 645
			$referentiel = Cel::db()->proteger($referentiel);
646
			$sql = ' AND co.nom_referentiel = '.$referentiel.' ';
1497 aurelien 647
		}
648
		return $sql;
649
	}
1003 jpm 650
 
938 jpm 651
	private function construireWhereDate() {
652
		$sql = '';
653
		// Récupération des coordonnées depuis l'id station
940 jpm 654
		list($type, $date) = $this->decomposerParametreDate();
1003 jpm 655
 
938 jpm 656
		if (!$this->etreNull($date)) {
1765 raphael 657
			$date = Cel::db()->proteger($date.'%');
938 jpm 658
			switch ($type) {
659
				case '*' :
660
					$sql = " AND (
1003 jpm 661
						date_observation LIKE $date
662
						OR date_creation LIKE $date
663
						OR date_modification LIKE $date
938 jpm 664
						OR date_transmission LIKE $date) ";
665
					break;
666
				case 'observation' :
667
					$sql = " AND date_observation LIKE $date ";
668
					break;
669
				case 'creation' :
670
					$sql = " AND date_creation LIKE $date ";
671
					break;
672
				case 'modification' :
673
					$sql = " AND date_modification LIKE $date ";
674
					break;
675
				case 'transmission' :
676
					$sql = " AND date_transmission LIKE $date ";
677
					break;
940 jpm 678
				case 'photo' :
679
					$sql = $this->obtenirConditionPourDatePhoto($date);
680
					break;
681
				case 'ajout' :
682
					$sql = $this->obtenirConditionPourDateAjout($date);
683
					break;
938 jpm 684
				case 'liaison' :
940 jpm 685
					$sql = $this->obtenirConditionPourDateLiaison($date);
938 jpm 686
					break;
687
				default:
688
					$sql = " AND date_observation LIKE $date ";
689
			}
690
		}
691
		return $sql;
692
	}
1003 jpm 693
 
940 jpm 694
	private function obtenirConditionPourDatePhoto($date) {
695
		$observations = $this->obtenirObsLieesImg('date.photo', $date);
696
		if (is_null($observations)) {
697
			$this->debug[] = "Aucune observation n'est liée à une photo prise à la date : $date";
698
		}
699
		$sql = $this->assemblerObsEnConditionSql($observations);
700
		return $sql;
701
	}
1003 jpm 702
 
940 jpm 703
	private function obtenirConditionPourDateLiaison($date) {
704
		$observations = $this->obtenirObsLieesImg('date.liaison', $date);
705
		if (is_null($observations)) {
706
			$this->debug[] = "Aucune observation n'a été liée à une image à à la date : $date";
707
		}
708
		$sql = $this->assemblerObsEnConditionSql($observations);
709
		return $sql;
710
	}
711
 
712
	private function obtenirConditionPourDateAjout($date) {
713
		$observations = $this->obtenirObsLieesImg('date.ajout', $date);
714
		if (is_null($observations)) {
715
			$this->debug[] = "Aucune observation n'est liée à une image ajoutée à la date : $date";
716
		}
717
		$sql = $this->assemblerObsEnConditionSql($observations);
718
		return $sql;
719
	}
1003 jpm 720
 
940 jpm 721
	private function obtenirConditionPourCommentaireMeta($commentaire) {
722
		$observations = $this->obtenirObsLieesImg('commentaire.meta', $commentaire);
723
		if (is_null($observations)) {
724
			$this->debug[] = "Aucune observation n'est liée à une image dont le commentaire des méta-données correspond à : $commmentaire";
725
		}
726
		$operateur = '';
727
		$sql = $this->assemblerObsEnConditionSql($observations, $operateur);
728
		return $sql;
729
	}
1003 jpm 730
 
940 jpm 731
	private function obtenirConditionPourCommentaireUtilisateur($commentaire) {
732
		$observations = $this->obtenirObsLieesImg('commentaire.utilisateur', $commentaire);
733
		if (is_null($observations)) {
734
			$this->debug[] = "Aucune observation n'est liée à une image dont le commentaire des utilisateur correspond à : $commmentaire";
735
		}
736
		$operateur = '';
737
		$sql = $this->assemblerObsEnConditionSql($observations, $operateur);
738
		return $sql;
739
	}
1003 jpm 740
 
940 jpm 741
	private function obtenirConditionPourCommentaires($commentaire) {
742
		$observations = $this->obtenirObsLieesImg('commentaire.*', $commentaire);
743
		if (is_null($observations)) {
744
			$this->debug[] = "Aucune observation n'est liée à une image dont un des commentaires correspond à : $commmentaire";
745
		}
746
		$operateur = '';
747
		$sql = $this->assemblerObsEnConditionSql($observations, $operateur);
748
		return $sql;
749
	}
1003 jpm 750
 
940 jpm 751
	/**
752
	 * Récupération des identifiant d'utilisateur et des ordres des observations correspondant à une date.
753
	 * Retour sous forme de tableau : array[identifiant] = array(ordre, ordre...);
754
	 */
755
	private function obtenirObsLieesImg($type, $param) {
3685 delphine 756
	    $transmission = ( $this->standard = 0) ? "transmission = '1' AND " : "";
940 jpm 757
		// Construction de la requête
3587 delphine 758
		$requete = 	'SELECT DISTINCT co.id_obs, co.ce_utilisateur AS utilisateur '.
3685 delphine 759
			'FROM '.$this->table_export.' AS co '.
2449 jpm 760
			'	LEFT JOIN cel_zones_geo AS zg '.
3689 delphine 761
			'		ON (zg.nom = co.zone_geo AND zg.code = co.ce_zone_geo) '.
3685 delphine 762
			"WHERE ".$transmission." co.images != null".
3587 delphine 763
			($type == 'date.creation' ? " AND co.date_creation LIKE $param " : '').
2446 jpm 764
			($type == 'commentaire.obs' ? "	AND co.commentaire LIKE $param " : '').
3587 delphine 765
			($type == 'commentaire.*' ? " AND co.commentaire LIKE $param " : '').
1003 jpm 766
			$this->construireWhereCoordonnees().
940 jpm 767
			$this->construireWhereDept().
768
			$this->construireWhereCommune().
2560 aurelien 769
			$this->construireWherePays().
940 jpm 770
			$this->construireWhereUtilisateur().
771
			$this->construireWhereNumTaxon().
772
			$this->construireWhereNomTaxon().
1497 aurelien 773
			$this->construireWhereReferentiel().
940 jpm 774
			$this->construireWhereProjet().
775
			$this->construireWhereTag().
2681 aurelien 776
			$this->construireWhereGroupeZoneGeo().
3688 delphine 777
			'ORDER BY utilisateur ASC';
940 jpm 778
		//$this->debug[] = $requete;
779
		//die($requete);
2143 jpm 780
		$resultats = Cel::db()->requeter($requete);
1003 jpm 781
 
940 jpm 782
		$observations = null;
783
		if ($resultats != false) {
784
			$observations = array();
785
			foreach ($resultats as $occurence) {
786
				$utilisateur = $occurence['utilisateur'];
3688 delphine 787
				$ordre = $occurence['id_obs'];
940 jpm 788
				if (!array_key_exists($utilisateur, $observations)) {
789
					$observations[$utilisateur] = array();
790
				}
791
				if (!array_key_exists($ordre, $observations[$utilisateur])) {
792
					$observations[$utilisateur][$ordre] = $ordre;
793
				}
794
			}
795
		}
796
		return $observations;
797
	}
1003 jpm 798
 
940 jpm 799
	private function assemblerObsEnConditionSql($observations, $operateur = 'AND') {
800
		$sql = '';
801
		if ($observations != null) {
802
			// Pré-construction du where de la requête
803
			$tpl_where = "(identifiant = '%s' AND ordre IN (%s))";
804
			foreach ($observations as $utilisateur => $ordres) {
805
				$morceaux_requete[] = sprintf($tpl_where, $utilisateur, implode(',', $ordres));
806
			}
807
			if (count($morceaux_requete) > 0) {
808
				$sql = implode(" \nOR ", $morceaux_requete);
809
			}
810
		} else {
811
			// Nous voulons que la requête ne retourne rien
812
			$sql = "identifiant = '' AND ordre = ''";
813
		}
814
		$sql = " $operateur ($sql) ";
815
		return $sql;
816
	}
1003 jpm 817
 
981 jpm 818
	private function construireWhereRectangleStation() {
819
		$sql = '';
1132 aurelien 820
		if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) {
981 jpm 821
			$ne = $this->decomposerLatLng($this->parametres['ne']);
822
			$sw = $this->decomposerLatLng($this->parametres['sw']);
1003 jpm 823
 
981 jpm 824
			$latMin = $sw['lat'];
825
			$lngMin = $sw['lng'];
1003 jpm 826
 
981 jpm 827
			$latMax = $ne['lat'];
828
			$lngMax = $ne['lng'];
1003 jpm 829
 
1339 aurelien 830
			// ATTENTION : latitude correspond bien à la LATITUDE!
831
			$sql = " AND (latitude != 0 AND longitude != 0) ".
832
				" AND latitude > $latMin ".
833
				" AND latitude < $latMax ".
834
				" AND longitude > $lngMin ".
835
				" AND longitude < $lngMax ";
981 jpm 836
		}
837
		return $sql;
838
	}
1003 jpm 839
 
981 jpm 840
	private function construireWhereRectangleStationOR() {
841
		$sql = '';
1132 aurelien 842
		if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) {
981 jpm 843
			$ne = $this->decomposerLatLng($this->parametres['ne']);
844
			$sw = $this->decomposerLatLng($this->parametres['sw']);
1003 jpm 845
 
981 jpm 846
			$latMin = $sw['lat'];
847
			$lngMin = $sw['lng'];
1003 jpm 848
 
981 jpm 849
			$latMax = $ne['lat'];
850
			$lngMax = $ne['lng'];
1003 jpm 851
 
1339 aurelien 852
			$sql = "( (latitude != 0 AND longitude != 0) ".
1466 aurelien 853
				" AND latitude BETWEEN $latMin AND $latMax ".
854
				" AND longitude BETWEEN $lngMin AND $lngMax )";
2143 jpm 855
 
1466 aurelien 856
			/*$sql = " MBRWithin(mon_point, GeomFromText('POLYGON((".$latMin.' '.$lngMin.','.
857
			$latMax.' '.$lngMin.','.
858
			$latMax.' '.$lngMax.','.
859
			$latMax.' '.$lngMin.','.
2143 jpm 860
			$latMin.' '.$lngMin."))')) ";		*/
981 jpm 861
		}
862
		return $sql;
863
	}
1003 jpm 864
 
981 jpm 865
	private function construireWhereRectangleCommune() {
866
		$sql = '';
1132 aurelien 867
		if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) {
981 jpm 868
			$ne = $this->decomposerLatLng($this->parametres['ne']);
869
			$sw = $this->decomposerLatLng($this->parametres['sw']);
1003 jpm 870
 
981 jpm 871
			$latMin = $sw['lat'];
872
			$lngMin = $sw['lng'];
1003 jpm 873
 
981 jpm 874
			$latMax = $ne['lat'];
875
			$lngMax = $ne['lng'];
1003 jpm 876
 
3718 delphine 877
			/*$sql = "AND wgs84_longitude != 0 AND wgs84_latitude != 0 ".
1466 aurelien 878
				" AND wgs84_latitude BETWEEN $latMin AND $latMax ".
3718 delphine 879
				" AND wgs84_longitude BETWEEN $lngMin AND $lngMax ";*/
981 jpm 880
		}
881
		return $sql;
882
	}
1003 jpm 883
 
981 jpm 884
	private function construireWhereRectangleCommuneOR() {
885
		$sql = '';
1132 aurelien 886
		if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) {
981 jpm 887
			$ne = $this->decomposerLatLng($this->parametres['ne']);
888
			$sw = $this->decomposerLatLng($this->parametres['sw']);
1003 jpm 889
 
981 jpm 890
			$latMin = $sw['lat'];
891
			$lngMin = $sw['lng'];
1003 jpm 892
 
981 jpm 893
			$latMax = $ne['lat'];
894
			$lngMax = $ne['lng'];
1003 jpm 895
 
3718 delphine 896
			/*$sql = "( wgs84_longitude != 0 AND wgs84_latitude != 0 ".
1466 aurelien 897
				" AND wgs84_latitude BETWEEN $latMin AND $latMax ".
3718 delphine 898
				" AND wgs84_longitude BETWEEN $lngMin AND $lngMax )";*/
2143 jpm 899
 
1466 aurelien 900
			/*$sql = " MBRWithin(point_commune, GeomFromText('POLYGON((".$latMin.' '.$lngMin.','.
901
			$latMax.' '.$lngMin.','.
902
			$latMax.' '.$lngMax.','.
903
			$latMax.' '.$lngMin.','.
904
			$latMin.' '.$lngMin."))')) ";*/
981 jpm 905
		}
906
		return $sql;
907
	}
1003 jpm 908
 
938 jpm 909
	private function construireWhereDept() {
910
		$sql = '';
911
		// Récupération des coordonnées depuis l'id station
912
		extract($this->parametres);
1339 aurelien 913
		if (isset($dept) && !$this->etreNull($dept)) {
914
			$valeurs_a_proteger = explode(',',trim($dept));
915
			foreach ($valeurs_a_proteger as $valeur) {
3600 delphine 916
				$valeurs_protegees[] = '(dept = '.Cel::db()->quote($valeur).') ';
1339 aurelien 917
			}
918
			$valeurs = implode(' OR ', $valeurs_protegees);
919
			$sql = " AND ($valeurs) ";
938 jpm 920
		}
921
		return $sql;
922
	}
1003 jpm 923
 
938 jpm 924
	private function construireWhereCommune() {
925
		$sql = '';
926
		// Récupération des coordonnées depuis l'id station
927
		extract($this->parametres);
1132 aurelien 928
		if (isset($this->parametres['commune']) && !$this->etreNull($commune)) {
1765 raphael 929
			$commune = Cel::db()->proteger($commune);
2170 mathias 930
			$sql = " AND zone_geo LIKE $commune";
938 jpm 931
		}
2170 mathias 932
		if (isset($this->parametres['zonegeo']) && !$this->etreNull($zonegeo)) {
933
			$zonegeo = Cel::db()->proteger($zonegeo);
934
			$sql = " AND ce_zone_geo = $zonegeo";
935
		}
938 jpm 936
		return $sql;
937
	}
2560 aurelien 938
 
939
	private function construireWherePays() {
940
		$sql = '';
941
		extract($this->parametres);
942
		if (isset($this->parametres['pays']) && !$this->etreNull($pays)) {
943
			$pays = Cel::db()->proteger($pays);
944
			$sql = " AND pays = $pays";
945
		}
946
		return $sql;
947
	}
1003 jpm 948
 
1092 aurelien 949
	private function construireWhereCommuneSansCoordonneesAvecSensibles() {
1043 aurelien 950
		$sql = '';
951
		// Récupération des coordonnées depuis l'id station
952
		extract($this->parametres);
1132 aurelien 953
		if (isset($this->parametres['commune']) && !$this->etreNull($commune)) {
1765 raphael 954
			$commune = Cel::db()->proteger($commune);
2170 mathias 955
			$sql = " AND zone_geo LIKE $commune";
1043 aurelien 956
		}
2170 mathias 957
		if (isset($this->parametres['zonegeo']) && !$this->etreNull($zonegeo)) {
958
			$zonegeo = Cel::db()->proteger($zonegeo);
959
			$sql = " AND ce_zone_geo = $zonegeo";
960
		}
2774 aurelien 961
 
962
		$sql .= " AND ".
963
				"(".
964
					"(".
965
						"(latitude = '000null' OR latitude = '' OR latitude = 0 OR latitude IS NULL) AND ".
966
						"(longitude = '000null' OR longitude = '' OR longitude = 0 OR longitude IS NULL) ".
967
					')'.
3618 delphine 968
					' OR localisation_floutage IN ("localité", "10x10km")'.
2774 aurelien 969
				') ';
1043 aurelien 970
		return $sql;
971
	}
2143 jpm 972
 
973
 
1466 aurelien 974
	private function construireWherePhotosSeulement() {
975
		$sql = '';
976
		if (isset($this->parametres['photos']) && $this->parametres['photos'] == 1) {
3687 delphine 977
			$sql = ' AND co.images is not null ';
1466 aurelien 978
		}
979
		return $sql;
980
	}
1003 jpm 981
 
938 jpm 982
	private function construireWhereUtilisateur() {
983
		$sql = '';
1339 aurelien 984
		// TODO tester si l'on recoit un id, un mail ou bien un nom ou prenom
985
		// pour en faire une fonction polyvalente
938 jpm 986
		extract($this->parametres);
1132 aurelien 987
		if (isset($this->parametres['utilisateur']) && !$this->etreNull($utilisateur)) {
1765 raphael 988
			$utilisateur = Cel::db()->proteger($utilisateur);
3149 mathias 989
			if (is_numeric($this->parametres['utilisateur'])) {
990
				$sql = " AND co.ce_utilisateur = $utilisateur ";
991
			} else {
992
				$sql = " AND co.courriel_utilisateur = $utilisateur ";
993
			}
938 jpm 994
		}
995
		return $sql;
996
	}
2143 jpm 997
 
998
 
938 jpm 999
	private function construireWhereNumTaxon() {
1000
		$sql = '';
1001
		// Récupération des coordonnées depuis l'id station
1002
		extract($this->parametres);
3599 delphine 1003
		if (isset($this->parametres['num_nom_ret']) && !$this->etreNull($num_nom_ret)) {
1004
		$num_nom_ret = Cel::db()->proteger($num_nom_ret);
1005
		$sql = " AND nom_ret_nn = $num_nom_ret ";
1568 aurelien 1006
		}
1007
		return $sql;
1008
	}
2143 jpm 1009
 
1568 aurelien 1010
	private function construireWhereNumTaxonAvecSousTaxons() {
1011
		$sql = '';
1012
		// Récupération des coordonnées depuis l'id station
1013
		extract($this->parametres);
3599 delphine 1014
		if (isset($this->parametres['num_nom_ret']) && !$this->etreNull($num_nom_ret)) {
1015
			$sous_taxons = $this->obtenirSousTaxons($this->parametres['num_nom_ret']);
1016
			$num_nom_retenu = Cel::db()->proteger($num_nom_ret);
1568 aurelien 1017
			if(!empty($sous_taxons)) {
1018
				$sql_in_sous_tax = implode(',', $sous_taxons);
3684 delphine 1019
				$sql = " AND (nom_sel_nn IN (".$num_nom_retenu.', '.$sql_in_sous_tax.") OR ".
1020
								"nom_ret_nn IN (".$num_nom_retenu.', '.$sql_in_sous_tax.") ".
1568 aurelien 1021
							") ";
1022
			}
1023
			else {
3599 delphine 1024
				$sql = " AND nom_ret_nn = $num_nom_ret ";
1568 aurelien 1025
			}
938 jpm 1026
		}
1027
		return $sql;
1028
	}
2143 jpm 1029
 
1568 aurelien 1030
	private function obtenirSousTaxons($nt) {
1031
		$referentiel = 'bdtfx';
2010 mathias 1032
		if(isset($this->parametres['referentiel']) && $this->parametres['referentiel'] != "" && $this->parametres['referentiel'] != '*') {
1568 aurelien 1033
			$referentiel = $this->parametres['referentiel'];
1034
		}
1035
		$nn_sous_taxons = array();
3588 delphine 1036
		$sous_taxons = $this->obtenirSousTaxonsPourNn($referentiel, $nt);
1568 aurelien 1037
		foreach($sous_taxons as $sous_tax) {
1038
			$nn_sous_taxons[] = $sous_tax['num_nom'];
1039
		}
1040
		return $nn_sous_taxons;
1041
	}
1003 jpm 1042
 
1466 aurelien 1043
	private function construireWhereProjet() {
938 jpm 1044
		$sql = '';
1045
		extract($this->parametres);
1339 aurelien 1046
		$projet_sql = isset($projet) ? $this->getSqlWhereProjet($projet) : null;
1047
		if (!$this->etreNull($projet_sql)) {
1048
			$sql = " AND ($projet_sql) ";
938 jpm 1049
		}
1050
		return $sql;
1051
	}
2143 jpm 1052
 
840 jpm 1053
	/**
938 jpm 1054
	 * Traitement de $projet pour construction du filtre dans la requête
2446 jpm 1055
	 *
2282 mathias 1056
	 * projet1 ET projet2 ET projet3 => intersection
1057
	 * projet1 OU projet2 OU projet3 => union
2446 jpm 1058
	 * projet1 ET projet2 OU projet3 => ATTENTION indéfini
478 jpm 1059
	 */
938 jpm 1060
	private function getSqlWhereProjet($projet) {
1061
		$sql = null;
2446 jpm 1062
		if (isset($projet) && !$this->etreNull($projet)) {
2282 mathias 1063
			if (strpos($projet, ' ET ')) {
1064
				// intersection
1065
				$projets = explode(' ET ', $projet);
1066
				$clauses = array();
1067
				foreach ($projets as $proj) {
1068
					if ($proj != '') {
1069
						$clauses[] = 'co.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$proj.'%');
1070
					}
1071
				}
1072
				$sql = implode($clauses, ' AND ');
1073
			} else if (strpos($projet, ' OU ')) {
1074
				// union
1075
				$projets = explode(' OU ', $projet);
1076
				$clauses = array();
1077
				foreach ($projets as $proj) {
1078
					if ($proj != '') {
1079
						$clauses[] = 'co.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$proj.'%');
1080
					}
1081
				}
1082
				$sql = implode($clauses, ' OR ');
1083
			} else {
1084
				// simple
1085
				$sql = 'co.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$projet.'%');
1086
			}
938 jpm 1087
		}
1088
		return $sql;
1089
	}
2143 jpm 1090
 
938 jpm 1091
	private function construireWhereTag() {
1092
		$sql = '';
840 jpm 1093
		extract($this->parametres);
1339 aurelien 1094
		$tag_sql = isset($tag) ? $this->getSqlWhereObsAvecImagesTaguees($tag) : null;
1095
		if (!$this->etreNull($tag_sql)) {
1096
			$sql = " AND ($tag_sql) ";
489 jpm 1097
		}
938 jpm 1098
		return $sql;
1099
	}
2143 jpm 1100
 
1484 aurelien 1101
	private function construireWhereNombreDeJours() {
1102
		$sql = null;
1103
		extract($this->parametres);
1104
		if (isset($nbjours) && !$this->etreNull($nbjours)) {
1765 raphael 1105
			$sql = ' AND DATEDIFF(CURDATE(),co.date_creation) <= '.Cel::db()->proteger($nbjours).' ';
1484 aurelien 1106
		}
1107
		return $sql;
1108
	}
2143 jpm 1109
 
2291 mathias 1110
	private function construireWhereAnnee() {
1111
		$sql = null;
1112
		extract($this->parametres);
1113
		if (isset($annee) && !$this->etreNull($annee)) {
1114
			$sql = ' AND YEAR(co.date_creation) = ' . Cel::db()->proteger($annee) . ' ';
1115
		}
1116
		return $sql;
1117
	}
2681 aurelien 1118
 
1119
	private function construireWhereGroupeZoneGeo() {
1120
		$sql = null;
1121
		extract($this->parametres);
1122
		if (isset($groupe_zones_geo) && !$this->etreNull($groupe_zones_geo)) {
1123
			$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo);
1124
			$res = Cel::db()->requeter($req);
2291 mathias 1125
 
2681 aurelien 1126
			$zones = array();
1127
			foreach($res as &$r) {
1128
				$zones[] = Cel::db()->proteger($r['valeur']);
1129
			}
1130
			$sql = 'AND ce_zone_geo IN ('.implode(',', $zones).') ';
1131
		}
1132
 
1133
		return $sql;
1134
	}
1135
 
938 jpm 1136
	/**
1137
	 * Traitement de $tag pour construction du filtre dans la requête
1138
	 */
1139
	private function getSqlWhereObsAvecImagesTaguees($tag) {
1140
		$sql = null;
3686 delphine 1141
		$transmission = ( $this->standard = 0) ? "co.transmission = '1' " : " 1 ";
1339 aurelien 1142
		if (isset($tag) && !$this->etreNull($tag)) {
938 jpm 1143
			$tag_sql = $this->getSqlWhereMotsCles($tag);
1144
			// Construction de la requête
3616 delphine 1145
			$requete = 	'SELECT DISTINCT co.id_observation AS id_obs, co.ce_utilisateur AS utilisateur '.
1146
						'FROM cel_images_export ci'.
3685 delphine 1147
						'	INNER JOIN '.$this->table_export.' AS co '.
2446 jpm 1148
						'		ON (ci.ce_observation = co.id_observation) '.
2449 jpm 1149
						'	LEFT JOIN cel_zones_geo AS zg '.
3689 delphine 1150
						"		ON (zg.nom = co.zone_geo AND zg.code = co.ce_zone_geo) ".
3688 delphine 1151
						"WHERE ".$transmission.
938 jpm 1152
						$this->construireWhereCoordonnees().
1153
						$this->construireWhereUtilisateur().
1154
						$this->construireWhereNumTaxon().
1155
						$this->construireWhereNomTaxon().
1497 aurelien 1156
						$this->construireWhereReferentiel().
938 jpm 1157
						$this->construireWhereProjet().
1158
						(!$this->etreNull($tag_sql) ? "AND ($tag_sql) " : '').
3688 delphine 1159
						'ORDER BY utilisateur ASC';
938 jpm 1160
			//$this->debug[] = $requete;
1161
			//die($requete);
2143 jpm 1162
			$elements_tag = Cel::db()->requeter($requete);
1163
 
938 jpm 1164
			$requete_tag = array();
1165
			if ($elements_tag != false && count($elements_tag) > 0) {
2143 jpm 1166
 
938 jpm 1167
				$filtres = array();
1168
				foreach ($elements_tag as $occurence) {
1169
					$utilisateur = $occurence['utilisateur'];
1339 aurelien 1170
					$id_obs = $occurence['id_obs'];
938 jpm 1171
					if (!array_key_exists($utilisateur, $filtres)) {
1172
						$filtres[$utilisateur] = array();
1173
					}
1339 aurelien 1174
					if (!array_key_exists($id_obs, $filtres[$utilisateur])) {
1175
						$filtres[$utilisateur][$id_obs] = $id_obs;
938 jpm 1176
					}
1177
				}
2143 jpm 1178
 
938 jpm 1179
				// Pré-construction du where de la requête
1339 aurelien 1180
				$tpl_where = "(id_observation IN (%s))";
1181
				foreach ($filtres as $utilisateur => $id_obs) {
1182
					$requete_tag[] = sprintf($tpl_where, implode(',', $id_obs));
938 jpm 1183
				}
2143 jpm 1184
 
938 jpm 1185
			} else {
1186
				$this->messages[] = "Aucune observation ne possède d'images avec ce mot-clé.";
1187
			}
1188
			if (count($requete_tag) > 0) {
1189
				$sql = implode(" \nOR ", $requete_tag);
1190
			}
489 jpm 1191
		}
938 jpm 1192
		return $sql;
478 jpm 1193
	}
2143 jpm 1194
 
487 jpm 1195
	/**
938 jpm 1196
	 * Traitement de $tag pour construction du filtre dans la requête
487 jpm 1197
	 */
938 jpm 1198
	private function getSqlWhereMotsCles($tag) {
1199
		$sql = null;
940 jpm 1200
		$mots_cles = $this->decomposerParametreTag($tag);
1339 aurelien 1201
		$requete_projet = $this->getSqlWhereMotsClesImages($mots_cles);
1202
		$sql = $requete_projet;
938 jpm 1203
		//$this->debug[] = $sql;
487 jpm 1204
		return $sql;
840 jpm 1205
	}
2143 jpm 1206
 
938 jpm 1207
	/**
1208
	 * Traitement de $tag pour construction du filtre dans la requête
1209
	 */
1210
	private function getSqlWhereMotsClesImages($mots_cles_encodes) {
1211
		$where_mots_cles_images = array();
1339 aurelien 1212
		foreach ($mots_cles_encodes['motsClesEncodesProteges'] as $mot_cle_encode) {
1213
			$where_mots_cles_images[] = "ci.mots_cles_texte LIKE $mot_cle_encode";
938 jpm 1214
		}
1339 aurelien 1215
		$where_mots_cles_images = implode(' '.$mots_cles_encodes['type'].' ', $where_mots_cles_images);
938 jpm 1216
		return $where_mots_cles_images;
1217
	}
2143 jpm 1218
 
940 jpm 1219
	private function decomposerParametreTag($tags) {
2143 jpm 1220
 
938 jpm 1221
		$mots_cles = array('type' => null, 'motsCles' => null, 'motsClesEncodesProteges' => null);
1222
		if (preg_match('/.+OU.+/', $tags)) {
1223
			$mots_cles['type'] = 'OR';
1224
			$mots_cles['motsCles'] = explode('OU', $tags);
1225
		} else if (preg_match('/.+ET.+/', $tags)) {
1226
			$mots_cles['type'] = 'AND';
1227
			$mots_cles['motsCles'] = explode('ET', $tags);
1228
		} else {
1229
			$mots_cles['motsCles'][] = $tags;
1230
		}
2143 jpm 1231
 
938 jpm 1232
		foreach ($mots_cles['motsCles'] as $mot) {
1765 raphael 1233
			$mots_cles['motsClesEncodesProteges'][] = Cel::db()->quote('%'.$mot.'%');
938 jpm 1234
		}
1235
		$this->debug[] = $mots_cles;
1236
		return $mots_cles;
1237
	}
1003 jpm 1238
 
981 jpm 1239
	private function decomposerLatLng($coord) {
1240
		$lat_lng = array();
1241
		if (isset($coord)) {
1242
			list($lat, $lng) = explode('|', $coord);
1243
			$lat_lng = array('lat' => $lat, 'lng' => $lng);
1244
		}
1245
		return $lat_lng;
1246
	}
1003 jpm 1247
 
940 jpm 1248
	private function decomposerParametreStation() {
938 jpm 1249
		$station_infos = array();
1250
		if (isset($this->parametres['station'])) {
1251
			$station = $this->parametres['station'];
1252
			$this->debug[] = $station;
1033 aurelien 1253
			@list($type, $coord) = explode(':', $station);
1254
			@list($lat, $lng) = explode('|', $coord);
1003 jpm 1255
 
954 jpm 1256
			$station_infos = array('type' => $type, 'lat' => $lat, 'lng' => $lng);
938 jpm 1257
		}
1258
		return $station_infos;
1259
	}
1003 jpm 1260
 
940 jpm 1261
	private function decomposerParametreDate() {
1132 aurelien 1262
		$date_infos = array(null,null);
940 jpm 1263
		if (isset($this->parametres['date'])) {
1264
			$date = $this->parametres['date'];
1265
			if (strpos($date, ':')) {
1266
				list($type, $date) = explode(':', $date);
1267
			} else {
1268
				$type = 'observation';
1269
			}
1003 jpm 1270
 
940 jpm 1271
			$date = str_replace('/', '-', $date);
1272
			if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $date, $matches)) {
1273
				$date = $matches[3].'-'.$matches[2].'-'.$matches[1];
1274
			}
1003 jpm 1275
 
940 jpm 1276
			$date_infos = array($type, $date);
1277
		}
1278
		return $date_infos;
1279
	}
1003 jpm 1280
 
940 jpm 1281
	private function decomposerParametreTaxon() {
1132 aurelien 1282
		$nom_infos = array(null,null);
940 jpm 1283
		if (isset($this->parametres['taxon'])) {
1284
			$taxon = $this->parametres['taxon'];
1285
			if (strpos($taxon, ':')) {
1286
				$nom_infos = explode(':', $taxon);
1287
			} else {
1288
				$nom_infos = array('retenu', $taxon);
1289
			}
1290
		}
1291
		return $nom_infos;
1292
	}
1003 jpm 1293
 
940 jpm 1294
	private function decomposerParametreCommentaire() {
1132 aurelien 1295
		$commentaire_infos = array(null,null);
940 jpm 1296
		if (isset($this->parametres['commentaire'])) {
1297
			$commentaire = $this->parametres['commentaire'];
1298
			if (strpos($commentaire, ':')) {
1299
				$commentaire_infos = explode(':', $commentaire);
1300
			} else {
1301
				$commentaire_infos = array('observation', $commentaire);
1302
			}
1303
		}
1304
		return $commentaire_infos;
1305
	}
1172 aurelien 1306
}
3149 mathias 1307
?>