Subversion Repositories eFlore/Applications.del

Rev

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

Rev 2095 Rev 2120
Line 567... Line 567...
567
	 */
567
	 */
568
	private function ajouterContrainteTagDel() {
568
	private function ajouterContrainteTagDel() {
569
		if (isset($this->parametres['masque.tag_del'])) {
569
		if (isset($this->parametres['masque.tag_del'])) {
570
			$nbTags = $this->getNombreDeTags();
570
			$nbTags = $this->getNombreDeTags();
571
			if($nbTags > 1) {
571
			if($nbTags > 1) {
-
 
572
				// sous-requêtes car le GROUP BY avec GROUP_CONCAT est *trop* lent
572
				$tagsMotif = $this->construireTagsMotif();
573
				if (isset($this->parametres['masque.tag_del']['AND'])) {
-
 
574
					foreach ($this->parametres['masque.tag_del']['AND'] as $mc) {
573
				if (is_null($tagsMotif) === false) {
575
						$sousRequete = 'SELECT ce_image '.
-
 
576
							'FROM del_image_tag '.
-
 
577
							'WHERE actif = 1 '.
-
 
578
							"AND tag_normalise LIKE '%$mc%' ";
-
 
579
						$this->addWhere('masque.tag_del', "di.id_image IN ($sousRequete)");
-
 
580
					}
-
 
581
				} else if (isset($this->parametres['masque.tag_del']['OR'])) {
-
 
582
					$tagsMotif = "'(" . implode('|', $this->parametres['masque.tag_del']['OR']) . ")'";
574
					$sousRequete = 'SELECT ce_image '.
583
					$sousRequete = 'SELECT ce_image '.
575
						'FROM del_image_tag '.
584
						'FROM del_image_tag '.
576
						'WHERE actif = 1 '.
585
						'WHERE actif = 1 '.
577
						'GROUP BY ce_image '.
586
						"AND tag_normalise REGEXP $tagsMotif ";
-
 
587
					
578
						"HAVING GROUP_CONCAT(DISTINCT tag_normalise ORDER BY tag_normalise) REGEXP $tagsMotif ";
588
					$this->addWhere('masque.tag_del', "di.id_image IN ($sousRequete)");
579
				}
589
				}
580
			} else {
590
			} else {
581
				// Si un seul tag est demandé il se trouve dans le OR dans le cas de la recherche
591
				// Si un seul tag est demandé il se trouve dans le OR dans le cas de la recherche
582
				// spécifique et dans le AND dans le cas de la recherche générale
592
				// spécifique et dans le AND dans le cas de la recherche générale
583
				// WTF?
593
				// WTF?
Line 590... Line 600...
590
				
600
				
591
				$sousRequete = 'SELECT ce_image '.
601
				$sousRequete = 'SELECT ce_image '.
592
						'FROM del_image_tag '.
602
						'FROM del_image_tag '.
593
						'WHERE actif = 1 '.
603
						'WHERE actif = 1 '.
-
 
604
						'AND tag_normalise LIKE '.$this->bdd->proteger($tag.'%');
-
 
605
 
594
						'AND tag_normalise LIKE '.$this->bdd->proteger($tag.'%');
606
				$this->addWhere('masque.tag_del', "di.id_image IN ($sousRequete)");
Line 595... Line -...
595
			}
-
 
596
			
607
			}
597
			$this->addWhere('masque.tag_del', "di.id_image IN ($sousRequete)");
608
			
Line 598... Line 609...
598
		}
609
		}
599
	}
610
	}
Line 606... Line 617...
606
			$somme = count($this->parametres['masque.tag_del']['OR']);
617
			$somme = count($this->parametres['masque.tag_del']['OR']);
607
		}
618
		}
608
		return $somme;
619
		return $somme;
609
	}
620
	}
Line 610... Line -...
610
 
-
 
611
	private function construireTagsMotif() {
-
 
612
		$tagsMotif = null;
-
 
613
		if (isset($this->parametres['masque.tag_del']['AND'])) {
-
 
614
			$tags = $this->parametres['masque.tag_del']['AND'];
-
 
615
			// ATTENTION -> optimisation: en cas de "AND" on sort() l'input et le GROUP_CONCAT()
-
 
616
			// donc nous utilisons des ".*" plutôt que de multiples conditions et "|"
-
 
617
			sort($tags);
-
 
618
			$tagsMotif = $this->bdd->proteger(implode('.*', $tags));
-
 
619
		} else if (isset($this->parametres['masque.tag_del']['OR'])) {
-
 
620
			$tags = $this->parametres['masque.tag_del']['OR'];
-
 
621
			$tagsMotif = $this->bdd->proteger(implode('|', $tags));
-
 
622
		}
-
 
623
		return $tagsMotif;
-
 
624
	}
-
 
625
 
621
 
626
	/**
622
	/**
627
	 * Partie spécifique à PictoFlora:
623
	 * Partie spécifique à PictoFlora:
628
	 * Attention : si le critère de tri n'est pas suffisant, les résultats affichés peuvent varier à chaque appel
624
	 * Attention : si le critère de tri n'est pas suffisant, les résultats affichés peuvent varier à chaque appel
629
	 * de la même page de résultat de PictoFlora.
625
	 * de la même page de résultat de PictoFlora.
Line 741... Line 737...
741
 
737
 
742
	public function getTotalLignesTrouvees() {
738
	public function getTotalLignesTrouvees() {
743
		$resultat = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre -- '.__FILE__.':'.__LINE__);
739
		$resultat = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre -- '.__FILE__.':'.__LINE__);
744
		return intval($resultat['nbre']);
740
		return intval($resultat['nbre']);
745
	}
741
	}
746
	
742
	
747
	public function getRequeteIdObsMonactiviteTout($id_utilisateur, $limite = "") {
743
	public function getRequeteIdObsMonactiviteTout($id_utilisateur, $limite = "") {
748
		/*	
744
		/*	
749
		Une action c'est :
745
		Une action c'est :
750
		- Quelqu'un commente mon observation
746
		- Quelqu'un commente mon observation
751
		- Quelqu'un fait une proposition sur mon observation
747
		- Quelqu'un fait une proposition sur mon observation
752
	
748
	
753
		- Quelqu'un vote pour ma proposition
749
		- Quelqu'un vote pour ma proposition
754
		- Quelqu'un commente ma proposition ou mon commentaire
750
		- Quelqu'un commente ma proposition ou mon commentaire
755
	
751
	
756
		- Quelqu'un vote pour une proposition sur mon observation
752
		- Quelqu'un vote pour une proposition sur mon observation
757
		- Quelqu'un commente une proposition ou un commentaire sur mon observation
753
		- Quelqu'un commente une proposition ou un commentaire sur mon observation
Line 758... Line 754...
758
		*/
754
		*/
759
		
755
		
760
		// on selectionne aussi la combinaison des champs de date afin que la liste soit triée correctement
756
		// on selectionne aussi la combinaison des champs de date afin que la liste soit triée correctement
761
		// pas d'autre meilleure solution mais attention ce comportement dépend entièrement de mysql
757
		// pas d'autre meilleure solution mais attention ce comportement dépend entièrement de mysql
762
		$requete = "SELECT SQL_CALC_FOUND_ROWS DISTINCT id_observation, ".$this->getCombinaisonChampsDateMax()." as date_max FROM del_observation do ".
758
		$requete = "SELECT SQL_CALC_FOUND_ROWS DISTINCT id_observation, ".$this->getCombinaisonChampsDateMax()." as date_max FROM del_observation do ".
763
				$this->getJointureMonActivite($id_utilisateur).
759
				$this->getJointureMonActivite($id_utilisateur).
764
				$this->getConditionMonActivite($id_utilisateur).
760
				$this->getConditionMonActivite($id_utilisateur).
765
				"ORDER BY date_max DESC ".
761
				"ORDER BY date_max DESC ".
766
				$limite;
762
				$limite;
767
 
763
 
Line 768... Line 764...
768
		return $requete;
764
		return $requete;
769
	}
765
	}
770
	
766
	
771
	public function getRequeteNbEvenementsDepuisDate($id_utilisateur, $date) {
767
	public function getRequeteNbEvenementsDepuisDate($id_utilisateur, $date) {
772
		$requete = "SELECT COUNT(DISTINCT id_observation) as nb_evenements FROM del_observation do ".
768
		$requete = "SELECT COUNT(DISTINCT id_observation) as nb_evenements FROM del_observation do ".
773
				$this->getJointureMonActivite($id_utilisateur).
769
				$this->getJointureMonActivite($id_utilisateur).
774
				$this->getConditionMonActivite($id_utilisateur).
770
				$this->getConditionMonActivite($id_utilisateur).
775
				"AND ".$this->getCombinaisonChampsDateMax()." > '".$date."' ". 
771
				"AND ".$this->getCombinaisonChampsDateMax()." > '".$date."' ". 
776
				"ORDER BY ".$this->getCombinaisonChampsDateMax()." DESC ";
772
				"ORDER BY ".$this->getCombinaisonChampsDateMax()." DESC ";
Line 777... Line 773...
777
 
773
 
778
		return $requete;
774
		return $requete;
779
	}
775
	}
780
	
776
	
781
	public function getEvenementsObs($idsObsConcat, $id_utilisateur) {
777
	public function getEvenementsObs($idsObsConcat, $id_utilisateur) {
782
		$sous_champ_date_max = $this->getCombinaisonChampsDateMax()." as date_max";
778
		$sous_champ_date_max = $this->getCombinaisonChampsDateMax()." as date_max";
783
		$sous_champ_date = "dc.date as date_com, dc.nom_sel as nom_sel_com, dcpr.ce_commentaire_parent as parent_com, dcv.date as date_vote, ".
779
		$sous_champ_date = "dc.date as date_com, dc.nom_sel as nom_sel_com, dcpr.ce_commentaire_parent as parent_com, dcv.date as date_vote, ".
784
							"do.date_observation as date_obs, dcp.date_validation as date_validation, dcpr.date as date_com_reponse, ".
780
							"do.date_observation as date_obs, dcp.date_validation as date_validation, dcpr.date as date_com_reponse, ".
785
							"dcvp.nom_sel as nom_sel_com_parent";
781
							"dcvp.nom_sel as nom_sel_com_parent";
Line 786... Line 782...
786
		$sous_champs_utilisateurs = "dc.ce_utilisateur as utilisateur_commentaire, dcp.ce_utilisateur as utilisateur_commentaire_valide, ".
782
		$sous_champs_utilisateurs = "dc.ce_utilisateur as utilisateur_commentaire, dcp.ce_utilisateur as utilisateur_commentaire_valide, ".
787
									"dcv.ce_utilisateur as utilisateur_vote_commentaire, do.ce_utilisateur as utilisateur_observation, ".
783
									"dcv.ce_utilisateur as utilisateur_vote_commentaire, do.ce_utilisateur as utilisateur_observation, ".
Line 788... Line 784...
788
									"dcp.ce_validateur as utilisateur_validation, dcvp.ce_utilisateur as utilisateur_commentaire_vote, ".
784
									"dcp.ce_validateur as utilisateur_validation, dcvp.ce_utilisateur as utilisateur_commentaire_vote, ".
789
									"dcpr.ce_utilisateur as utilisateur_commentaire_reponse";
785
									"dcpr.ce_utilisateur as utilisateur_commentaire_reponse";
790
 
786
 
791
		$sous_champs_infos = "dc.nom_sel as proposition_commentaire_nom_sel, dc.texte as proposition_commentaire_texte, dcp.nom_sel as proposition_validee_nom_sel, ".
787
		$sous_champs_infos = "dc.nom_sel as proposition_commentaire_nom_sel, dc.texte as proposition_commentaire_texte, dcp.nom_sel as proposition_validee_nom_sel, ".
792
							 "dcvp.nom_sel as proposition_commentaire_nom_sel_votee, dcpr.texte as proposition_commentaire_texte_commente";
788
							 "dcvp.nom_sel as proposition_commentaire_nom_sel_votee, dcpr.texte as proposition_commentaire_texte_commente";
793
			
789
			
794
		$requete = "SELECT DISTINCT id_observation, ".$sous_champs_utilisateurs.", ".$sous_champ_date_max.", ".$sous_champ_date.", ".$sous_champs_infos." ".
790
		$requete = "SELECT DISTINCT id_observation, ".$sous_champs_utilisateurs.", ".$sous_champ_date_max.", ".$sous_champ_date.", ".$sous_champs_infos." ".
795
				"FROM del_observation do ".
791
				"FROM del_observation do ".
796
				$this->getJointureMonActivite($id_utilisateur).
792
				$this->getJointureMonActivite($id_utilisateur).
Line 797... Line 793...
797
				$this->getConditionMonActivite($id_utilisateur).
793
				$this->getConditionMonActivite($id_utilisateur).
798
				"AND id_observation IN ($idsObsConcat) ORDER BY date_max DESC";
794
				"AND id_observation IN ($idsObsConcat) ORDER BY date_max DESC";
799
 
795
 
800
		$evenements = $this->bdd->recupererTous($requete);
796
		$evenements = $this->bdd->recupererTous($requete);
801
		return $evenements;
797
		return $evenements;
802
	}
798
	}
803
	
799
	
804
	public function getJointureMonActivite($id_utilisateur) {
800
	public function getJointureMonActivite($id_utilisateur) {
805
		return 	// quelqu'un commente mon observation ou fait une proposition
801
		return 	// quelqu'un commente mon observation ou fait une proposition
806
		"LEFT JOIN del_commentaire dc ON do.id_observation = dc.ce_observation ".
802
		"LEFT JOIN del_commentaire dc ON do.id_observation = dc.ce_observation ".
807
		"	AND do.ce_utilisateur = ".$id_utilisateur." ".
803
		"	AND do.ce_utilisateur = ".$id_utilisateur." ".
808
		"	AND dc.ce_utilisateur != ".$id_utilisateur." ".
804
		"	AND dc.ce_utilisateur != ".$id_utilisateur." ".
809
		// quelqu'un valide ma proposition (et ce n'est pas moi qui l'ai validée)
805
		// quelqu'un valide ma proposition (et ce n'est pas moi qui l'ai validée)
810
		"LEFT JOIN del_commentaire dcp ON do.id_observation = dcp.ce_observation ".
806
		"LEFT JOIN del_commentaire dcp ON do.id_observation = dcp.ce_observation ".
811
		"	AND dcp.nom_sel IS NOT NULL AND dcp.ce_validateur != ".$id_utilisateur." ".
807
		"	AND dcp.nom_sel IS NOT NULL AND dcp.ce_validateur != ".$id_utilisateur." ".
812
		"	AND dcp.ce_validateur != 0 ".
808
		"	AND dcp.ce_validateur != 0 ".
813
		"	AND dcp.date_validation IS NOT NULL ".
809
		"	AND dcp.date_validation IS NOT NULL ".
814
		"	AND dcp.ce_utilisateur = ".$id_utilisateur." ".
810
		"	AND dcp.ce_utilisateur = ".$id_utilisateur." ".
815
		// quelqu'un vote pour ma proposition ou sur une proposition sur une de mes observations
811
		// quelqu'un vote pour ma proposition ou sur une proposition sur une de mes observations
816
		"LEFT JOIN del_commentaire dcvp ON do.id_observation = dcvp.ce_observation ".
812
		"LEFT JOIN del_commentaire dcvp ON do.id_observation = dcvp.ce_observation ".
817
		"LEFT JOIN del_commentaire_vote dcv ON dcv.ce_proposition = dcvp.id_commentaire ".
813
		"LEFT JOIN del_commentaire_vote dcv ON dcv.ce_proposition = dcvp.id_commentaire ".
818
		"AND (dcvp.ce_utilisateur = $id_utilisateur OR do.ce_utilisateur = $id_utilisateur) ".
814
		"AND (dcvp.ce_utilisateur = $id_utilisateur OR do.ce_utilisateur = $id_utilisateur) ".
819
		"AND dcv.ce_utilisateur != $id_utilisateur ".
815
		"AND dcv.ce_utilisateur != $id_utilisateur ".
820
		"AND dcv.ce_utilisateur != dcvp.ce_utilisateur ".
816
		"AND dcv.ce_utilisateur != dcvp.ce_utilisateur ".
821
		// Quelqu'un répond à l'un de mes commentaires ou commente une de mes propositions
817
		// Quelqu'un répond à l'un de mes commentaires ou commente une de mes propositions
822
		"LEFT JOIN del_commentaire dcpr ON do.id_observation = dcpr.ce_observation ".
818
		"LEFT JOIN del_commentaire dcpr ON do.id_observation = dcpr.ce_observation ".
823
		"AND dcpr.ce_commentaire_parent = dcvp.id_commentaire AND dcvp.ce_utilisateur = $id_utilisateur ";
819
		"AND dcpr.ce_commentaire_parent = dcvp.id_commentaire AND dcvp.ce_utilisateur = $id_utilisateur ";
824
	}
820
	}
825
	
821
	
826
	public function getConditionMonActivite($id_utilisateur, $type = "autres") {
822
	public function getConditionMonActivite($id_utilisateur, $type = "autres") {
827
		//TODO: gérer les cas suivants :
823
		//TODO: gérer les cas suivants :
828
		// demander les activités des autres sur mes obs ou propositions (c'est dejà le cas)
824
		// demander les activités des autres sur mes obs ou propositions (c'est dejà le cas)
829
		// demander mes activités
825
		// demander mes activités
830
		// demander toutes les activités (combinaisons des deux cas ci dessus)
826
		// demander toutes les activités (combinaisons des deux cas ci dessus)
831
		return 	// Vérification que l'évènement me concerne (de près ou ou de loin)
827
		return 	// Vérification que l'évènement me concerne (de près ou ou de loin)
832
		"WHERE (do.ce_utilisateur = $id_utilisateur OR dc.ce_utilisateur = $id_utilisateur ".
828
		"WHERE (do.ce_utilisateur = $id_utilisateur OR dc.ce_utilisateur = $id_utilisateur ".
833
		"OR dcp.ce_utilisateur = $id_utilisateur OR dcv.ce_utilisateur = $id_utilisateur ".
829
		"OR dcp.ce_utilisateur = $id_utilisateur OR dcv.ce_utilisateur = $id_utilisateur ".
834
		"OR dcvp.ce_utilisateur = $id_utilisateur) AND ".
830
		"OR dcvp.ce_utilisateur = $id_utilisateur) AND ".
835
		// mais qu'il y a au moins eu une action de la part d'une autre personne
831
		// mais qu'il y a au moins eu une action de la part d'une autre personne
836
		"(dc.ce_utilisateur IS NOT NULL OR dcp.ce_utilisateur IS NOT NULL OR dcv.ce_utilisateur IS NOT NULL) ";
832
		"(dc.ce_utilisateur IS NOT NULL OR dcp.ce_utilisateur IS NOT NULL OR dcv.ce_utilisateur IS NOT NULL) ";