Subversion Repositories eFlore/Applications.del

Rev

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

Rev 2067 Rev 2077
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Web service récupèrant toutes les observations et, pour chacune d'elle, les images qui lui sont associées.
4
 * Web service récupèrant toutes les observations et, pour chacune d'elle, les images qui lui sont associées.
5
 *
5
 *
6
 * ATTENTION : le web service commence par récupérer seulement les id des obs (1er requete SQL), puis dans une
6
 * ATTENTION : le web service commence par récupérer seulement les id des obs (1er requete SQL), puis dans une
7
 * deuxième requête SQL récupère les informations complémentaires. Il s'avère qu'en procédant ainsi le web service
7
 * deuxième requête SQL récupère les informations complémentaires. Il s'avère qu'en procédant ainsi le web service
8
 * est 3 fois plus rapide !
8
 * est 3 fois plus rapide !
9
 *
9
 *
10
 * @category   DEL
10
 * @category   DEL
11
 * @package    Services
11
 * @package    Services
12
 * @subpackage Observations
12
 * @subpackage Observations
13
 * @version    0.1
13
 * @version    0.1
14
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
14
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
15
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
15
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
16
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
16
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
17
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
17
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
18
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
18
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
19
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
19
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
20
 */
20
 */
21
class ListeObservations {
21
class ListeObservations {
22
 
22
 
23
	private $conteneur;
23
	private $conteneur;
24
	private $bdd;
24
	private $bdd;
25
	private $navigation;
25
	private $navigation;
26
	private $filtrage;
26
	private $filtrage;
27
	private $sql;
27
	private $sql;
28
 
28
 
29
	private $mappings = array();
29
	private $mappings = array();
30
	private $paramsFiltres = array();
30
	private $paramsFiltres = array();
31
 
31
 
32
	private $idsObsOrdonnees = array();
32
	private $idsObsOrdonnees = array();
33
	private $infosObs = array();
33
	private $infosObs = array();
34
	private $infosObsOrdonnee = array();
34
	private $infosObsOrdonnee = array();
35
	
35
	
36
	private $evenementsObs = array();
36
	private $evenementsObs = array();
37
 
37
 
38
 
38
 
39
	public function __construct(Conteneur $conteneur) {
39
	public function __construct(Conteneur $conteneur) {
40
		$this->conteneur = $conteneur;
40
		$this->conteneur = $conteneur;
41
		$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
41
		$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
42
 
42
 
43
		$this->bdd = $this->conteneur->getBdd();
43
		$this->bdd = $this->conteneur->getBdd();
44
		$this->filtrage = $this->conteneur->getParametresFiltrage();
44
		$this->filtrage = $this->conteneur->getParametresFiltrage();
45
		$this->sql = $this->conteneur->getSql();
45
		$this->sql = $this->conteneur->getSql();
46
		$this->navigation = $this->conteneur->getNavigation();
46
		$this->navigation = $this->conteneur->getNavigation();
47
 
47
 
48
		$this->mappings['votes'] = $this->conteneur->getParametreTableau('votes.mapping');
48
		$this->mappings['votes'] = $this->conteneur->getParametreTableau('votes.mapping');
49
		$this->mappings['commentaires'] = $this->conteneur->getParametreTableau('commentaires.mapping');
49
		$this->mappings['commentaires'] = $this->conteneur->getParametreTableau('commentaires.mapping');
50
	}
50
	}
51
 
51
 
52
	public function consulter($ressources, $parametres) {
52
	public function consulter($ressources, $parametres) {
53
		$this->paramsFiltres = $this->filtrage->filtrerUrlParamsAppliObs();
53
		$this->paramsFiltres = $this->filtrage->filtrerUrlParamsAppliObs();
54
		$this->sql->setAppli(Sql::APPLI_OBS);
54
		$this->sql->setAppli(Sql::APPLI_OBS);
55
		$this->sql->setParametres($this->paramsFiltres);
55
		$this->sql->setParametres($this->paramsFiltres);
56
		$this->sql->ajouterContraintes();
56
		$this->sql->ajouterContraintes();
57
		$this->sql->ajouterConstrainteAppliObs();
57
		$this->sql->ajouterConstrainteAppliObs();
58
		$this->sql->definirOrdreSqlAppliObs();
58
		$this->sql->definirOrdreSqlAppliObs();
59
 
59
 
60
		$this->idsObsOrdonnees = $this->getIdObs();
60
		$this->idsObsOrdonnees = $this->getIdObs();
61
		$this->navigation->setTotal($this->sql->getTotalLignesTrouvees());
61
		$this->navigation->setTotal($this->sql->getTotalLignesTrouvees());
62
 
62
 
63
		// Ce n'est pas la peine de continuer s'il n'y a pas eu de résultats
63
		// Ce n'est pas la peine de continuer s'il n'y a pas eu de résultats
64
		$resultat = new ResultatService();
64
		$resultat = new ResultatService();
65
		$resultat->corps = array('entete' => $this->navigation->getEntete(), 'resultats' => array());
65
		$resultat->corps = array('entete' => $this->navigation->getEntete(), 'resultats' => array());
66
		if (count($this->idsObsOrdonnees) > 0) {
66
		if (count($this->idsObsOrdonnees) > 0) {
67
 
67
 
68
			// 2) récupération des données nécessaires pour ces observations (obs + images)
68
			// 2) récupération des données nécessaires pour ces observations (obs + images)
69
			$this->infosObs = $this->getInfosObs();
69
			$this->infosObs = $this->getInfosObs();
70
			// 3) suppression, merge des données en tableau assez représentatif du futur JSON en output
70
			// 3) suppression, merge des données en tableau assez représentatif du futur JSON en output
71
			$this->infosObsOrdonnees = $this->formaterObservations();
71
			$this->infosObsOrdonnees = $this->formaterObservations();
72
			// 4) Ajouter commentaires + votes à $this->infosObsOrdonnees
72
			// 4) Ajouter commentaires + votes à $this->infosObsOrdonnees
73
			$this->chargerDeterminations();
73
			$this->chargerDeterminations();
74
 
74
 
75
			$resultat->corps = array(
75
			$resultat->corps = array(
76
				'entete' => $this->navigation->getEntete(),	
76
				'entete' => $this->navigation->getEntete(),	
77
				// 5) Applatissage du tableau afin de garder l'ordre de tri
77
				// 5) Applatissage du tableau afin de garder l'ordre de tri
78
				// (qui n'est pas garanti dans un objet json)
78
				// (qui n'est pas garanti dans un objet json)
79
				'resultats' => array_values($this->infosObsOrdonnees));
79
				'resultats' => array_values($this->infosObsOrdonnees));
80
		}
80
		}
81
		return $resultat;
81
		return $resultat;
82
	}
82
	}
83
 
83
 
84
	// SQL helpers
84
	// SQL helpers
85
	/*
85
	/*
86
	 * Retourne une liste ordonnée d'id d'observation correspondant aux critères
86
	 * Retourne une liste ordonnée d'id d'observation correspondant aux critères
87
	 * passés dans p et aux clauses where/join présentes dans le tableau $req
87
	 * passés dans p et aux clauses where/join présentes dans le tableau $req
88
	 *
88
	 *
89
	 * @param p: $params (filtrés sauf escape-string)
89
	 * @param p: $params (filtrés sauf escape-string)
90
	 * @param req: le tableau représentant les composants de la requete SQL
90
	 * @param req: le tableau représentant les composants de la requete SQL
91
	 * @param db: l'instance de db
91
	 * @param db: l'instance de db
92
	 */
92
	 */
93
	private function getIdObs() {
93
	private function getIdObs() {
94
		
94
		
95
		$requete = $this->renvoyerRequeteSelonType();
95
		$requete = $this->renvoyerRequeteSelonType();
96
		
96
		
97
		//Debug::printr($requete);
97
		//Debug::printr($requete);
98
		$resultats = $this->bdd->recupererTous($requete);
98
		$resultats = $this->bdd->recupererTous($requete);
99
 
99
 
100
		$idObs = array();
100
		$idObs = array();
101
		if ($resultats !== false ) {
101
		if ($resultats !== false ) {
102
			foreach ($resultats as $resultat) {
102
			foreach ($resultats as $resultat) {
103
				$idObs[] = $resultat['id_observation'];
103
				$idObs[] = $resultat['id_observation'];
104
			}
104
			}
105
		}
105
		}
106
		return $idObs;
106
		return $idObs;
107
	}
107
	}
108
	
108
	
109
	private function renvoyerRequeteSelonType() {
109
	private function renvoyerRequeteSelonType() {
110
		//TODO: interdire l'appel si l'on est pas connecté ?
-
 
111
		if($this->monActiviteEstDemandee()) {
110
		if($this->monActiviteEstDemandee()) {
112
			$gestion_utilisateur = new GestionUtilisateur($this->conteneur);
111
			$gestion_utilisateur = new GestionUtilisateur($this->conteneur);
113
			$utilisateur = $gestion_utilisateur->getUtilisateurIdentifie();
112
			$utilisateur = $gestion_utilisateur->getUtilisateur();
-
 
113
			if ($utilisateur['connecte'] === true) {
114
			$id_utilisateur = $utilisateur['id_utilisateur'];
114
				$id_utilisateur = $utilisateur['id_utilisateur'];
115
		
-
 
116
			$requete = $this->sql->getRequeteIdObsMonactiviteTout($id_utilisateur, $this->sql->getLimit()).' -- '.__FILE__.':'.__LINE__;
115
				$requete = $this->sql->getRequeteIdObsMonactiviteTout($id_utilisateur, $this->sql->getLimit()).' -- '.__FILE__.':'.__LINE__;
117
		
-
 
118
			// Enregistrement de la date de consultation pour ne pas réafficher des évènements déjà consultés
116
				// Enregistrement de la date de consultation pour ne pas réafficher des événements déjà consultés
119
			$gestion_utilisateur->setDerniereDateConsultationEvenements($id_utilisateur, date('Y-m-d H:i:s'));	
117
				$gestion_utilisateur->setDerniereDateConsultationEvenements($id_utilisateur, date('Y-m-d H:i:s'));
-
 
118
			} else {
-
 
119
				//TODO: que faire si l'on n'est pas connecté ?
-
 
120
			}
120
		} else {
121
		} else {
121
			$requete = 'SELECT SQL_CALC_FOUND_ROWS id_observation '.
122
			$requete = 'SELECT SQL_CALC_FOUND_ROWS id_observation '.
122
					'FROM del_observation AS do '.
123
					'FROM del_observation AS do '.
123
					$this->sql->getJoin().
124
					$this->sql->getJoin().
124
					'WHERE '.$this->sql->getWhere().
125
					'WHERE '.$this->sql->getWhere().
125
					$this->sql->getGroupBy().
126
					$this->sql->getGroupBy().
126
					$this->sql->getOrderBy().
127
					$this->sql->getOrderBy().
127
					$this->sql->getLimit().
128
					$this->sql->getLimit().
128
					' -- '.__FILE__.':'.__LINE__;
129
					' -- '.__FILE__.':'.__LINE__;
129
		}
130
		}
130
		
131
		
131
		return $requete;
132
		return $requete;
132
	}
133
	}
133
	
134
	
134
	private function monActiviteEstDemandee() {
135
	private function monActiviteEstDemandee() {
135
		return isset($this->paramsFiltres['masque.type']) && in_array('monactivite',array_keys($this->paramsFiltres['masque.type']));
136
		return isset($this->paramsFiltres['masque.type']) && in_array('monactivite',array_keys($this->paramsFiltres['masque.type']));
136
	}
137
	}
137
 
138
 
138
	/**
139
	/**
139
	 * Après avoir récupérer seulement les ids dans une première requête, nous récupérons maintenant les infos.
140
	 * Après avoir récupérer seulement les ids dans une première requête, nous récupérons maintenant les infos.
140
	 * Le web service est ainsi 3 fois plus rapide.
141
	 * Le web service est ainsi 3 fois plus rapide.
141
	 */
142
	 */
142
	private function getInfosObs() {
143
	private function getInfosObs() {
143
		$idsObsConcat = implode(',', $this->idsObsOrdonnees);
144
		$idsObsConcat = implode(',', $this->idsObsOrdonnees);
144
		$requete = "SELECT id_observation, nom_sel AS `determination.ns`, nt AS `determination.nt`, ".
145
		$requete = "SELECT id_observation, nom_sel AS `determination.ns`, nt AS `determination.nt`, ".
145
			'nom_sel_nn AS `determination.nn`, famille AS `determination.famille`, '.
146
			'nom_sel_nn AS `determination.nn`, famille AS `determination.famille`, '.
146
			'nom_referentiel AS `determination.referentiel`, ce_zone_geo AS id_zone_geo, pays, '.
147
			'nom_referentiel AS `determination.referentiel`, ce_zone_geo AS id_zone_geo, pays, '.
147
			'zone_geo, lieudit, station, milieu, date_observation, do.mots_cles_texte, '.
148
			'zone_geo, lieudit, station, milieu, date_observation, do.mots_cles_texte, '.
148
			'do.date_transmission, do.commentaire, '.
149
			'do.date_transmission, do.commentaire, '.
149
			'do.ce_utilisateur AS `auteur.id`, do.prenom_utilisateur AS `auteur.prenom`, '.
150
			'do.ce_utilisateur AS `auteur.id`, do.prenom_utilisateur AS `auteur.prenom`, '.
150
			'do.nom_utilisateur AS `auteur.nom`, do.courriel_utilisateur AS `auteur.courriel`, '.
151
			'do.nom_utilisateur AS `auteur.nom`, do.courriel_utilisateur AS `auteur.courriel`, '.
151
			'id_image, date_prise_de_vue AS `date`, hauteur, largeur, nom_original '.
152
			'id_image, date_prise_de_vue AS `date`, hauteur, largeur, nom_original '.
152
			'FROM del_observation AS do '.
153
			'FROM del_observation AS do '.
153
			'	LEFT JOIN del_image AS di ON (do.id_observation = di.ce_observation) '.
154
			'	LEFT JOIN del_image AS di ON (do.id_observation = di.ce_observation) '.
154
			"WHERE id_observation IN ($idsObsConcat) ".
155
			"WHERE id_observation IN ($idsObsConcat) ".
155
			' -- '.__FILE__.':'.__LINE__;
156
			' -- '.__FILE__.':'.__LINE__;
156
		
157
		
157
		if ($this->monActiviteEstDemandee()) {
158
		if ($this->monActiviteEstDemandee()) {
158
			$this->stockerEvenementsObs($idsObsConcat);
159
			$this->stockerEvenementsObs($idsObsConcat);
159
		}		
160
		}		
160
		
161
		
161
		//Debug::printr($requete);
162
		//Debug::printr($requete);
162
		return $this->bdd->recupererTous($requete);
163
		return $this->bdd->recupererTous($requete);
163
	}
164
	}
164
	
165
	
165
	private function stockerEvenementsObs($idsObsConcat) {
-
 
166
					
166
	private function stockerEvenementsObs($idsObsConcat) {
167
			$gestion_utilisateur = new GestionUtilisateur($this->conteneur);
167
			$gestion_utilisateur = new GestionUtilisateur($this->conteneur);
168
			$utilisateur = $gestion_utilisateur->getUtilisateurIdentifie();
168
			$utilisateur = $gestion_utilisateur->getUtilisateur();
169
			$id_utilisateur = $utilisateur['id_utilisateur'];
169
			$id_utilisateur = $utilisateur['id_utilisateur'];
170
			
170
			
171
			$evenements = $this->sql->getEvenementsObs($idsObsConcat, $id_utilisateur);			
171
			$evenements = $this->sql->getEvenementsObs($idsObsConcat, $id_utilisateur);			
172
			$this->evenements_obs = array();
172
			$this->evenements_obs = array();
173
			
173
			
174
			foreach($evenements as &$evenement) {
174
			foreach($evenements as &$evenement) {
175
				$this->affecterTypeEvenement($evenement, $id_utilisateur, $evenement['id_observation']);
175
				$this->affecterTypeEvenement($evenement, $id_utilisateur, $evenement['id_observation']);
176
			}
176
			}
177
	}
177
	}
178
 
178
 
179
	private function affecterTypeEvenement(&$evenement, $id_utilisateur, $id_observation) {
179
	private function affecterTypeEvenement(&$evenement, $id_utilisateur, $id_observation) {
180
 
180
 
181
		$type = "";
181
		$type = "";
182
		$infos = "";
182
		$infos = "";
183
		
183
		
184
		// La date maximale détermine le type d'évènement
184
		// La date maximale détermine le type d'évènement
185
		switch($evenement['date_max']) {
185
		switch($evenement['date_max']) {
186
			// Quelqu'un a fait un nouveau commentaire ou proposition
186
			// Quelqu'un a fait un nouveau commentaire ou proposition
187
			case $evenement['date_com']:
187
			case $evenement['date_com']:
188
				if(!empty($evenement['nom_sel_com'])) {
188
				if(!empty($evenement['nom_sel_com'])) {
189
					$type = 'nouvelle_proposition';
189
					$type = 'nouvelle_proposition';
190
					$infos = $evenement['proposition_commentaire_nom_sel'];
190
					$infos = $evenement['proposition_commentaire_nom_sel'];
191
				} else {
191
				} else {
192
					$type = 'nouveau_commentaire';
192
					$type = 'nouveau_commentaire';
193
					$infos = $evenement['proposition_commentaire_texte'];
193
					$infos = $evenement['proposition_commentaire_texte'];
194
				}
194
				}
195
				
195
				
196
				// J'ai commenté ou fait une proposition
196
				// J'ai commenté ou fait une proposition
197
				if($evenement['utilisateur_commentaire'] == $id_utilisateur) {
197
				if($evenement['utilisateur_commentaire'] == $id_utilisateur) {
198
					$type .= "_vous_a_obs_autre";
198
					$type .= "_vous_a_obs_autre";
199
				} else {
199
				} else {
200
					$type .= "_autre_sur_obs_vous";
200
					$type .= "_autre_sur_obs_vous";
201
				}
201
				}
202
				break;
202
				break;
203
 
203
 
204
			// Quelqu'un a répondu à un de mes commentaires ou une de mes propositions
204
			// Quelqu'un a répondu à un de mes commentaires ou une de mes propositions
205
			case $evenement['date_com_reponse']:
205
			case $evenement['date_com_reponse']:
206
					if(!empty($evenement['nom_sel_com_parent'])) {
206
					if(!empty($evenement['nom_sel_com_parent'])) {
207
						$type = 'nouvelle_reponse_autre_sur_proposition_vous';
207
						$type = 'nouvelle_reponse_autre_sur_proposition_vous';
208
					} else {
208
					} else {
209
						$type = 'nouvelle_reponse_autre_sur_commentaire_vous';
209
						$type = 'nouvelle_reponse_autre_sur_commentaire_vous';
210
					}
210
					}
211
					$infos = $evenement['proposition_commentaire_texte_commente'];
211
					$infos = $evenement['proposition_commentaire_texte_commente'];
212
				break;
212
				break;
213
				// Quelqu'un a fait un nouveau vote
213
				// Quelqu'un a fait un nouveau vote
214
			case $evenement['date_vote']:
214
			case $evenement['date_vote']:
215
				$type = 'nouveau_vote';
215
				$type = 'nouveau_vote';
216
				// Sur une proposition qui n'est pas à moi sur une observation à moi
216
				// Sur une proposition qui n'est pas à moi sur une observation à moi
217
				if($evenement['utilisateur_commentaire_vote'] != $evenement['utilisateur_observation'] && $evenement['utilisateur_commentaire_vote'] != $id_utilisateur) {
217
				if($evenement['utilisateur_commentaire_vote'] != $evenement['utilisateur_observation'] && $evenement['utilisateur_commentaire_vote'] != $id_utilisateur) {
218
					$type .= "_autre_sur_com_autre_obs_vous";
218
					$type .= "_autre_sur_com_autre_obs_vous";
219
				} else {
219
				} else {
220
					// Sur une proposition qui est à moi sur une observation (à moi ou non)
220
					// Sur une proposition qui est à moi sur une observation (à moi ou non)
221
					$type .= "_autre_sur_com_vous";
221
					$type .= "_autre_sur_com_vous";
222
				}	
222
				}	
223
				$infos = $evenement['proposition_commentaire_nom_sel_votee'];	
223
				$infos = $evenement['proposition_commentaire_nom_sel_votee'];	
224
				break;
224
				break;
225
		
225
		
226
				// Quelqu'un a validé une proposition
226
				// Quelqu'un a validé une proposition
227
			case $evenement['date_validation']:
227
			case $evenement['date_validation']:
228
				$type = "nouvelle_validation_autre_sur_prop_vous";
228
				$type = "nouvelle_validation_autre_sur_prop_vous";
229
				$infos = $evenement['proposition_validee_nom_sel'];
229
				$infos = $evenement['proposition_validee_nom_sel'];
230
				// $type = "nouvelle_validation_vous_a_prop_autre";
230
				// $type = "nouvelle_validation_vous_a_prop_autre";
231
				break;
231
				break;
232
				// Cas qui ne devrait jamais arriver
232
				// Cas qui ne devrait jamais arriver
233
			default:
233
			default:
234
				$type = 'inconnu';
234
				$type = 'inconnu';
235
				$infos = "";
235
				$infos = "";
236
		}
236
		}
237
		
237
		
238
		$infos_evts = array('type' => $type, 'infos_complementaires' => $infos);
238
		$infos_evts = array('type' => $type, 'infos_complementaires' => $infos);
239
		// La requête est un peu trop complexe et certains évènements sortent en doublons
239
		// La requête est un peu trop complexe et certains évènements sortent en doublons
240
		// donc on dédoublonne ici (mais ça n'est pas une solution pérenne)
240
		// donc on dédoublonne ici (mais ça n'est pas une solution pérenne)
241
		// TODO: optimiser et simplifier ceci
241
		// TODO: optimiser et simplifier ceci
242
		if(empty($this->evenementsObs[$id_observation])) {
242
		if(empty($this->evenementsObs[$id_observation])) {
243
			$this->evenementsObs[$id_observation] = array();
243
			$this->evenementsObs[$id_observation] = array();
244
		}
244
		}
245
		if(array_search($infos_evts, $this->evenementsObs[$id_observation]) === false) {
245
		if(array_search($infos_evts, $this->evenementsObs[$id_observation]) === false) {
246
			$this->evenementsObs[$id_observation][] = $infos_evts;
246
			$this->evenementsObs[$id_observation][] = $infos_evts;
247
		}
247
		}
248
	}
248
	}
249
 
249
 
250
	/**
250
	/**
251
	 * Les informations étant extraites d'une vue dont les infos des obs sont dupliquées pour chaque image,
251
	 * Les informations étant extraites d'une vue dont les infos des obs sont dupliquées pour chaque image,
252
	 * il nous faut maintenant récupérer qu'une seule fois les données d'observations et y intégrer les données
252
	 * il nous faut maintenant récupérer qu'une seule fois les données d'observations et y intégrer les données
253
	 * des images.
253
	 * des images.
254
	 */
254
	 */
255
	private function formaterObservations() {
255
	private function formaterObservations() {
256
		$observations = array_map('array_filter', $this->infosObs);
256
		$observations = array_map('array_filter', $this->infosObs);
257
		$obsFormatees = array_flip($this->idsObsOrdonnees);// Permet de garder l'ordre de sortie !
257
		$obsFormatees = array_flip($this->idsObsOrdonnees);// Permet de garder l'ordre de sortie !
258
		foreach ($observations as &$obs) {
258
		foreach ($observations as &$obs) {
259
			$this->nettoyerAuteur($obs);
259
			$this->nettoyerAuteur($obs);
260
 
260
 
261
			$id = $obs['id_observation'];
261
			$id = $obs['id_observation'];
262
			// ATTENTION : la requête retourne de nombreuses lignes avec les mêmes données (test de l'existence nécessaire)
262
			// ATTENTION : la requête retourne de nombreuses lignes avec les mêmes données (test de l'existence nécessaire)
263
			if (is_array($obsFormatees[$id]) === false) {
263
			if (is_array($obsFormatees[$id]) === false) {
264
				$obsFormatees[$id] = $obs;
264
				$obsFormatees[$id] = $obs;
265
			}
265
			}
266
			$obsFormatees[$id]['images'][] = $this->extraireInfosImage($obs);
266
			$obsFormatees[$id]['images'][] = $this->extraireInfosImage($obs);
267
			
267
			
268
			if(isset($this->evenementsObs[$id])) {
268
			if(isset($this->evenementsObs[$id])) {
269
				$obsFormatees[$id]['evenements'] = $this->evenementsObs[$id];
269
				$obsFormatees[$id]['evenements'] = $this->evenementsObs[$id];
270
			}
270
			}
271
		}
271
		}
272
		return $obsFormatees;
272
		return $obsFormatees;
273
	}
273
	}
274
 
274
 
275
	private function nettoyerAuteur(&$obs) {
275
	private function nettoyerAuteur(&$obs) {
276
		// car auteur.id peut être un email, un hash, ou un annuaire_tela.U_ID
276
		// car auteur.id peut être un email, un hash, ou un annuaire_tela.U_ID
277
		// mais dans les deux premiers cas SELECT courriel AS observateur fait déjà l'affaire
277
		// mais dans les deux premiers cas SELECT courriel AS observateur fait déjà l'affaire
278
		if (!isset($obs['auteur.id']) || !is_numeric($obs['auteur.id'])) {
278
		if (!isset($obs['auteur.id']) || !is_numeric($obs['auteur.id'])) {
279
			$obs['auteur.id'] = "0";
279
			$obs['auteur.id'] = "0";
280
		}
280
		}
281
		if (!isset($obs['auteur.nom'])) {
281
		if (!isset($obs['auteur.nom'])) {
282
			$obs['auteur.nom'] = '[inconnu]';
282
			$obs['auteur.nom'] = '[inconnu]';
283
		}
283
		}
284
	}
284
	}
285
 
285
 
286
	private function extraireInfosImage(&$obs) {
286
	private function extraireInfosImage(&$obs) {
287
		$champsImageAffichables = array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original');
287
		$champsImageAffichables = array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original');
288
		$image = array_intersect_key($obs, array_flip($champsImageAffichables));
288
		$image = array_intersect_key($obs, array_flip($champsImageAffichables));
289
		$urlImgTpl = $this->conteneur->getParametre('cel_img_url_tpl');
289
		$urlImgTpl = $this->conteneur->getParametre('cel_img_url_tpl');
290
		$image['binaire.href'] = sprintf($urlImgTpl, $image['id_image'], 'XL');
290
		$image['binaire.href'] = sprintf($urlImgTpl, $image['id_image'], 'XL');
291
 
291
 
292
		unset($obs['id_image'], $obs['date'], $obs['hauteur'], $obs['largeur'], $obs['nom_original']);
292
		unset($obs['id_image'], $obs['date'], $obs['hauteur'], $obs['largeur'], $obs['nom_original']);
293
		return $image;
293
		return $image;
294
	}
294
	}
295
 
295
 
296
	/**
296
	/**
297
	 * Récupérer toutes les déterminations et le nombre de commentaire au total
297
	 * Récupérer toutes les déterminations et le nombre de commentaire au total
298
	 * @param array $observations la liste des observations à mettre à jour
298
	 * @param array $observations la liste des observations à mettre à jour
299
	 */
299
	 */
300
	private function chargerDeterminations() {
300
	private function chargerDeterminations() {
301
		$idObsConcat = implode(',', $this->idsObsOrdonnees);
301
		$idObsConcat = implode(',', $this->idsObsOrdonnees);
302
		$requete = 'SELECT * '.
302
		$requete = 'SELECT * '.
303
			'FROM del_commentaire AS dc '.
303
			'FROM del_commentaire AS dc '.
304
			'WHERE dc.nom_sel IS NOT NULL '.
304
			'WHERE dc.nom_sel IS NOT NULL '.
305
			"AND ce_observation IN ($idObsConcat) ".
305
			"AND ce_observation IN ($idObsConcat) ".
306
			'-- '.__FILE__.':'.__LINE__;
306
			'-- '.__FILE__.':'.__LINE__;
307
		
307
		
308
		$commentaires = $this->chargerNombreCommentaireObs();
308
		$commentaires = $this->chargerNombreCommentaireObs();
309
 
309
 
310
		$propositions = $this->bdd->recupererTous($requete);
310
		$propositions = $this->bdd->recupererTous($requete);
311
		if ($propositions) {
311
		if ($propositions) {
312
			foreach ($propositions as $proposition) {
312
			foreach ($propositions as $proposition) {
313
				$idObs = $proposition['ce_observation'];
313
				$idObs = $proposition['ce_observation'];
314
				$idComment = $proposition['id_commentaire'];
314
				$idComment = $proposition['id_commentaire'];
315
				$comment = $this->formaterDetermination($idComment, $proposition);
315
				$comment = $this->formaterDetermination($idComment, $proposition);
316
				if ($comment) {
316
				if ($comment) {
317
					$this->infosObsOrdonnees[$idObs]['commentaires'][$idComment] = $comment;
317
					$this->infosObsOrdonnees[$idObs]['commentaires'][$idComment] = $comment;
318
				}
318
				}
319
				$this->infosObsOrdonnees[$idObs]['nb_commentaires'] = isset($commentaires[$idObs]) ? $commentaires[$idObs] : 0;
319
				$this->infosObsOrdonnees[$idObs]['nb_commentaires'] = isset($commentaires[$idObs]) ? $commentaires[$idObs] : 0;
320
			}
320
			}
321
		}
321
		}
322
	}
322
	}
323
 
323
 
324
	private function formaterDetermination($propositionId, $propositionInfos) {
324
	private function formaterDetermination($propositionId, $propositionInfos) {
325
		if (!$propositionInfos) return NULL;
325
		if (!$propositionInfos) return NULL;
326
 
326
 
327
		$propositionFormatee = array();
327
		$propositionFormatee = array();
328
		foreach ($this->mappings['commentaires'] as $nomChamp => $nomAttributJson) {
328
		foreach ($this->mappings['commentaires'] as $nomChamp => $nomAttributJson) {
329
			if (isset($propositionInfos[$nomChamp])) {
329
			if (isset($propositionInfos[$nomChamp])) {
330
				$propositionFormatee[$nomAttributJson] = $propositionInfos[$nomChamp];
330
				$propositionFormatee[$nomAttributJson] = $propositionInfos[$nomChamp];
331
			}
331
			}
332
		}
332
		}
333
 
333
 
334
		// Charger les votes sur les déterminations
334
		// Charger les votes sur les déterminations
335
		$requete = "SELECT * FROM del_commentaire_vote WHERE ce_proposition = $propositionId".
335
		$requete = "SELECT * FROM del_commentaire_vote WHERE ce_proposition = $propositionId".
336
			'-- '.__FILE__.':'.__LINE__;
336
			'-- '.__FILE__.':'.__LINE__;
337
		$resultatsVotes = $this->bdd->recupererTous($requete);
337
		$resultatsVotes = $this->bdd->recupererTous($requete);
338
		foreach ($resultatsVotes as $vote) {
338
		foreach ($resultatsVotes as $vote) {
339
			$propositionFormatee['votes'][$vote['id_vote']] = $this->formaterVote($vote);
339
			$propositionFormatee['votes'][$vote['id_vote']] = $this->formaterVote($vote);
340
		}
340
		}
341
 
341
 
342
		$propositionFormatee['nb_commentaires'] = $this->chargerNombreCommentaire($propositionId);
342
		$propositionFormatee['nb_commentaires'] = $this->chargerNombreCommentaire($propositionId);
343
 
343
 
344
		return $propositionFormatee;
344
		return $propositionFormatee;
345
	}
345
	}
346
 
346
 
347
	/**
347
	/**
348
	 * Formater un vote en fonction du fichier de configuration config_votes.ini
348
	 * Formater un vote en fonction du fichier de configuration config_votes.ini
349
	 * @param $votes array()
349
	 * @param $votes array()
350
	 */
350
	 */
351
	private function formaterVote($vote) {
351
	private function formaterVote($vote) {
352
		$voteFormate = array();
352
		$voteFormate = array();
353
		foreach ($vote as $nomChamp => $valeur) {
353
		foreach ($vote as $nomChamp => $valeur) {
354
			$voteFormate[$this->mappings['votes'][$nomChamp]] = $valeur;
354
			$voteFormate[$this->mappings['votes'][$nomChamp]] = $valeur;
355
		}
355
		}
356
		return $voteFormate;
356
		return $voteFormate;
357
	}
357
	}
358
	
358
	
359
	private function chargerNombreCommentaireObs() {
359
	private function chargerNombreCommentaireObs() {
360
		$idObsConcat = implode(',', $this->idsObsOrdonnees);	
360
		$idObsConcat = implode(',', $this->idsObsOrdonnees);	
361
		$requete = 'SELECT ce_observation, COUNT( id_commentaire ) AS nb '.
361
		$requete = 'SELECT ce_observation, COUNT( id_commentaire ) AS nb '.
362
				'FROM del_commentaire '.
362
				'FROM del_commentaire '.
363
				"WHERE ce_observation IN ($idObsConcat) ".
363
				"WHERE ce_observation IN ($idObsConcat) ".
364
				'GROUP BY ce_observation '.
364
				'GROUP BY ce_observation '.
365
				'-- '.__FILE__.':'.__LINE__;
365
				'-- '.__FILE__.':'.__LINE__;
366
		$commentaires = $this->bdd->recupererTous($requete);
366
		$commentaires = $this->bdd->recupererTous($requete);
367
		
367
		
368
		$commentaires_par_obs = array();
368
		$commentaires_par_obs = array();
369
		foreach($commentaires as $commentaire) {
369
		foreach($commentaires as $commentaire) {
370
			$commentaires_par_obs[$commentaire['ce_observation']] = $commentaire['nb'];
370
			$commentaires_par_obs[$commentaire['ce_observation']] = $commentaire['nb'];
371
		}
371
		}
372
		
372
		
373
		return $commentaires_par_obs;
373
		return $commentaires_par_obs;
374
	}
374
	}
375
 
375
 
376
	private function chargerNombreCommentaire($propositionId) {
376
	private function chargerNombreCommentaire($propositionId) {
377
		$requete = 'SELECT COUNT( id_commentaire ) AS nb '.
377
		$requete = 'SELECT COUNT( id_commentaire ) AS nb '.
378
			'FROM del_commentaire '.
378
			'FROM del_commentaire '.
379
			"WHERE ce_proposition = $propositionId ".
379
			"WHERE ce_proposition = $propositionId ".
380
			'GROUP BY ce_proposition '.
380
			'GROUP BY ce_proposition '.
381
			'-- '.__FILE__.':'.__LINE__;
381
			'-- '.__FILE__.':'.__LINE__;
382
		$commentaires = $this->bdd->recuperer($requete);
382
		$commentaires = $this->bdd->recuperer($requete);
383
		return $commentaires ? $commentaires['nb'] : 0;
383
		return $commentaires ? $commentaires['nb'] : 0;
384
	}
384
	}
385
}
385
}