Subversion Repositories eFlore/Applications.del

Rev

Rev 1313 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1313 Rev 1319
Line 38... Line 38...
38
		$this->gestionBdd = $conteneur->getGestionBdd();
38
		$this->gestionBdd = $conteneur->getGestionBdd();
39
		$this->bdd = $this->gestionBdd->getBdd();	
39
		$this->bdd = $this->gestionBdd->getBdd();	
40
	}
40
	}
Line -... Line 41...
-
 
41
	
-
 
42
	
-
 
43
	/** Nettoyer les paramètres pour ne pas accepter les %
-
 
44
	 * */
-
 
45
	public function nettoyerParametres($parametres) {
-
 
46
		$parametresRetour = array();
-
 
47
		foreach ($parametres as $cle => $valeur) {
-
 
48
			$valSanPourcent = trim($valeur, "% ");
-
 
49
			if ($valSanPourcent != '') {
-
 
50
				$parametresRetour[$cle] = $valeur;
-
 
51
			}
-
 
52
		}
-
 
53
		
-
 
54
		return $parametresRetour;
41
	
55
	}
42
	
56
	
43
	/**
57
	/**
44
	 * RequeteSansParametres
58
	 * RequeteSansParametres
45
	 *
59
	 *
46
	 * permet de vérifier qu'il n'y a aucun paramètre dans la requete, excepté les informations de start et limite,
60
	 * permet de vérifier qu'il n'y a aucun paramètre dans la requete, excepté les informations de start et limite,
47
	 * pour ajuster la requête pour un gain de temps
61
	 * pour ajuster la requête pour un gain de temps
48
	 * @param array $ressources les ressources telles qu'elles sont passées au script
62
	 * @param array $ressources les ressources telles qu'elles sont passées au script
49
	 * @param array $parametres les paramètres tels qu'il sont passés au script
63
	 * @param array $parametres les paramètres tels qu'il sont passés au script
-
 
64
	 * */
50
	 * */
65
	public function requeteSansParametres($ressources, $parametres) {
Line 51... Line 66...
51
	public function requeteSansParametres($ressources, $parametres) {
66
		
52
		$estSansParametres = true;
67
		$estSansParametres = true;
53
	
68
	
Line 54... Line 69...
54
		if (sizeof($ressources) > 0) {
69
		if (sizeof($ressources) > 0) {
-
 
70
			$estSansParametres = false;
55
			$estSansParametres = false;
71
		}
56
		}
72
	
57
	
73
		if (sizeof($parametres) > 2) {
58
		if (sizeof($parametres) > 2) {
74
			
59
			// s'il y a plus de 2 paramètres, on est forcément dans le cas où on a demandé des paramètres autre que la navigation
75
			// s'il y a plus de 2 paramètres, on est forcément dans le cas où on a demandé des paramètres autre que la navigation
Line 91... Line 107...
91
		$this->verifierConfiguration();
107
		$this->verifierConfiguration();
Line 92... Line 108...
92
		
108
		
93
		$this->verifierParametresTri();
109
		$this->verifierParametresTri();
Line 94... Line -...
94
		$this->initialiserTri();
-
 
-
 
110
		$this->initialiserTri();
95
		
111
		
Line 96... Line 112...
96
		
112
		$parametres = $this->nettoyerParametres($parametres);
97
		if ($this->requeteSansParametres($ressources, $parametres)) {
113
		if ($this->requeteSansParametres($ressources, $parametres)) {
98
				
114
				
Line 241... Line 257...
241
	
257
	
242
	/**
258
	/**
243
	* Charger la clause WHERE en fonction des paramètres de masque
259
	* Charger la clause WHERE en fonction des paramètres de masque
244
	* */
260
	* */
-
 
261
	private function chargerClauseWhere() {
245
	private function chargerClauseWhere() {
262
		
246
		$where = array();
263
		$where = array();
247
		$tableauMasque = $this->masque->getMasque();
264
		$tableauMasque = $this->masque->getMasque();
248
		if (!empty($tableauMasque)) {
265
		if (!empty($tableauMasque)) {
249
			foreach($tableauMasque as $idMasque => $valeurMasque) {
266
			foreach($tableauMasque as $idMasque => $valeurMasque) {
Line 333... Line 350...
333
								 	'(nom LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
350
								 	'(nom LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
334
								  	'prenom LIKE '.$this->proteger($tableauNomPrenom[0].'%').') OR '.
351
								  	'prenom LIKE '.$this->proteger($tableauNomPrenom[0].'%').') OR '.
335
									'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '.
352
									'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '.
336
									'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '.
353
									'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '.
337
									'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
354
									'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
338
									'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').') '.
355
									'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').') OR '.
-
 
356
									'(nom LIKE '.$this->proteger($valeurMasque.'%').') OR '.
-
 
357
									'(prenom LIKE '.$this->proteger($valeurMasque.'%').') OR '.
-
 
358
									'(dob.nom_utilisateur LIKE '.$this->proteger($valeurMasque.'%').') OR '.
-
 
359
									'(dob.prenom_utilisateur LIKE '.$this->proteger($valeurMasque.'%').') '.
339
								  ')';
360
								  ')';
340
				} else {
361
				} else {
341
					$masque = '(
362
					$masque = '(
342
						            (nom LIKE '.$this->proteger($auteurId.'%').' OR '.
363
						            (nom LIKE '.$this->proteger($auteurId.'%').' OR '.
343
									'prenom LIKE '.$this->proteger($auteurId.'%').' OR '.
364
									'prenom LIKE '.$this->proteger($auteurId.'%').' OR '.
Line 449... Line 470...
449
	/**
470
	/**
450
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
471
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
451
	* */
472
	* */
452
	private function chargerLiaisons() {
473
	private function chargerLiaisons() {
Line -... Line 474...
-
 
474
	
453
	
475
		// 1. Récupérer les id observation
-
 
476
		$requeteObs = ' SELECT id_observation FROM del_observation dob LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur ';
-
 
477
		
-
 
478
		$masques = $this->masque->getMasque();
-
 
479
		$conditionsObs = array();
-
 
480
		
-
 
481
		if (isset($masques['masque'])) {
-
 
482
			$conditionLibre = array();
-
 
483
			$passe = $masques['masque'];
-
 
484
			
454
		$champs = array('dob.id_observation as id_observation', 'nom_sel', 'nom_sel_nn', 'nt', 'famille', 'ce_zone_geo', 'zone_geo', 
485
			if (!isset($masques['masque.ns'])) {
-
 
486
				$conditionsLibre[] = "nom_sel LIKE '$passe%'";
-
 
487
			}
-
 
488
			
455
						'lieudit', 'station', 'milieu', 'date_observation', 'dob.mots_cles_texte as mots_cles_texte', 'dob.commentaire as commentaire', 
489
			if (!isset($masques['masque.famille'])) {
-
 
490
				$conditionsLibre[] = "famille LIKE '$passe%'";
-
 
491
			}
-
 
492
			
456
						'di.mots_cles_texte as mots_cles_texte_image ', 'date_transmission', 'di.id_image as id_image', 'di.ce_utilisateur as ce_utilisateur', 
493
			if (!isset($masques['masque.milieu'])) {
-
 
494
				$conditionsLibre[] = "nom_sel LIKE '$passe%'";
-
 
495
			}
-
 
496
			
457
						'prenom', 'nom', 'courriel', 'dob.prenom_utilisateur', 'dob.nom_utilisateur', 'dob.courriel_utilisateur', 'nom_original');
497
			if (!isset($masques['masque.tag'])) {
458
		// Attention le LEFT JOIN est indispensable pour ramener les images n'ayant pas de votes
498
				$conditionsLibre[] = "mots_cles_texte LIKE '%$passe%'";
-
 
499
				//TODO : voir pour images
-
 
500
			}
-
 
501
			
459
		// en cas de tri par votes
502
			if (!isset($masques['masque.date'])) {
-
 
503
				$conditionsLibre[] = $this->creerFiltreDate($passe);
-
 
504
			}
460
		$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS '.implode(', ',$champs).' '.
505
			
461
						   ($this->doitJoindreTableVotes() ?
506
			if (!isset($masques['masque.auteur'])) {
462
						   		', IF(dvote.ce_protocole = '.$this->parametres['protocole'].', AVG(dvote.valeur), 0) as total_votes ' :
507
				$conditionsLibre[] = $this->creerFiltreAuteur($passe);
-
 
508
			}
-
 
509
			
-
 
510
			$conditionsObs[] = implode(' OR ', $conditionsLibre);
-
 
511
		}
463
						   		''
512
		
464
						   	).
513
		// nom sel
465
							($this->doitJoindreTableTags() ?
514
		if (isset($masques['masque.ns'])) {
466
								// attention le DISTINCT est indispensable !
515
			$nom_sel = $masques['masque.ns'];
-
 
516
			$conditionsObs[] = "nom_sel LIKE '$nom_sel%'";
-
 
517
		}
467
						   		', (COUNT(DISTINCT dtag.id_tag) + '.$this->assemblercomptageOccurencesMotsClesCel().') as total_tags ' :
518
		
-
 
519
		// famille
-
 
520
		if (isset($masques['masque.famille'])) {
-
 
521
			$famille = $masques['masque.famille'];
-
 
522
			$conditionsObs[] = "famille LIKE '$famille%'";
-
 
523
		}
468
						   		''
524
		
469
							).
525
		// genre
470
						   'FROM '.$this->gestionBdd->formaterTable('del_obs_image', 'doi').
526
		if (isset($masques['masque.genre'])) {
-
 
527
			$genre = $masques['masque.genre'];
-
 
528
			$conditionsObs[] = "nom_sel LIKE '$genre%'";
-
 
529
		}
-
 
530
			
471
						   'INNER JOIN del_image di '.
531
		// milieu
472
						   'ON doi.id_image = di.id_image '.
532
		if (isset($masques['masque.milieu'])) {
473
						   'INNER JOIN del_observation dob '.
533
			$milieu = $masques['masque.milieu'];
-
 
534
			$conditionsObs[] = "nom_sel LIKE '$milieu%'";
-
 
535
		}
-
 
536
		
-
 
537
		// mots_cles_texte
474
						   'ON doi.id_observation = dob.id_observation '.
538
		if (isset($masques['masque.tag'])) {
475
						   'LEFT JOIN del_utilisateur du '.
539
			$motscles = $masques['masque.tag'];
-
 
540
			$conditionsObs[] = "mots_cles_texte LIKE '%$motscles%'";
-
 
541
		}
-
 
542
		
476
						   'ON du.id_utilisateur = di.ce_utilisateur '.
543
		// date 
477
							($this->doitJoindreTableTags() ?
544
		if (isset($masques['masque.date'])) {
478
						   		'LEFT JOIN del_image_tag dtag '.
545
			$date = $masques['masque.date'];
-
 
546
			$conditionsObs[] = $this->creerFiltreDate($date);
-
 
547
		}
479
						   		'ON doi.id_image = dtag.ce_image AND dtag.actif = 1 ' :
548
		
-
 
549
		// utilisateur
-
 
550
		if (isset($masques['masque.auteur'])) {
-
 
551
			$auteur = $masques['masque.auteur'];
-
 
552
			$conditionsObs[] = $this->creerFiltreAuteur($auteur);
-
 
553
		}
480
						   		''
554
		
481
							).
555
		// commune
482
							($this->doitJoindreTableVotes() ?
556
		if (isset($masques['masque.commune'])) {
483
						   		'LEFT JOIN del_image_vote dvote '.
557
			$commune = $masques['masque.commune'];
484
						   		'ON doi.id_image = dvote.ce_image AND dvote.ce_protocole = '.$this->parametres['protocole'] :
558
			$conditionsObs[] = " zone_geo LIKE ".$this->proteger(str_replace(array('-',' '), '_', $commune).'%');
-
 
559
		}
485
						   		''
560
		
-
 
561
		// commune
-
 
562
		if (isset($masques['masque.departement'])) {
486
						   	);
563
			$dept = $masques['masque.departement'];
-
 
564
			$conditionsObs[] = $this->creerFiltreIdZoneGeo($dept);
-
 
565
		}
487
		$requeteLiaisons .= $this->chargerClauseWhere();
566
		
488
		$requeteLiaisons .= $this->getTri();
567
		if (!empty($conditionsObs)) {
-
 
568
			$where = ' WHERE '.implode(' AND ', $conditionsObs);
-
 
569
			$requeteObs .= $where;
Line -... Line 570...
-
 
570
		}
-
 
571
 
-
 
572
		$observations = $this->bdd->recupererTous($requeteObs);
-
 
573
		
-
 
574
		$tabIdsObs = array();
-
 
575
		foreach ($observations as $observation) {
-
 
576
			$tabIdsObs[] = $observation['id_observation'];
-
 
577
		}
-
 
578
		$idsObs = implode(',', $tabIdsObs);
-
 
579
		if ($idsObs == '') {
-
 
580
			$idsObs = "''";
-
 
581
		}
-
 
582
		//var_dump($requeteObs);
-
 
583
		// 2. Récupérer les id images
-
 
584
		
-
 
585
		$conditionsImg = array();
-
 
586
		if (isset($masques['masque.tag'])) {
-
 
587
			$tag = $masques['masque.tag'];
-
 
588
			$conditionsImg[] = " dit.tag_normalise LIKE '$tag%' ";
-
 
589
			$conditionsImg[] = " di.mots_cles_texte LIKE '%$tag%' ";
-
 
590
		}
-
 
591
 
-
 
592
		$idsImages = '';
-
 
593
		if (!empty($conditionsImg)) {
-
 
594
			$requeteImages = ' SELECT doi.id_image FROM del_obs_image doi '.
-
 
595
					' INNER JOIN del_image di ON doi.id_image = di.id_image '.
-
 
596
					' INNER JOIN del_image_tag dit ON dit.ce_image = di.id_image ';
-
 
597
			
-
 
598
			$where = ' WHERE '.implode(' OR ', $conditionsImg);
-
 
599
			$requeteImages .= $where;
-
 
600
			
-
 
601
			$images = $this->bdd->recupererTous($requeteImages);
-
 
602
			
-
 
603
			$tabIdsImages = array();
-
 
604
			foreach ($images as $image) {
-
 
605
				$tabIdsImages[] = $image['id_image'];
-
 
606
			}
-
 
607
			$idsImages = implode(',', $tabIdsImages);
-
 
608
			
-
 
609
			if ($idsImages == '') {
-
 
610
				$idsImages = "''";
-
 
611
			}
-
 
612
		}
-
 
613
		//var_dump($requeteImages);exit();
-
 
614
		// 3. Récupérer la combinaison des deux
-
 
615
		$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS dob.id_observation as id_observation, nom_sel, nom_sel_nn, nt, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, '.
-
 
616
		' date_observation, dob.mots_cles_texte as mots_cles_texte, dob.commentaire as commentaire, di.mots_cles_texte as mots_cles_texte_image , date_transmission, '.
-
 
617
		' di.id_image as id_image, di.ce_utilisateur as ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, nom_original '.
-
 
618
		' FROM del_obs_image DOI '.
-
 
619
		' INNER JOIN del_image di ON doi.id_image = di.id_image '.
-
 
620
		' INNER JOIN del_observation dob ON doi.id_observation = dob.id_observation '.
-
 
621
		' LEFT JOIN del_utilisateur du ON du.id_utilisateur = di.ce_utilisateur ';
-
 
622
		
-
 
623
		
-
 
624
		$where = array();
-
 
625
		if (!empty($conditionsObs) && strlen($idsObs) > 0) {
-
 
626
			$where[] = 'dob.id_observation IN ( '.$idsObs.') ';
-
 
627
		}
-
 
628
		
-
 
629
		if (!empty($conditionsImg) && strlen($idsImages) > 0) {
-
 
630
			$chaineWhere = 'di.id_image IN ( '.$idsImages.') ';
-
 
631
			// Si on ne cherche pas que le tag, on doit récupérer uniquement les 
-
 
632
			// images qui matche avec la recherche d'observation
-
 
633
			if (isset($masques['masque.tag']) && sizeof($masques) > 1) {
-
 
634
				$chaineWhere .= ' AND doi.id_observation IN ('.$idsObs.') ';
-
 
635
			}
-
 
636
			$where[] = $chaineWhere;
-
 
637
		}
-
 
638
		
-
 
639
		if (!empty($where)) {
-
 
640
			$requeteLiaisons .= ' WHERE '.implode(' OR ', $where);
-
 
641
		}
-
 
642
		
-
 
643
		// limite de la chaine idobs = 1047389
-
 
644
		/*if (strlen($requeteLiaisons) > 1047389) {
-
 
645
			exit('requete trop longue');
-
 
646
			//return array();
-
 
647
		}*/
-
 
648
		
-
 
649
		$requeteLiaisons .= $this->gestionBdd->getLimitSql();
-
 
650
		
-
 
651
		// on ne lance la requete que si on a trouvé des images ou des observations, sinon
-
 
652
		// cela signifie qu'il n'y a aucune correspondance dans la base
489
		$requeteLiaisons .= $this->gestionBdd->getLimitSql();
653
		$retour = array();
-
 
654
		if (strlen($idsObs) > 0 || strlen($idsImages) > 0) {
-
 
655
			$retour = $this->bdd->recupererTous($requeteLiaisons); 
-
 
656
		}
490
 
657
		
Line 491... Line 658...
491
		return $this->bdd->recupererTous($requeteLiaisons);
658
		return $retour;
492
	}
659
	}
Line 499... Line 666...
499
	
666
	
500
		// Charger les obs images / images
667
		// Charger les obs images / images
501
		// récupérer les ids
668
		// récupérer les ids
Line 502... Line 669...
502
		// récupérer les observations
669
		// récupérer les observations
503
 
670
 
504
		$requeteImages = 'SELECT  *, di.mots_cles_texte as mots_cles_texte_image FROM del_obs_image doi '.
671
		$requeteImages = 'SELECT *, di.mots_cles_texte as mots_cles_texte_image FROM del_obs_image doi '.
505
						'INNER JOIN del_image di ON doi.id_image = di.id_image '.
672
						'INNER JOIN del_image di ON doi.id_image = di.id_image '.
506
						'ORDER BY id_observation DESC'.
673
						'ORDER BY id_observation DESC'.