Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 2119 → Rev 2120

/branches/v1.10-sodium/services/bibliotheque/Sql.php
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))";
}
}
/branches/v1.10-sodium/services/bibliotheque/ParametresFiltrage.php
330,18 → 330,18
}
}
}
// Idem pour id_zone_geo qui mappait à ce_zone_geo:
private function filtrerPays() {
// Idem pour id_zone_geo qui mappait à ce_zone_geo:
private function filtrerPays() {
if (isset($this->parametres['masque.pays'])) {
// une liste de pays séparés par des virgules est acceptable
// une liste de pays séparés par des virgules est acceptable
if (preg_match('/^([a-zA-Z]{2},)*[a-zA-Z]{2}$/', $this->parametres['masque.pays'])) {
// Nettoyage d'une virgule terminale au cas ou
$this->parametres['masque.pays'] = rtrim($this->parametres['masque.pays'], ',');
$paramFiltre = $this->parametres['masque.pays'];
$this->parametresFiltres['masque.pays'] = $paramFiltre;
}
}
$this->parametres['masque.pays'] = rtrim($this->parametres['masque.pays'], ',');
$paramFiltre = $this->parametres['masque.pays'];
$this->parametresFiltres['masque.pays'] = $paramFiltre;
}
}
}
 
/** masque.commune (zone_geo)