Subversion Repositories eFlore/Applications.del

Rev

Rev 1701 | Rev 1794 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1701 Rev 1793
Line 1... Line 1...
1
<?php
1
<?php
2
/**
2
/**
3
 * Le web service plantnet récupère toutes les image de la table v_del_image 
3
 * Le web service plantnet récupère toutes les image de la table v_del_image
4
 * ordonées par date de modification
4
 * ordonées par date de modification
5
 * Les images sont regroupées en observations
5
 * Les images sont regroupées en observations
6
 * Les tags, les votes et les propositions de determinations sont intégrés à l'observation
6
 * Les tags, les votes et les propositions de determinations sont intégrés à l'observation
7
 * 
7
 *
8
 *
8
 *
9
 * @category	php 5.2
9
 * @category	php 5.2
10
 * @author	Samuel Dufour-Kowalski <samuel.dufour@cirad.fr>
10
 * @author	Samuel Dufour-Kowalski <samuel.dufour@cirad.fr>
11
 * @author	Mathias Chouet <mathias@tela-botanica.org>
11
 * @author	Mathias Chouet <mathias@tela-botanica.org>
12
 * @author	Raphaël Droz <raphael@tela-botanica.org>
12
 * @author	Raphaël Droz <raphael@tela-botanica.org>
Line 17... Line 17...
17
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
17
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
18
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images
18
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images
19
 */
19
 */
Line 20... Line 20...
20
 
20
 
21
class Changements {
21
class Changements {
22
	
22
 
23
	private $indexImagesIds = array();
23
	private $indexImagesIds = array();
24
	private $conteneur;
24
	private $conteneur;
25
	private $navigation;
25
	private $navigation;
26
	private $masque;
-
 
27
	private $gestionBdd;
26
	private $masque;
28
	private $bdd;
27
	private $bdd;
29
	private $parametres = array();
28
	private $parametres = array();
30
	private $ressources = array();
29
	private $ressources = array();
31
	private $date_defaut = '1900-01-01';
30
	private $date_defaut = '1900-01-01';
32
	
31
 
33
	public function __construct(Conteneur $conteneur = null) {
32
	public function __construct(Conteneur $conteneur = null) {
34
          
33
 
35
          /* restore_exception_handler(); */
34
          /* restore_exception_handler(); */
36
          /* restore_error_handler(); */
35
          /* restore_error_handler(); */
37
          /* ini_set("display_errors", "1"); */
36
          /* ini_set("display_errors", "1"); */
38
                
37
 
39
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
38
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
40
		$this->conteneur->chargerConfiguration('config_plantnet.ini');
39
		$this->conteneur->chargerConfiguration('config_plantnet.ini');
41
		$this->navigation = $conteneur->getNavigation();
40
		$this->navigation = $conteneur->getNavigation();
42
		$this->masque = $conteneur->getMasque();
-
 
43
		$this->gestionBdd = $conteneur->getGestionBdd();
41
		$this->masque = $conteneur->getMasque();
44
		$this->bdd = $this->gestionBdd->getBdd();	
42
		$this->bdd = $this->conteneur->getBdd();
45
	}
43
	}
46
	
44
 
47
	/**
45
	/**
48
	 * Méthode principale de la classe.
46
	 * Méthode principale de la classe.
49
	 * Lance la récupération des images dans la base et les place dans un objet ResultatService 
47
	 * Lance la récupération des images dans la base et les place dans un objet ResultatService
50
	 * pour l'afficher.
48
	 * pour l'afficher.
51
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
49
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
52
	 * @param array $parametres les paramètres situés après le ? dans l'url
50
	 * @param array $parametres les paramètres situés après le ? dans l'url
53
	 * */
51
	 * */
Line 54... Line 52...
54
	public function consulter($ressources, $parametres) {
52
	public function consulter($ressources, $parametres) {
55
 
53
 
56
 
54
 
57
		// initialiserRessourcesEtParametres()
55
		// initialiserRessourcesEtParametres()
58
		$this->ressources = $ressources;
56
		$this->ressources = $ressources;
59
		$this->parametres = $parametres;
57
		$this->parametres = $parametres;
60
		
58
 
61
                
59
 
62
		if(!isset($parametres['date'])) {
60
		if(!isset($parametres['date'])) {
63
			$this->parametres['date'] = $this->date_defaut;
61
			$this->parametres['date'] = $this->date_defaut;
64
		}
62
		}
65
		
63
 
66
                
64
 
67
		// Lancement du service
65
		// Lancement du service
Line 68... Line 66...
68
		$liaisons = $this->chargerLiaisons();
66
		$liaisons = $this->chargerLiaisons();
69
                $images = array();
67
                $images = array();
70
		$total = 0;
68
		$total = 0;
71
 
69
 
72
		if($liaisons) {
70
		if($liaisons) {
73
                  $compte = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre');
71
                  $compte = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre');
Line 74... Line 72...
74
                  $total = (int) $compte['nbre'];
72
                  $total = (int) $compte['nbre'];
75
                  
73
 
76
                  $imgdata = $this->recupererDonneeObs($liaisons);
74
                  $imgdata = $this->recupererDonneeObs($liaisons);
77
                  $obs = $this->regrouperObs($liaisons, $imgdata);
75
                  $obs = $this->regrouperObs($liaisons, $imgdata);
78
 
76
 
79
                  $obs = $this->chargerPropositionPlusProbable($obs);
77
                  $obs = $this->chargerPropositionPlusProbable($obs);
80
                  $obs = $this->orderArray($obs);
78
                  $obs = $this->orderArray($obs);
81
		}
79
		}
82
		
80
 
83
		$this->navigation->setTotal($total);
81
		$this->navigation->setTotal($total);
84
		
82
 
85
		// Mettre en forme le résultat et l'envoyer pour affichage
83
		// Mettre en forme le résultat et l'envoyer pour affichage
86
		$resultat = new ResultatService();
84
		$resultat = new ResultatService();
87
		//$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
85
		//$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
88
                $resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $obs);
86
                $resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $obs);
89
                
87
 
Line 90... Line 88...
90
		return $resultat;
88
		return $resultat;
Line 91... Line 89...
91
	}
89
	}
Line 100... Line 98...
100
          }
98
          }
Line 101... Line 99...
101
 
99
 
102
          function cmp($a, $b) {
100
          function cmp($a, $b) {
103
            return ($a['date_changement'] < $b['date_changement']) ? 1 : -1;
101
            return ($a['date_changement'] < $b['date_changement']) ? 1 : -1;
104
          }
102
          }
105
          
103
 
106
          usort($ret, 'cmp');
104
          usort($ret, 'cmp');
107
          return $ret;
105
          return $ret;
108
        }
106
        }
109
	/*-------------------------------------------------------------------------------
107
	/*-------------------------------------------------------------------------------
110
								CHARGEMENT DES IMAGES 
108
								CHARGEMENT DES IMAGES
111
	--------------------------------------------------------------------------------*/
109
	--------------------------------------------------------------------------------*/
Line 112... Line 110...
112
	private function chargerLiaisons() {
110
	private function chargerLiaisons() {
113
 
111
 
114
          $date_debut = $this->parametres['date'];
112
          $date_debut = $this->parametres['date'];
115
          $date_debut = '\'' . $date_debut . '\'';
113
          $date_debut = '\'' . $date_debut . '\'';
116
          $limite = @min(intval($this->parametres['navigation.limite']), 1000);
114
          $limite = @min(intval($this->parametres['navigation.limite']), 1000);
117
          $limite = $limite ? $limite : 10; // 0 => 10
-
 
Line -... Line 115...
-
 
115
          $limite = $limite ? $limite : 10; // 0 => 10
118
          $depart = intval(@$this->parametres['navigation.depart']);
116
          $depart = intval(@$this->parametres['navigation.depart']);
119
          
117
 
Line 120... Line 118...
120
 
118
 
Line 121... Line 119...
121
 
119
 
Line 143... Line 141...
143
            'group by id_image, id_observation '.
141
            'group by id_image, id_observation '.
Line 144... Line 142...
144
 
142
 
145
            'having MAX(vdi.date_creation) >= '.$date_debut.' or '.
143
            'having MAX(vdi.date_creation) >= '.$date_debut.' or '.
146
            '       MAX(vdi.date_modification) >= '.$date_debut.' or '.
144
            '       MAX(vdi.date_modification) >= '.$date_debut.' or '.
147
            '       MAX(del_image_tag.date) >= '.$date_debut.' or '.
145
            '       MAX(del_image_tag.date) >= '.$date_debut.' or '.
148
            '       MAX(del_image_tag.date_modification) >= '.$date_debut.' or '. 
146
            '       MAX(del_image_tag.date_modification) >= '.$date_debut.' or '.
149
            '       MAX(del_image_vote.date) >= '.$date_debut.' or '.
147
            '       MAX(del_image_vote.date) >= '.$date_debut.' or '.
150
            '       MAX(del_commentaire.date) >= '.$date_debut.' or '.
148
            '       MAX(del_commentaire.date) >= '.$date_debut.' or '.
151
            '       MAX(del_commentaire_vote.date) >= '.$date_debut.' '.
149
            '       MAX(del_commentaire_vote.date) >= '.$date_debut.' '.
152
            'order by modif_date DESC '.
150
            'order by modif_date DESC '.
Line 153... Line 151...
153
            'limit '.$depart.', '.$limite.' -- '.__FILE__.':'.__LINE__;
151
            'limit '.$depart.', '.$limite.' -- '.__FILE__.':'.__LINE__;
Line 154... Line 152...
154
 
152
 
155
          //echo $requete_sql; exit;
153
          //echo $requete_sql; exit;
Line 156... Line 154...
156
 
154
 
157
          return $this->bdd->recupererTous($requete_sql);
155
          return $this->bdd->recupererTous($requete_sql);
158
          
156
 
159
 
157
 
160
 
158
 
161
          // GROUP BY (très couteux) car multiples observations associées à une image
159
          // GROUP BY (très couteux) car multiples observations associées à une image
Line 162... Line 160...
162
          // charlie est ici :-) 
160
          // charlie est ici :-)
163
          // eg: 16150,16185,16245,16246,118995,129989
161
          // eg: 16150,16185,16245,16246,118995,129989
Line 164... Line 162...
164
                
162
 
165
	}
163
	}
166
	
164
 
167
 
165
 
168
        // recupere les donnée associées (fait en 2 requetes pour optimiser)
166
        // recupere les donnée associées (fait en 2 requetes pour optimiser)
169
        private function recupererDonneeObs(&$liaisons) {
167
        private function recupererDonneeObs(&$liaisons) {
170
 
168
 
171
          // recuperer les ids
169
          // recuperer les ids
172
          $ids = array();
170
          $ids = array();
173
          foreach ($liaisons as $img) {
171
          foreach ($liaisons as $img) {
174
            $id = $img['id_image'];
172
            $id = $img['id_image'];
175
            $ids[] = $id;
173
            $ids[] = $id;
176
          }
174
          }
177
          
175
 
178
          // recuperer les donnees
176
          // recuperer les donnees
179
          $resultats = $this->bdd->recupererTous(sprintf(
177
          $resultats = $this->bdd->recupererTous(sprintf(
180
                  'SELECT  '.
178
                  'SELECT  '.
181
                  'vdi.id_observation, vdi.id_image, '.
179
                  'vdi.id_observation, vdi.id_image, '.
182
                  'vdi.nom_sel, '.
180
                  'vdi.nom_sel, '.
183
                  'vdi.nom_referentiel, vdi.nom_ret, vdi.nom_ret_nn, vdi.nt, vdi.famille, '.
181
                  'vdi.nom_referentiel, vdi.nom_ret, vdi.nom_ret_nn, vdi.nt, vdi.famille, '.
Line 184... Line 182...
184
                  'vdi.zone_geo, vdi.latitude, vdi.longitude, '. 
182
                  'vdi.zone_geo, vdi.latitude, vdi.longitude, '.
185
                  'vdi.date_observation, vdi.date_creation, vdi.date_transmission, '. 
183
                  'vdi.date_observation, vdi.date_creation, vdi.date_transmission, '.
186
                  'vdi.mots_cles_texte as mots_cles_texte, '.  
184
                  'vdi.mots_cles_texte as mots_cles_texte, '.
Line 213... Line 211...
213
          foreach ($liaisons as $img) {
211
          foreach ($liaisons as $img) {
214
            $idobs = $img['id_observation'];
212
            $idobs = $img['id_observation'];
215
            $idimg = $img['id_image'];
213
            $idimg = $img['id_image'];
Line 216... Line 214...
216
 
214
 
217
            $imgdata = $imgdatas[$idimg];
215
            $imgdata = $imgdatas[$idimg];
218
 
216
 
219
            if (!isset($obs[$idobs])) {
217
            if (!isset($obs[$idobs])) {
220
              $obs[$idobs] = array();
218
              $obs[$idobs] = array();
Line 221... Line 219...
221
            }
219
            }
Line 225... Line 223...
225
            $obs[$idobs]['auteur_prenom'] = $imgdata['prenom_utilisateur'];
223
            $obs[$idobs]['auteur_prenom'] = $imgdata['prenom_utilisateur'];
226
            $obs[$idobs]['auteur_nom'] = $imgdata['nom_utilisateur'];
224
            $obs[$idobs]['auteur_nom'] = $imgdata['nom_utilisateur'];
227
            $obs[$idobs]['auteur_courriel'] = $imgdata['courriel_utilisateur'];
225
            $obs[$idobs]['auteur_courriel'] = $imgdata['courriel_utilisateur'];
Line 228... Line 226...
228
 
226
 
229
            $obs[$idobs]['mots_cles_obs_cel'] = $this->formaterMotsClesCel($imgdata['mots_cles_texte']);
227
            $obs[$idobs]['mots_cles_obs_cel'] = $this->formaterMotsClesCel($imgdata['mots_cles_texte']);
230
            
228
 
231
            $obs[$idobs]['date_observation'] = $imgdata['date_observation'];
229
            $obs[$idobs]['date_observation'] = $imgdata['date_observation'];
232
            $obs[$idobs]['date_publication'] = $imgdata['date_transmission'];
230
            $obs[$idobs]['date_publication'] = $imgdata['date_transmission'];
233
            $obs[$idobs]['date_creation'] = $imgdata['date_creation'];
231
            $obs[$idobs]['date_creation'] = $imgdata['date_creation'];
Line 241... Line 239...
241
            $obs[$idobs]['famille'] = $imgdata['famille'];
239
            $obs[$idobs]['famille'] = $imgdata['famille'];
Line 242... Line 240...
242
 
240
 
243
            $obs[$idobs]['zone_geo'] = $imgdata['zone_geo'];
241
            $obs[$idobs]['zone_geo'] = $imgdata['zone_geo'];
244
            $obs[$idobs]['latitude'] = floatval($imgdata['latitude']);
242
            $obs[$idobs]['latitude'] = floatval($imgdata['latitude']);
245
            $obs[$idobs]['longitude'] = floatval($imgdata['longitude']);
243
            $obs[$idobs]['longitude'] = floatval($imgdata['longitude']);
Line 246... Line 244...
246
            
244
 
247
 
245
 
248
            if (!isset($obs[$idobs]['images'])) {
246
            if (!isset($obs[$idobs]['images'])) {
Line 259... Line 257...
259
                             );
257
                             );
260
            // push
258
            // push
261
            $obs[$idobs]['images'][] = $img_obj;
259
            $obs[$idobs]['images'][] = $img_obj;
Line 262... Line 260...
262
 
260
 
263
          }
261
          }
264
          
262
 
265
          return $obs;
263
          return $obs;
266
		
264
 
267
	}
265
	}
268
	
266
 
269
	/**
267
	/**
270
         * Charger les votes pour chaque image
268
         * Charger les votes pour chaque image
271
         **/
269
         **/
Line 279... Line 277...
279
                  'WHERE ce_observation IN (%s) '.
277
                  'WHERE ce_observation IN (%s) '.
280
                  'AND nom_sel IS NOT NULL '.
278
                  'AND nom_sel IS NOT NULL '.
281
                  'AND del_commentaire.id_commentaire=del_commentaire_vote.ce_proposition '.
279
                  'AND del_commentaire.id_commentaire=del_commentaire_vote.ce_proposition '.
282
                  '', implode(',', $obsIds)));
280
                  '', implode(',', $obsIds)));
Line 283... Line 281...
283
 
281
 
284
			
282
 
285
          $votes = array(); // map ce_proposition -> score
283
          $votes = array(); // map ce_proposition -> score
286
			
284
 
287
          // calcul des votes
285
          // calcul des votes
288
          // un vote identifié a un facteur de 3
286
          // un vote identifié a un facteur de 3
289
          // additionne tous les vote par ce_proposition
287
          // additionne tous les vote par ce_proposition
290
          foreach($resultats as $vote) {
288
          foreach($resultats as $vote) {
291
            if(!isset($votes[$vote['id_commentaire']])) {
289
            if(!isset($votes[$vote['id_commentaire']])) {
292
              $votes[$vote['id_commentaire']] = 0;
290
              $votes[$vote['id_commentaire']] = 0;
293
            }
291
            }
294
            $valeur = ($vote['valeur'] == 1) ? 1 : -1;
292
            $valeur = ($vote['valeur'] == 1) ? 1 : -1;
295
            $votes[$vote['id_commentaire']] += is_numeric($vote['ce_utilisateur']) ? 3 * $valeur : $valeur;
293
            $votes[$vote['id_commentaire']] += is_numeric($vote['ce_utilisateur']) ? 3 * $valeur : $valeur;
296
          }
294
          }
297
          
295
 
298
          foreach($resultats as $vote) {
296
          foreach($resultats as $vote) {
299
            $idobs = $vote['ce_observation'];
297
            $idobs = $vote['ce_observation'];
300
            
298
 
301
            if(!isset($obs[$idobs]['determinations'])) {
299
            if(!isset($obs[$idobs]['determinations'])) {
302
              $obs[$idobs]['determinations'] = array();
300
              $obs[$idobs]['determinations'] = array();
Line 303... Line 301...
303
            }
301
            }
304
 
302
 
305
            $obs[$idobs]['determinations'][$vote['id_commentaire']] = 
303
            $obs[$idobs]['determinations'][$vote['id_commentaire']] =
306
              array('nom_sel' => $vote['nom_sel'],
304
              array('nom_sel' => $vote['nom_sel'],
307
                    'nom_ret' => $vote['nom_ret'],
305
                    'nom_ret' => $vote['nom_ret'],
308
                    'score' => $votes[$vote['id_commentaire']],
306
                    'score' => $votes[$vote['id_commentaire']],
309
                    'nn' => $vote['nom_sel_nn']
307
                    'nn' => $vote['nom_sel_nn']
310
                    );
308
                    );
Line 311... Line 309...
311
          }
309
          }
312
          
310
 
313
 
311
 
314
          return $obs;
312
          return $obs;
315
	}
313
	}
316
	
314
 
317
	
315
 
318
	/*-------------------------------------------------------------------------------
316
	/*-------------------------------------------------------------------------------
319
								FORMATER ET METTRE EN FORME
317
								FORMATER ET METTRE EN FORME
Line 337... Line 335...
337
            return array();
335
            return array();
338
          }
336
          }
339
          $ret = explode(',', implode(',', $result));
337
          $ret = explode(',', implode(',', $result));
340
          return $ret;
338
          return $ret;
341
	}
339
	}
342
	
340
 
343
}
341
}