Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 1318 → Rev 1319

/trunk/services/modules/0.1/images/ListeImages.php
40,6 → 40,20
}
/** Nettoyer les paramètres pour ne pas accepter les %
* */
public function nettoyerParametres($parametres) {
$parametresRetour = array();
foreach ($parametres as $cle => $valeur) {
$valSanPourcent = trim($valeur, "% ");
if ($valSanPourcent != '') {
$parametresRetour[$cle] = $valeur;
}
}
return $parametresRetour;
}
/**
* RequeteSansParametres
*
49,6 → 63,7
* @param array $parametres les paramètres tels qu'il sont passés au script
* */
public function requeteSansParametres($ressources, $parametres) {
$estSansParametres = true;
if (sizeof($ressources) > 0) {
56,6 → 71,7
}
if (sizeof($parametres) > 2) {
// s'il y a plus de 2 paramètres, on est forcément dans le cas où on a demandé des paramètres autre que la navigation
$estSansParametres = false;
} else {
93,7 → 109,7
$this->verifierParametresTri();
$this->initialiserTri();
$parametres = $this->nettoyerParametres($parametres);
if ($this->requeteSansParametres($ressources, $parametres)) {
// Lancement du service
243,6 → 259,7
* Charger la clause WHERE en fonction des paramètres de masque
* */
private function chargerClauseWhere() {
$where = array();
$tableauMasque = $this->masque->getMasque();
if (!empty($tableauMasque)) {
335,7 → 352,11
'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '.
'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '.
'(dob.nom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').') '.
'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').') OR '.
'(nom LIKE '.$this->proteger($valeurMasque.'%').') OR '.
'(prenom LIKE '.$this->proteger($valeurMasque.'%').') OR '.
'(dob.nom_utilisateur LIKE '.$this->proteger($valeurMasque.'%').') OR '.
'(dob.prenom_utilisateur LIKE '.$this->proteger($valeurMasque.'%').') '.
')';
} else {
$masque = '(
451,44 → 472,190
* */
private function chargerLiaisons() {
$champs = array('dob.id_observation as id_observation', 'nom_sel', 'nom_sel_nn', 'nt', 'famille', 'ce_zone_geo', 'zone_geo',
'lieudit', 'station', 'milieu', 'date_observation', 'dob.mots_cles_texte as mots_cles_texte', 'dob.commentaire as commentaire',
'di.mots_cles_texte as mots_cles_texte_image ', 'date_transmission', 'di.id_image as id_image', 'di.ce_utilisateur as ce_utilisateur',
'prenom', 'nom', 'courriel', 'dob.prenom_utilisateur', 'dob.nom_utilisateur', 'dob.courriel_utilisateur', 'nom_original');
// Attention le LEFT JOIN est indispensable pour ramener les images n'ayant pas de votes
// en cas de tri par votes
$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS '.implode(', ',$champs).' '.
($this->doitJoindreTableVotes() ?
', IF(dvote.ce_protocole = '.$this->parametres['protocole'].', AVG(dvote.valeur), 0) as total_votes ' :
''
).
($this->doitJoindreTableTags() ?
// attention le DISTINCT est indispensable !
', (COUNT(DISTINCT dtag.id_tag) + '.$this->assemblercomptageOccurencesMotsClesCel().') as total_tags ' :
''
).
'FROM '.$this->gestionBdd->formaterTable('del_obs_image', 'doi').
'INNER JOIN del_image di '.
'ON doi.id_image = di.id_image '.
'INNER JOIN del_observation dob '.
'ON doi.id_observation = dob.id_observation '.
'LEFT JOIN del_utilisateur du '.
'ON du.id_utilisateur = di.ce_utilisateur '.
($this->doitJoindreTableTags() ?
'LEFT JOIN del_image_tag dtag '.
'ON doi.id_image = dtag.ce_image AND dtag.actif = 1 ' :
''
).
($this->doitJoindreTableVotes() ?
'LEFT JOIN del_image_vote dvote '.
'ON doi.id_image = dvote.ce_image AND dvote.ce_protocole = '.$this->parametres['protocole'] :
''
);
$requeteLiaisons .= $this->chargerClauseWhere();
$requeteLiaisons .= $this->getTri();
// 1. Récupérer les id observation
$requeteObs = ' SELECT id_observation FROM del_observation dob LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur ';
$masques = $this->masque->getMasque();
$conditionsObs = array();
if (isset($masques['masque'])) {
$conditionLibre = array();
$passe = $masques['masque'];
if (!isset($masques['masque.ns'])) {
$conditionsLibre[] = "nom_sel LIKE '$passe%'";
}
if (!isset($masques['masque.famille'])) {
$conditionsLibre[] = "famille LIKE '$passe%'";
}
if (!isset($masques['masque.milieu'])) {
$conditionsLibre[] = "nom_sel LIKE '$passe%'";
}
if (!isset($masques['masque.tag'])) {
$conditionsLibre[] = "mots_cles_texte LIKE '%$passe%'";
//TODO : voir pour images
}
if (!isset($masques['masque.date'])) {
$conditionsLibre[] = $this->creerFiltreDate($passe);
}
if (!isset($masques['masque.auteur'])) {
$conditionsLibre[] = $this->creerFiltreAuteur($passe);
}
$conditionsObs[] = implode(' OR ', $conditionsLibre);
}
// nom sel
if (isset($masques['masque.ns'])) {
$nom_sel = $masques['masque.ns'];
$conditionsObs[] = "nom_sel LIKE '$nom_sel%'";
}
// famille
if (isset($masques['masque.famille'])) {
$famille = $masques['masque.famille'];
$conditionsObs[] = "famille LIKE '$famille%'";
}
// genre
if (isset($masques['masque.genre'])) {
$genre = $masques['masque.genre'];
$conditionsObs[] = "nom_sel LIKE '$genre%'";
}
// milieu
if (isset($masques['masque.milieu'])) {
$milieu = $masques['masque.milieu'];
$conditionsObs[] = "nom_sel LIKE '$milieu%'";
}
// mots_cles_texte
if (isset($masques['masque.tag'])) {
$motscles = $masques['masque.tag'];
$conditionsObs[] = "mots_cles_texte LIKE '%$motscles%'";
}
// date
if (isset($masques['masque.date'])) {
$date = $masques['masque.date'];
$conditionsObs[] = $this->creerFiltreDate($date);
}
// utilisateur
if (isset($masques['masque.auteur'])) {
$auteur = $masques['masque.auteur'];
$conditionsObs[] = $this->creerFiltreAuteur($auteur);
}
// commune
if (isset($masques['masque.commune'])) {
$commune = $masques['masque.commune'];
$conditionsObs[] = " zone_geo LIKE ".$this->proteger(str_replace(array('-',' '), '_', $commune).'%');
}
// commune
if (isset($masques['masque.departement'])) {
$dept = $masques['masque.departement'];
$conditionsObs[] = $this->creerFiltreIdZoneGeo($dept);
}
if (!empty($conditionsObs)) {
$where = ' WHERE '.implode(' AND ', $conditionsObs);
$requeteObs .= $where;
}
 
$observations = $this->bdd->recupererTous($requeteObs);
$tabIdsObs = array();
foreach ($observations as $observation) {
$tabIdsObs[] = $observation['id_observation'];
}
$idsObs = implode(',', $tabIdsObs);
if ($idsObs == '') {
$idsObs = "''";
}
//var_dump($requeteObs);
// 2. Récupérer les id images
$conditionsImg = array();
if (isset($masques['masque.tag'])) {
$tag = $masques['masque.tag'];
$conditionsImg[] = " dit.tag_normalise LIKE '$tag%' ";
$conditionsImg[] = " di.mots_cles_texte LIKE '%$tag%' ";
}
 
$idsImages = '';
if (!empty($conditionsImg)) {
$requeteImages = ' SELECT doi.id_image FROM del_obs_image doi '.
' INNER JOIN del_image di ON doi.id_image = di.id_image '.
' INNER JOIN del_image_tag dit ON dit.ce_image = di.id_image ';
$where = ' WHERE '.implode(' OR ', $conditionsImg);
$requeteImages .= $where;
$images = $this->bdd->recupererTous($requeteImages);
$tabIdsImages = array();
foreach ($images as $image) {
$tabIdsImages[] = $image['id_image'];
}
$idsImages = implode(',', $tabIdsImages);
if ($idsImages == '') {
$idsImages = "''";
}
}
//var_dump($requeteImages);exit();
// 3. Récupérer la combinaison des deux
$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS dob.id_observation as id_observation, nom_sel, nom_sel_nn, nt, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, '.
' date_observation, dob.mots_cles_texte as mots_cles_texte, dob.commentaire as commentaire, di.mots_cles_texte as mots_cles_texte_image , date_transmission, '.
' di.id_image as id_image, di.ce_utilisateur as ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, nom_original '.
' FROM del_obs_image DOI '.
' INNER JOIN del_image di ON doi.id_image = di.id_image '.
' INNER JOIN del_observation dob ON doi.id_observation = dob.id_observation '.
' LEFT JOIN del_utilisateur du ON du.id_utilisateur = di.ce_utilisateur ';
$where = array();
if (!empty($conditionsObs) && strlen($idsObs) > 0) {
$where[] = 'dob.id_observation IN ( '.$idsObs.') ';
}
if (!empty($conditionsImg) && strlen($idsImages) > 0) {
$chaineWhere = 'di.id_image IN ( '.$idsImages.') ';
// Si on ne cherche pas que le tag, on doit récupérer uniquement les
// images qui matche avec la recherche d'observation
if (isset($masques['masque.tag']) && sizeof($masques) > 1) {
$chaineWhere .= ' AND doi.id_observation IN ('.$idsObs.') ';
}
$where[] = $chaineWhere;
}
if (!empty($where)) {
$requeteLiaisons .= ' WHERE '.implode(' OR ', $where);
}
// limite de la chaine idobs = 1047389
/*if (strlen($requeteLiaisons) > 1047389) {
exit('requete trop longue');
//return array();
}*/
$requeteLiaisons .= $this->gestionBdd->getLimitSql();
 
return $this->bdd->recupererTous($requeteLiaisons);
// on ne lance la requete que si on a trouvé des images ou des observations, sinon
// cela signifie qu'il n'y a aucune correspondance dans la base
$retour = array();
if (strlen($idsObs) > 0 || strlen($idsImages) > 0) {
$retour = $this->bdd->recupererTous($requeteLiaisons);
}
return $retour;
}
501,7 → 668,7
// récupérer les ids
// récupérer les observations
 
$requeteImages = 'SELECT *, di.mots_cles_texte as mots_cles_texte_image FROM del_obs_image doi '.
$requeteImages = 'SELECT *, di.mots_cles_texte as mots_cles_texte_image FROM del_obs_image doi '.
'INNER JOIN del_image di ON doi.id_image = di.id_image '.
'ORDER BY id_observation DESC'.
$this->gestionBdd->getLimitSql();