569,13 → 569,23 |
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 '. |
"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 '. |
'GROUP BY ce_image '. |
"HAVING GROUP_CONCAT(DISTINCT tag_normalise ORDER BY tag_normalise) REGEXP $tagsMotif "; |
"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 |
592,9 → 602,10 |
'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)"); |
} |
|
$this->addWhere('masque.tag_del', "di.id_image IN ($sousRequete)"); |
} |
} |
|
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 |
743,100 → 739,100 |
$resultat = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre -- '.__FILE__.':'.__LINE__); |
return intval($resultat['nbre']); |
} |
|
public function getRequeteIdObsMonactiviteTout($id_utilisateur, $limite = "") { |
/* |
Une action c'est : |
- Quelqu'un commente mon observation |
- Quelqu'un fait une proposition sur mon observation |
|
- Quelqu'un vote pour ma proposition |
- Quelqu'un commente ma proposition ou mon commentaire |
|
- Quelqu'un vote pour une proposition sur mon observation |
- Quelqu'un commente une proposition ou un commentaire sur mon observation |
|
public function getRequeteIdObsMonactiviteTout($id_utilisateur, $limite = "") { |
/* |
Une action c'est : |
- Quelqu'un commente mon observation |
- Quelqu'un fait une proposition sur mon observation |
|
- Quelqu'un vote pour ma proposition |
- Quelqu'un commente ma proposition ou mon commentaire |
|
- Quelqu'un vote pour une proposition sur mon observation |
- Quelqu'un commente une proposition ou un commentaire sur mon observation |
*/ |
|
// on selectionne aussi la combinaison des champs de date afin que la liste soit triée correctement |
// pas d'autre meilleure solution mais attention ce comportement dépend entièrement de mysql |
$requete = "SELECT SQL_CALC_FOUND_ROWS DISTINCT id_observation, ".$this->getCombinaisonChampsDateMax()." as date_max FROM del_observation do ". |
$this->getJointureMonActivite($id_utilisateur). |
$this->getConditionMonActivite($id_utilisateur). |
"ORDER BY date_max DESC ". |
// pas d'autre meilleure solution mais attention ce comportement dépend entièrement de mysql |
$requete = "SELECT SQL_CALC_FOUND_ROWS DISTINCT id_observation, ".$this->getCombinaisonChampsDateMax()." as date_max FROM del_observation do ". |
$this->getJointureMonActivite($id_utilisateur). |
$this->getConditionMonActivite($id_utilisateur). |
"ORDER BY date_max DESC ". |
$limite; |
|
return $requete; |
|
return $requete; |
} |
|
public function getRequeteNbEvenementsDepuisDate($id_utilisateur, $date) { |
$requete = "SELECT COUNT(DISTINCT id_observation) as nb_evenements FROM del_observation do ". |
$this->getJointureMonActivite($id_utilisateur). |
$requete = "SELECT COUNT(DISTINCT id_observation) as nb_evenements FROM del_observation do ". |
$this->getJointureMonActivite($id_utilisateur). |
$this->getConditionMonActivite($id_utilisateur). |
"AND ".$this->getCombinaisonChampsDateMax()." > '".$date."' ". |
"ORDER BY ".$this->getCombinaisonChampsDateMax()." DESC "; |
|
"AND ".$this->getCombinaisonChampsDateMax()." > '".$date."' ". |
"ORDER BY ".$this->getCombinaisonChampsDateMax()." DESC "; |
|
return $requete; |
} |
|
public function getEvenementsObs($idsObsConcat, $id_utilisateur) { |
$sous_champ_date_max = $this->getCombinaisonChampsDateMax()." as date_max"; |
$sous_champ_date_max = $this->getCombinaisonChampsDateMax()." as date_max"; |
$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, ". |
"do.date_observation as date_obs, dcp.date_validation as date_validation, dcpr.date as date_com_reponse, ". |
"dcvp.nom_sel as nom_sel_com_parent"; |
"dcvp.nom_sel as nom_sel_com_parent"; |
$sous_champs_utilisateurs = "dc.ce_utilisateur as utilisateur_commentaire, dcp.ce_utilisateur as utilisateur_commentaire_valide, ". |
"dcv.ce_utilisateur as utilisateur_vote_commentaire, do.ce_utilisateur as utilisateur_observation, ". |
"dcp.ce_validateur as utilisateur_validation, dcvp.ce_utilisateur as utilisateur_commentaire_vote, ". |
"dcpr.ce_utilisateur as utilisateur_commentaire_reponse"; |
"dcpr.ce_utilisateur as utilisateur_commentaire_reponse"; |
|
$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, ". |
"dcvp.nom_sel as proposition_commentaire_nom_sel_votee, dcpr.texte as proposition_commentaire_texte_commente"; |
"dcvp.nom_sel as proposition_commentaire_nom_sel_votee, dcpr.texte as proposition_commentaire_texte_commente"; |
|
$requete = "SELECT DISTINCT id_observation, ".$sous_champs_utilisateurs.", ".$sous_champ_date_max.", ".$sous_champ_date.", ".$sous_champs_infos." ". |
"FROM del_observation do ". |
$this->getJointureMonActivite($id_utilisateur). |
$this->getConditionMonActivite($id_utilisateur). |
"AND id_observation IN ($idsObsConcat) ORDER BY date_max DESC"; |
|
$requete = "SELECT DISTINCT id_observation, ".$sous_champs_utilisateurs.", ".$sous_champ_date_max.", ".$sous_champ_date.", ".$sous_champs_infos." ". |
"FROM del_observation do ". |
$this->getJointureMonActivite($id_utilisateur). |
$this->getConditionMonActivite($id_utilisateur). |
"AND id_observation IN ($idsObsConcat) ORDER BY date_max DESC"; |
|
$evenements = $this->bdd->recupererTous($requete); |
return $evenements; |
} |
|
public function getJointureMonActivite($id_utilisateur) { |
return // quelqu'un commente mon observation ou fait une proposition |
"LEFT JOIN del_commentaire dc ON do.id_observation = dc.ce_observation ". |
" AND do.ce_utilisateur = ".$id_utilisateur." ". |
" AND dc.ce_utilisateur != ".$id_utilisateur." ". |
// quelqu'un valide ma proposition (et ce n'est pas moi qui l'ai validée) |
"LEFT JOIN del_commentaire dcp ON do.id_observation = dcp.ce_observation ". |
" AND dcp.nom_sel IS NOT NULL AND dcp.ce_validateur != ".$id_utilisateur." ". |
" AND dcp.ce_validateur != 0 ". |
" AND dcp.date_validation IS NOT NULL ". |
" AND dcp.ce_utilisateur = ".$id_utilisateur." ". |
// quelqu'un vote pour ma proposition ou sur une proposition sur une de mes observations |
"LEFT JOIN del_commentaire dcvp ON do.id_observation = dcvp.ce_observation ". |
"LEFT JOIN del_commentaire_vote dcv ON dcv.ce_proposition = dcvp.id_commentaire ". |
public function getJointureMonActivite($id_utilisateur) { |
return // quelqu'un commente mon observation ou fait une proposition |
"LEFT JOIN del_commentaire dc ON do.id_observation = dc.ce_observation ". |
" AND do.ce_utilisateur = ".$id_utilisateur." ". |
" AND dc.ce_utilisateur != ".$id_utilisateur." ". |
// quelqu'un valide ma proposition (et ce n'est pas moi qui l'ai validée) |
"LEFT JOIN del_commentaire dcp ON do.id_observation = dcp.ce_observation ". |
" AND dcp.nom_sel IS NOT NULL AND dcp.ce_validateur != ".$id_utilisateur." ". |
" AND dcp.ce_validateur != 0 ". |
" AND dcp.date_validation IS NOT NULL ". |
" AND dcp.ce_utilisateur = ".$id_utilisateur." ". |
// quelqu'un vote pour ma proposition ou sur une proposition sur une de mes observations |
"LEFT JOIN del_commentaire dcvp ON do.id_observation = dcvp.ce_observation ". |
"LEFT JOIN del_commentaire_vote dcv ON dcv.ce_proposition = dcvp.id_commentaire ". |
"AND (dcvp.ce_utilisateur = $id_utilisateur OR do.ce_utilisateur = $id_utilisateur) ". |
"AND dcv.ce_utilisateur != $id_utilisateur ". |
"AND dcv.ce_utilisateur != $id_utilisateur ". |
"AND dcv.ce_utilisateur != dcvp.ce_utilisateur ". |
// Quelqu'un répond à l'un de mes commentaires ou commente une de mes propositions |
"LEFT JOIN del_commentaire dcpr ON do.id_observation = dcpr.ce_observation ". |
"AND dcpr.ce_commentaire_parent = dcvp.id_commentaire AND dcvp.ce_utilisateur = $id_utilisateur "; |
} |
|
public function getConditionMonActivite($id_utilisateur, $type = "autres") { |
//TODO: gérer les cas suivants : |
// demander les activités des autres sur mes obs ou propositions (c'est dejà le cas) |
// demander mes activités |
// demander toutes les activités (combinaisons des deux cas ci dessus) |
return // Vérification que l'évènement me concerne (de près ou ou de loin) |
"WHERE (do.ce_utilisateur = $id_utilisateur OR dc.ce_utilisateur = $id_utilisateur ". |
"AND dcpr.ce_commentaire_parent = dcvp.id_commentaire AND dcvp.ce_utilisateur = $id_utilisateur "; |
} |
|
public function getConditionMonActivite($id_utilisateur, $type = "autres") { |
//TODO: gérer les cas suivants : |
// demander les activités des autres sur mes obs ou propositions (c'est dejà le cas) |
// demander mes activités |
// demander toutes les activités (combinaisons des deux cas ci dessus) |
return // Vérification que l'évènement me concerne (de près ou ou de loin) |
"WHERE (do.ce_utilisateur = $id_utilisateur OR dc.ce_utilisateur = $id_utilisateur ". |
"OR dcp.ce_utilisateur = $id_utilisateur OR dcv.ce_utilisateur = $id_utilisateur ". |
"OR dcvp.ce_utilisateur = $id_utilisateur) AND ". |
// mais qu'il y a au moins eu une action de la part d'une autre personne |
"(dc.ce_utilisateur IS NOT NULL OR dcp.ce_utilisateur IS NOT NULL OR dcv.ce_utilisateur IS NOT NULL) "; |
"OR dcvp.ce_utilisateur = $id_utilisateur) AND ". |
// mais qu'il y a au moins eu une action de la part d'une autre personne |
"(dc.ce_utilisateur IS NOT NULL OR dcp.ce_utilisateur IS NOT NULL OR dcv.ce_utilisateur IS NOT NULL) "; |
} |
|
private function getCombinaisonChampsDateMax() { |
return "GREATEST(IFNULL(dc.date,0), IFNULL(dcv.date,0), IFNULL(do.date_observation,0), IFNULL(dcp.date_validation,0), IFNULL(dcpr.date,0))"; |
|
private function getCombinaisonChampsDateMax() { |
return "GREATEST(IFNULL(dc.date,0), IFNULL(dcv.date,0), IFNULL(do.date_observation,0), IFNULL(dcp.date_validation,0), IFNULL(dcpr.date,0))"; |
} |
} |