Subversion Repositories eFlore/Applications.del

Rev

Rev 2095 | Go to most recent revision | Show entire file | Regard 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'])) {
573
				if (is_null($tagsMotif) === false) {
574
					foreach ($this->parametres['masque.tag_del']['AND'] as $mc) {
574
					$sousRequete = 'SELECT ce_image '.
575
						$sousRequete = 'SELECT ce_image '.
575
						'FROM del_image_tag '.
576
							'FROM del_image_tag '.
576
						'WHERE actif = 1 '.
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']) . ")'";
-
 
583
					$sousRequete = 'SELECT ce_image '.
577
						'GROUP BY ce_image '.
584
						'FROM del_image_tag '.
-
 
585
						'WHERE actif = 1 '.
578
						"HAVING GROUP_CONCAT(DISTINCT tag_normalise ORDER BY tag_normalise) REGEXP $tagsMotif ";
586
						"AND tag_normalise REGEXP $tagsMotif ";
-
 
587
					
-
 
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 '.
594
						'AND tag_normalise LIKE '.$this->bdd->proteger($tag.'%');
-
 
Line 595... Line 604...
595
			}
604
						'AND tag_normalise LIKE '.$this->bdd->proteger($tag.'%');
596
			
605
 
-
 
606
				$this->addWhere('masque.tag_del', "di.id_image IN ($sousRequete)");
-
 
607
			}
597
			$this->addWhere('masque.tag_del', "di.id_image IN ($sousRequete)");
608
			
Line 598... Line 609...
598
		}
609
		}
599
	}
610
	}
600
	
611
	
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.