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]; |
} |