Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 787 → Rev 790

/trunk/services/modules/0.1/observations/ListeObservations.php
26,7 → 26,7
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_departements.ini');
$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
$this->conteneur->chargerConfiguration('config_observations.ini');
$this->conteneur->chargerConfiguration('config_votes.ini');
$this->navigation = $conteneur->getNavigation();
145,7 → 145,6
private function chargerClauseWhere() {
$where = array();
$tableauMasque = $this->masque->getMasque();
// FIXME : Les communes avec une apostrophe (ex: saint michel d'euzet) arrivent dans les paramètres sans l'apostrophe
if (!empty($tableauMasque)) {
foreach($tableauMasque as $idMasque => $valeurMasque) {
153,50 → 152,32
switch ($idMasque) {
// nom du masque => nom BDD
case 'auteur' :
$auteurId = $this->masque->getMasque('auteur');
if (is_numeric($auteurId)) {
$where[] = ' ce_utilisateur = '.$auteurId;
} else {
if (strpos($auteurId, '@') === false) {
$chaineNomPrenom = $this->getChaineNomPrenom($auteurId);
$where[] = '((nom IN ('.$chaineNomPrenom.')) OR (prenom IN ('.$chaineNomPrenom.')))';
} else {
$where[] = " courriel LIKE ".$this->proteger($this->masque->getMasque('auteur').'%')." ";
}
}
$where[] = $this->creerFiltreAuteur($this->masque->getMasque('auteur'));
break;
//TODO : gérer le format de la date ?
// rechercher sur LIKE DATE % ?
// TODO : recherche sur JOUR MOIS ou ANNEE
case 'date' :
$where[] = $this->creerFiltreDate($valeurMasque);
break;
case 'departement' :
$dept = $valeurMasque;
if (is_numeric($dept)) {
$dept = sprintf('%02s', $dept);
$dept = sprintf("%-'_5s", $dept);
$where[] = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$dept);
} else {
//FIXME : et les apostrophes dans les départements ?
$deptId = $this->conteneur->getParametre($dept);
if ($deptId != null) {
$where[] = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$deptId.'%');
}
}
$where[] = $this->creerFiltreIdZoneGeo($valeurMasque);
break;
case 'genre' :
$where[] = ' '.$this->mappingFiltre['ns'].' LIKE '.$this->proteger('%'.$valeurMasque.'% %');
break;
case 'tag' :
$where[] = " mots_cles_texte LIKE ".$this->proteger($valeurMasque);
$where[] = $this->creerFiltreMotsCles($valeurMasque);
break;
case 'nn' :
$where[] = ' '.$this->mappingFiltre['nn'].' = '.$this->proteger($valeurMasque);
break;
case 'ns' :
$where[] = " nom_sel LIKE ".$this->proteger($valeurMasque.'%');
$where[] = " nom_sel LIKE ".$this->proteger($valeurMasque.'%');
break;
case 'commune' :
$where[] = ' '.$this->mappingFiltre[$idMasque].' LIKE '.$this->proteger($this->remplacerParJokerCaractere($valeurMasque).'%');
break;
case 'masque' :
$where[] = $this->creerFiltreMasqueGeneral($valeurMasque);
break;
default:
$where[] = ' '.$this->mappingFiltre[$idMasque].' LIKE '.$this->proteger('%'.$valeurMasque.'%');
}
210,6 → 191,119
}
}
private function creerFiltreMasqueGeneral($valeurMasque) {
// créer filtre auteur et idzone géo peuvent renvoyer des valeurs vides
$whereAuteur = $this->creerFiltreAuteur($valeurMasque);
$whereIdZoneGeo = $this->creerFiltreIdZoneGeo($valeurMasque);
$masqueGeneral = '( '.
(($whereAuteur != '') ? $whereAuteur.' OR ' : '' ).
(($whereIdZoneGeo != '') ? $whereIdZoneGeo.' OR ' : '' ).
'zone_geo LIKE '.$this->proteger($this->remplacerParJokerCaractere($valeurMasque).'%').' OR '.
$this->creerFiltreMotsCles($valeurMasque).' OR '.
'nom_sel LIKE '.$this->proteger($valeurMasque.'%').' OR '.
'famille LIKE '.$this->proteger($valeurMasque.'%').' OR '.
'milieu LIKE '.$this->proteger($valeurMasque).' OR '.
$this->mappingFiltre['ns'].' LIKE '.$this->proteger('%'.$valeurMasque.'% %').' OR '.
$this->creerFiltreDate($valeurMasque).
') ';
return $masqueGeneral;
}
private function creerFiltreAuteur($valeurMasque) {
$masque = '';
$auteurId = $valeurMasque;
if (is_numeric($auteurId)) {
$masque = ' ce_utilisateur = '.$auteurId;
} else {
if (strpos($auteurId, '@') === false) {
$tableauNomPrenom = explode(' ',$auteurId, 2);
if(count($tableauNomPrenom) == 2) {
// on teste potentiellement un nom prenom ou bien un prénom nom
$masque = '('.
'(nom LIKE '.$this->proteger($tableauNomPrenom[0].'%').' AND '.
'prenom LIKE '.$this->proteger($tableauNomPrenom[1].'%').') OR '.
'(nom LIKE '.$this->proteger($tableauNomPrenom[1].'%').' AND '.
'prenom LIKE '.$this->proteger($tableauNomPrenom[0].'%').')'.
')';
} else {
$masque = '(
(nom LIKE '.$this->proteger($auteurId.'%').' OR '.
'prenom LIKE '.$this->proteger($auteurId.'%').')'.
')';
}
} else {
$masque = " courriel LIKE ".$this->proteger($valeurMasque.'%')." ";
}
}
return $masque;
}
private function remplacerParJokerCaractere($valeurMasque) {
return str_replace(array('-',' '), '_', $valeurMasque);
}
//TODO: déplacer les fonctions ci dessus et dessous dans une classe
// utilitaire
function supprimerAccents($str, $charset='utf-8')
{
$str = htmlentities($str, ENT_NOQUOTES, $charset);
$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. 'œ'
$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
return $str;
}
private function obtenirIdDepartement($nomDpt) {
$nomDpt = $this->supprimerAccents($nomDpt);
$nomDpt = strtolower(str_replace(' ','-',$nomDpt));
$idDpt = $this->conteneur->getParametre($nomDpt);
if($idDpt == null || $idDpt == ' ') {
$idDpt = ' ';
}
return $idDpt;
}
private function creerFiltreIdZoneGeo($valeurMasque) {
$masque = '';
$dept = $valeurMasque;
if (is_numeric($dept)) {
$dept = sprintf('%02s', $dept);
$dept = sprintf("%-'_5s", $dept);
$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$dept);
} else {
$deptId = $this->conteneur->getParametre($dept);
if ($deptId != null) {
$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$deptId.'%');
} else {
$id = $this->obtenirIdDepartement($valeurMasque);
$masque = " ce_zone_geo LIKE ".$this->proteger('INSEE-C:'.$id.'%');
}
}
return $masque;
}
private function creerFiltreDate($valeurMasque) {
//TODO: définir dans le fichier de config un tableau contenant plusieurs format de date
// autorisés pour la recherche, qui seraient ajoutés au OR
$masque = '(';
$masque .= (is_numeric($valeurMasque)) ? ' YEAR(date_observation) = '.$this->proteger($valeurMasque).' OR ' : '';
$masque .= " DATE_FORMAT(date_observation, '%d/%m/%Y') = ".$this->proteger($valeurMasque).' '.
')';
return $masque;
}
private function creerFiltreMotsCles($valeurMasque) {
$masque = '(di.mots_cles_texte LIKE '.$this->proteger('%'.$valeurMasque.'%').' OR '.
' dob.mots_cles_texte LIKE '.$this->proteger('%'.$valeurMasque.'%').') ';
return $masque;
}
/*-------------------------------------------------------------------------------
CHARGEMENT DES OBSERVATIONS
--------------------------------------------------------------------------------*/
217,18 → 311,21
* Chargement depuis la bdd de toutes les liaisons entre images et observations
* */
private function chargerLiaisons() {
$requeteLiaisons = 'SELECT SQL_CALC_FOUND_ROWS * '.
// ajout seulement du champ mot clés de la table image liée, pour rechercher
// sur les mots clés obs et images
$requeteLiaisons = 'SELECT SQL_CALC_FOUND_ROWS *, di.mots_cles_texte '.
'FROM '.$this->gestionBdd->formaterTable('del_observation', 'dob').
'INNER JOIN '.$this->gestionBdd->formaterTable('del_obs_image', 'doi').
'ON doi.id_observation = dob.id_observation '.
'INNER JOIN del_utilisateur du '.
'ON du.id_utilisateur = doi.id_utilisateur ';
'ON du.id_utilisateur = doi.id_utilisateur '.
'INNER JOIN '.$this->gestionBdd->formaterTable('del_image', 'di').
'ON di.id_image = doi.id_image ';
$requeteLiaisons .= $this->chargerClauseWhere();
$requeteLiaisons .= ' GROUP BY doi.id_observation';
$requeteLiaisons .= ' ORDER BY date_transmission DESC ';
$requeteLiaisons .= $this->gestionBdd->getLimitSql();
 
return $this->bdd->recupererTous($requeteLiaisons);
}