Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 3777 Rev 3792
Line 27... Line 27...
27
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
27
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
28
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
28
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
29
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
29
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
30
 */
30
 */
31
class CelSyndicationObservation extends Cel {
31
class CelSyndicationObservation extends Cel {
Line 228... Line 228...
228
    
228
    
229
    private function getServiceMultiCriteres() {
229
    private function getServiceMultiCriteres() {
230
        $contenu = '';
230
        $contenu = '';
231
        if (isset($_GET['debut'])) $this->start = Cel::db()->proteger($_GET['debut']);
231
        if (isset($_GET['debut'])) $this->start = Cel::db()->proteger($_GET['debut']);
Line 232... Line 232...
232
        if (isset($_GET['limite'])) $this->limit = Cel::db()->proteger($_GET['limite']);
232
        if (isset($_GET['limite'])) $this->limit = Cel::db()->proteger($_GET['limite']);
Line 233... Line 233...
233
        
233
        
234
        $this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus !
234
        $this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus !
235
        
235
        
236
		// Construction de la requête
236
        // Construction de la requête
237
		$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
237
        $requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
238
				'FROM cel_export_total '.
238
            'FROM cel_export_total '.
239
				'WHERE 1 AND '.(($this->etreFluxAdmin()) ? '' : ' transmission = 1 AND ');
239
            'WHERE 1 AND '.(($this->etreFluxAdmin()) ? '' : ' transmission = 1 AND ');
240
 
240
        
241
		if ($this->estUneRechercheGenerale()) {
241
        if ($this->estUneRechercheGenerale()) {
242
			$chaine_requete = $_GET['recherche'];
242
            $chaine_requete = $_GET['recherche'];
243
			$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
243
            $requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
244
		} else {
244
        } else {
245
			$criteres = $this->traiterCriteresMultiples($_GET) ;
245
            $criteres = $this->traiterCriteresMultiples($_GET) ;
246
			if (!empty($criteres)) {
246
            if (!empty($criteres)) {
247
				$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
247
                $requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
248
			}
248
            }
249
		}
249
        }
250
		$requete = rtrim($requete, 'AND ');
250
        $requete = rtrim($requete, 'AND ');
251
		$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
251
        $requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
252
			'date_modification DESC, zone_geo ASC').' '.
252
            'date_modification DESC, zone_geo ASC').' '.
253
				"LIMIT $this->start,$this->limit ";
253
            "LIMIT $this->start,$this->limit ";
254
 
254
        
255
		$elements = Cel::db()->requeter($requete);
255
        $elements = Cel::db()->requeter($requete);
256
		// Création du contenu
256
        // Création du contenu
257
		if ($elements != false && count($elements) > 0) {
257
        if ($elements != false && count($elements) > 0) {
258
			$contenu = $this->executerService($elements);
258
            $contenu = $this->executerService($elements);
259
		} else {
259
        } else {
260
			// déclenche une erreur 500 à tort; ne pas faire ça
260
            // déclenche une erreur 500 à tort; ne pas faire ça
261
			//$this->messages[] = "Aucune observation disponible.";
261
            //$this->messages[] = "Aucune observation disponible.";
262
		}
262
        }
263
 
263
        
264
        return $contenu;
264
        return $contenu;
265
	}
265
    }
266
 
266
    
267
	private function creerSousRequeteRechercheParCriteres($criteres) {
267
    private function creerSousRequeteRechercheParCriteres($criteres) {
268
		$requete = '';
268
        $requete = '';
269
		foreach ($criteres as $pair) {
269
        foreach ($criteres as $pair) {
270
			$nom_valeur = explode("=",$pair);
270
            $nom_valeur = explode("=",$pair);
271
			if (sizeof($nom_valeur) != 0) {
271
            if (sizeof($nom_valeur) != 0) {
272
				switch ($nom_valeur[0]) {
272
                switch ($nom_valeur[0]) {
273
					case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break;
273
                    case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break;
274
					case "commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
274
                    case "commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
275
						foreach($mots_comment_liste as $mot_comment) {
275
                    foreach($mots_comment_liste as $mot_comment) {
276
							$mot_comment = trim($mot_comment) ;
276
                        $mot_comment = trim($mot_comment) ;
277
							$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND ';
277
                        $requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND ';
278
						}
278
                    }
279
						break;
279
                    break;
280
					case "date_observation" :
280
                    case "date_observation" :
281
						$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
281
                        $nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
282
						if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
282
                        if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
283
							$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
283
                            $nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
284
						}
284
                        }
285
						$requete .= $nom_valeur[0].'='.Cel::db()->quote($nom_valeur[1]).' AND '; break;
285
                        $requete .= $nom_valeur[0].'='.Cel::db()->quote($nom_valeur[1]).' AND '; break;
286
					case "ce_zone_geo" :
286
                    case "ce_zone_geo" :
287
						$requete .= ' ('.$nom_valeur[0].' LIKE "'.$nom_valeur[1].'%") AND '; break;
287
                        $requete .= ' ('.$nom_valeur[0].' LIKE "'.$nom_valeur[1].'%") AND '; break;
288
					case "nom_ret" :
288
                    case "nom_ret" :
289
						if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
289
                        if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
290
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR nom_sel LIKE "%'.
290
                        $requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR nom_sel LIKE "%'.
291
							$nom_valeur[1].'%") AND '; break;
291
                            $nom_valeur[1].'%") AND '; break;
292
					case "mots-cles" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break;
292
                    case "mots-cles" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break;
293
					case "tags" : $requete .= $this->creerSousRequeteTags($nom_valeur[1]).' AND '; break;
293
                    case "tags" : $requete .= $this->creerSousRequeteTags($nom_valeur[1]).' AND '; break;
294
					case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break;
294
                    case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break;
295
					default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
295
                    default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
296
				}
296
                }
297
			}
297
            }
298
		}
298
        }
299
		$requete = rtrim($requete,' AND ');
299
        $requete = rtrim($requete,' AND ');
300
		return $requete;
300
        return $requete;
301
	}
301
    }
302
	
302
    
303
	private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) {
303
    private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) {
304
		$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo);
304
        $req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo);
305
		$res = Cel::db()->requeter($req);
305
        $res = Cel::db()->requeter($req);
306
		$zones = array();
306
        $zones = array();
307
		foreach($res as &$r) {
307
        foreach($res as &$r) {
308
			$zones[] = Cel::db()->proteger($r['valeur']);
308
            $zones[] = Cel::db()->proteger($r['valeur']);
309
		}
309
        }
310
		$sql = '(ce_zone_geo IN ('.implode(',', $zones).')) ';
310
        $sql = '(ce_zone_geo IN ('.implode(',', $zones).')) ';
311
		
311
        
312
		return $sql;
312
        return $sql;
313
	}
313
    }
314
 
314
    
315
	private function creerSousRequeteMotsCles($mot_cle) {
315
    private function creerSousRequeteMotsCles($mot_cle) {
316
		$requete = '';
316
        $requete = '';
317
		if (preg_match('/.*OU.*/', $mot_cle)) {
317
        if (preg_match('/.*OU.*/', $mot_cle)) {
318
			$mots_cles_tab = explode('OU',$mot_cle);
318
            $mots_cles_tab = explode('OU',$mot_cle);
319
			foreach($mots_cles_tab as $mot_cle_item) {
319
            foreach($mots_cles_tab as $mot_cle_item) {
320
				$requete .= '(mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
320
                $requete .= '(mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
321
			}
321
            }
322
			$requete = '('.rtrim($requete,'OR ').') ';
322
            $requete = '('.rtrim($requete,'OR ').') ';
323
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
323
        } else if (preg_match('/.*ET.*/', $mot_cle)) {
324
			$mots_cles_tab = explode('ET',$mot_cle);
324
            $mots_cles_tab = explode('ET',$mot_cle);
325
			foreach($mots_cles_tab as $mot_cle_item) {
325
            foreach($mots_cles_tab as $mot_cle_item) {
326
				$requete .= '(mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
326
                $requete .= '(mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
327
			}
327
            }
328
			$requete = '('.rtrim($requete, 'AND ').') ';
328
            $requete = '('.rtrim($requete, 'AND ').') ';
329
		} else {
329
        } else {
330
			$requete = "(mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
330
            $requete = "(mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
331
		}
331
        }
332
		return $requete;
332
        return $requete;
333
	}
333
    }
334
 
334
    
335
	private function creerSousRequeteTags($tag) {
335
    private function creerSousRequeteTags($tag) {
336
		$requete = '(id_observation IN (SELECT ce_observation FROM cel_images ci WHERE ';
336
        $requete = '(id_observation IN (SELECT ce_observation FROM cel_images ci WHERE ';
337
		$where = '';
337
        $where = '';
338
		if (preg_match('/.*OU.*/', $tag)) {
338
        if (preg_match('/.*OU.*/', $tag)) {
339
			$mots_cles_tab = explode('OU',$tag);
339
            $mots_cles_tab = explode('OU',$tag);
340
			foreach($mots_cles_tab as $mot_cle_item) {
340
            foreach($mots_cles_tab as $mot_cle_item) {
341
				$where .= '(ci.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
341
                $where .= '(ci.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
342
			}
342
            }
343
			$where .= '('.rtrim($where,'OR ').') ';
343
            $where .= '('.rtrim($where,'OR ').') ';
344
		} else if (preg_match('/.*ET.*/', $tag)) {
344
        } else if (preg_match('/.*ET.*/', $tag)) {
345
			$mots_cles_tab = explode('ET',$tag);
345
            $mots_cles_tab = explode('ET',$tag);
346
			foreach($mots_cles_tab as $mot_cle_item) {
346
            foreach($mots_cles_tab as $mot_cle_item) {
347
				$where .= '(ci.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
347
                $where .= '(ci.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
348
			}
348
            }
349
			$where .= '('.rtrim($where, 'AND ').') ';
349
            $where .= '('.rtrim($where, 'AND ').') ';
350
		} else {
350
        } else {
351
			$where .= "(ci.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$tag.'%').') ';
351
            $where .= "(ci.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$tag.'%').') ';
352
		}
352
        }
353
		$requete .= $where.' ))';
353
        $requete .= $where.' ))';
354
		return $requete;
354
        return $requete;
355
	}
355
    }
Line 356... Line 356...
356
 
356
    
357
	private function traiterCriteresMultiples($tableau_criteres) {
357
    private function traiterCriteresMultiples($tableau_criteres) {
358
		$tableau_criteres_pour_bdd = array();
358
        $tableau_criteres_pour_bdd = array();
359
        
359
        
360
        foreach($tableau_criteres as $nom_critere => $valeur_critere) {
360
        foreach($tableau_criteres as $nom_critere => $valeur_critere) {
361
            if (isset($this->criteres[$nom_critere])) {
361
            if (isset($this->criteres[$nom_critere])) {
362
                $valeur_critere = Cel::deb()->proteger($valeur_critere);
362
                $valeur_critere = Cel::deb()->proteger($valeur_critere);
363
                $tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
363
                $tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
Line 364... Line 364...
364
            }
364
            }
365
        }
365
        }
366
		return $tableau_criteres_pour_bdd;
366
        return $tableau_criteres_pour_bdd;
367
	}
367
    }
368
    
368
    
369
    private function creerSousRequeteRechercheGenerale($chaine_requete) {
369
    private function creerSousRequeteRechercheGenerale($chaine_requete) {
596
		} else {
596
        } else {