Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 1320 → Rev 1321

/trunk/services/modules/0.1/images/ListeImages.php
39,59 → 39,7
$this->bdd = $this->gestionBdd->getBdd();
}
/** 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
*
* permet de vérifier qu'il n'y a aucun paramètre dans la requete, excepté les informations de start et limite,
* pour ajuster la requête pour un gain de temps
* @param array $ressources les ressources telles qu'elles sont passées au script
* @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) {
$estSansParametres = false;
}
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 {
if (sizeof($parametres) == 1) {
if (!(isset($parametres['navigation.depart']) || isset($parametres['navigation.limite']))) {
// s'il y a des paramètres, seul les paramètres de navigation n'interfère pas sur la requête
$estSansParametres = false;
}
} elseif (sizeof($parametres) == 2) {
// s'il y a des paramètres, seul les paramètres de navigation n'interfère pas sur la requête
if (!(isset($parametres['navigation.depart']) && isset($parametres['navigation.limite']))) {
$estSansParametres = false;
}
}
}
return $estSansParametres;
}
/**
* Méthode principale de la classe.
* Lance la récupération des images dans la base et les place dans un objet ResultatService
* pour l'afficher.
99,7 → 47,6
* @param array $parametres les paramètres situés après le ? dans l'url
* */
public function consulter($ressources, $parametres) {
$this->initialiserRessourcesEtParametres($ressources, $parametres);
// Gestion des configuration du script
109,33 → 56,17
$this->verifierParametresTri();
$this->initialiserTri();
$parametres = $this->nettoyerParametres($parametres);
if ($this->requeteSansParametres($ressources, $parametres)) {
// Lancement du service
$liaisons = $this->chargerLiaisonsSimple();
$images = $this->chargerImage($liaisons);
$images = $this->chargerVotes($images);
// Mettre en forme le résultat et l'envoyer pour affichage
$resultat = new ResultatService();
$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
return $resultat;
} else {
// Lancement du service
$liaisons = $this->chargerLiaisons();
$total = $this->compterImages();
$this->navigation->setTotal($total);
$images = $this->chargerImage($liaisons);
$images = $this->chargerVotes($images);
// Mettre en forme le résultat et l'envoyer pour affichage
$resultat = new ResultatService();
$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
return $resultat;
}
// Lancement du service
$liaisons = $this->chargerLiaisons();
$total = $this->compterImages();
$this->navigation->setTotal($total);
$images = $this->chargerImage($liaisons);
$images = $this->chargerVotes($images);
// Mettre en forme le résultat et l'envoyer pour affichage
$resultat = new ResultatService();
$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
return $resultat;
}
private function initialiserRessourcesEtParametres($ressources, $parametres) {
259,7 → 190,6
* Charger la clause WHERE en fonction des paramètres de masque
* */
private function chargerClauseWhere() {
$where = array();
$tableauMasque = $this->masque->getMasque();
if (!empty($tableauMasque)) {
352,11 → 282,7
'(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].'%').') 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.'%').') '.
'dob.prenom_utilisateur LIKE '.$this->proteger($tableauNomPrenom[0].'%').') '.
')';
} else {
$masque = '(
446,7 → 372,18
//TODO: rechercher sur les mots clés normalisés dans tous les cas ?
$requeteMotsCles = $this->proteger('%'.$mot_cle.'%');
$motsCleProtege = $this->proteger($this->normaliserMotCle('%'.$mot_cle.'%'));
$requeteMotsClesImgPublic[] = 'di.id_image IN (SELECT ce_image FROM del_image_tag WHERE tag_normalise LIKE '.$motsCleProtege.' AND actif = 1)';
$requeteMotsClesImage = 'SELECT ce_image FROM del_image_tag WHERE tag_normalise LIKE '.$motsCleProtege.' AND actif = 1';
$images = $this->bdd->recupererTous($requeteMotsClesImage);
$idsImages = array();
foreach ($images as $image) {
$idsImages[] = $image['ce_image'];
}
if (!empty($idsImages)) {
$requeteMotsClesImgPublic[] = 'di.id_image IN ('.implode(',', $idsImages).')';
}
$requeteMotsClesImg[] = 'di.mots_cles_texte LIKE '.$requeteMotsCles;
$requeteMotsClesObs[] = 'dob.mots_cles_texte LIKE '.$requeteMotsCles;
}
460,7 → 397,6
'('.$requeteMotsClesImg.') OR '.
'('.$requeteMotsClesObs.') '.
')';
return $masque;
}
472,240 → 408,45
* */
private function chargerLiaisons() {
// 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%'";
}
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 ';
$chaineWhere = '';
if (isset($masques['masque.tag']) && sizeof($masques) == 1) {
$connecteur = ' OR ';
} else {
$connecteur = ' AND ';
}
$where = array();
if (!empty($conditionsObs) && strlen($idsObs) > 0) {
$where[] = ' dob.id_observation IN ( '.$idsObs.') ';
}
if (!empty($conditionsImg) && strlen($idsImages) > 0) {
$where[] = 'di.id_image IN ( '.$idsImages.') ';
}
if (!empty($where)) {
$chaineWhere = ' WHERE '.implode($connecteur, $where);
$requeteLiaisons .= $chaineWhere;
}
$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();
$requeteLiaisons .= $this->gestionBdd->getLimitSql();
// 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;
return $this->bdd->recupererTous($requeteLiaisons);
}
/**
* Chargement depuis la bdd de toutes les liaisons entre images et observations
* */
private function chargerLiaisonsSimple() {
// Charger les obs images / images
// 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 '.
'INNER JOIN del_image di ON doi.id_image = di.id_image '.
'ORDER BY id_observation DESC'.
$this->gestionBdd->getLimitSql();
$liaisons = $this->bdd->recupererTous($requeteImages);
 
$nbImages = 'SELECT count(id_image) as nb FROM del_obs_image';
$requeteNbImages = $this->bdd->recupererTous($nbImages);
$total = (int) $requeteNbImages[0]['nb'];
$this->navigation->setTotal($total);
$idsObservations = array();
foreach ($liaisons as $image) {
$idObs = $image['id_observation'];
$idsObservations[$idObs] = $idObs;
}
$requeteObservations = 'SELECT * FROM del_observation dob '.
'LEFT JOIN del_utilisateur du ON dob.ce_utilisateur = du.id_utilisateur '.
'WHERE id_observation IN ('.implode(',', $idsObservations).')';
$resultatsObservations = $this->bdd->recupererTous($requeteObservations);
$observations = array();
foreach ($resultatsObservations as $id => $observation) {
$idObs = $observation['id_observation'];
$observations[$idObs] = $observation;
}
foreach ($liaisons as $id => $liaison) {
$idObs = $liaison['id_observation'];
$observation = $observations[$idObs];
foreach ($observation as $cle => $valeur) {
$liaisons[$id][$cle] = $valeur;
}
}
return $liaisons;
}
private function assemblercomptageOccurencesMotsClesCel() {
$chaineMotsClesAffiches = $this->conteneur->getParametre('mots_cles_cel_affiches');
$tabMotsClesAffiches = explode(',',$chaineMotsClesAffiches);
765,6 → 506,7
$liaison['prenom'] = $liaison['prenom_utilisateur'];
$liaison['nom'] = $liaison['nom_utilisateur'];
}
// On enregistre l'ID de l'image pour n'effectuer qu'une seule requête par la suite
$this->imageIds[] = $idImage;
$index = $liaison['id_image'].'-'.$liaison['id_observation'];
823,6 → 565,7
* */
private function formaterObservation($liaison) {
$observation = array();
foreach ($this->mappingObservation as $nomOriginal => $nomFinal) {
$observation[$nomFinal] = $liaison[$nomOriginal];
}