569,14 → 569,24 |
if (isset($this->parametres['masque.tag_del'])) { |
$nbTags = $this->getNombreDeTags(); |
if($nbTags > 1) { |
$tagsMotif = $this->construireTagsMotif(); |
if (is_null($tagsMotif) === false) { |
// sous-requêtes car le GROUP BY avec GROUP_CONCAT est *trop* lent |
if (isset($this->parametres['masque.tag_del']['AND'])) { |
foreach ($this->parametres['masque.tag_del']['AND'] as $mc) { |
$sousRequete = 'SELECT ce_image '. |
'FROM del_image_tag '. |
'WHERE actif = 1 '. |
'GROUP BY ce_image '. |
"HAVING GROUP_CONCAT(DISTINCT tag_normalise ORDER BY tag_normalise) REGEXP $tagsMotif "; |
"AND tag_normalise LIKE '%$mc%' "; |
$this->addWhere('masque.tag_del', "di.id_image IN ($sousRequete)"); |
} |
} else if (isset($this->parametres['masque.tag_del']['OR'])) { |
$tagsMotif = "'(" . implode('|', $this->parametres['masque.tag_del']['OR']) . ")'"; |
$sousRequete = 'SELECT ce_image '. |
'FROM del_image_tag '. |
'WHERE actif = 1 '. |
"AND tag_normalise REGEXP $tagsMotif "; |
|
$this->addWhere('masque.tag_del', "di.id_image IN ($sousRequete)"); |
} |
} else { |
// Si un seul tag est demandé il se trouve dans le OR dans le cas de la recherche |
// spécifique et dans le AND dans le cas de la recherche générale |
592,11 → 602,12 |
'FROM del_image_tag '. |
'WHERE actif = 1 '. |
'AND tag_normalise LIKE '.$this->bdd->proteger($tag.'%'); |
} |
|
$this->addWhere('masque.tag_del', "di.id_image IN ($sousRequete)"); |
} |
|
} |
} |
|
private function getNombreDeTags() { |
$somme = 0; |
608,21 → 619,6 |
return $somme; |
} |
|
private function construireTagsMotif() { |
$tagsMotif = null; |
if (isset($this->parametres['masque.tag_del']['AND'])) { |
$tags = $this->parametres['masque.tag_del']['AND']; |
// ATTENTION -> optimisation: en cas de "AND" on sort() l'input et le GROUP_CONCAT() |
// donc nous utilisons des ".*" plutôt que de multiples conditions et "|" |
sort($tags); |
$tagsMotif = $this->bdd->proteger(implode('.*', $tags)); |
} else if (isset($this->parametres['masque.tag_del']['OR'])) { |
$tags = $this->parametres['masque.tag_del']['OR']; |
$tagsMotif = $this->bdd->proteger(implode('|', $tags)); |
} |
return $tagsMotif; |
} |
|
/** |
* Partie spécifique à PictoFlora: |
* Attention : si le critère de tri n'est pas suffisant, les résultats affichés peuvent varier à chaque appel |