26,7 → 26,7 |
|
public function __construct(Conteneur $conteneur = null) { |
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur; |
$this->conteneur->chargerConfiguration('config_departements_bruts.ini'); |
$this->conteneur->chargerConfiguration('config_departements.ini'); |
$this->conteneur->chargerConfiguration('config_observations.ini'); |
$this->conteneur->chargerConfiguration('config_votes.ini'); |
$this->navigation = $conteneur->getNavigation(); |
145,6 → 145,7 |
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) { |
|
152,32 → 153,50 |
switch ($idMasque) { |
// nom du masque => nom BDD |
case 'auteur' : |
$where[] = $this->creerFiltreAuteur($this->masque->getMasque('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').'%')." "; |
} |
} |
break; |
case 'date' : |
$where[] = $this->creerFiltreDate($valeurMasque); |
break; |
|
//TODO : gérer le format de la date ? |
// rechercher sur LIKE DATE % ? |
// TODO : recherche sur JOUR MOIS ou ANNEE |
case 'departement' : |
$where[] = $this->creerFiltreIdZoneGeo($valeurMasque); |
$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.'%'); |
} |
} |
break; |
case 'genre' : |
$where[] = ' '.$this->mappingFiltre['ns'].' LIKE '.$this->proteger('%'.$valeurMasque.'% %'); |
break; |
case 'tag' : |
$where[] = $this->creerFiltreMotsCles($valeurMasque); |
$where[] = " mots_cles_texte LIKE ".$this->proteger($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.'%'); |
} |
191,119 → 210,6 |
} |
} |
|
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 |
--------------------------------------------------------------------------------*/ |
311,21 → 217,18 |
* Chargement depuis la bdd de toutes les liaisons entre images et observations |
* */ |
private function chargerLiaisons() { |
// 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 '. |
|
$requeteLiaisons = 'SELECT SQL_CALC_FOUND_ROWS * '. |
'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 '. |
'INNER JOIN '.$this->gestionBdd->formaterTable('del_image', 'di'). |
'ON di.id_image = doi.id_image '; |
'ON du.id_utilisateur = doi.id_utilisateur '; |
$requeteLiaisons .= $this->chargerClauseWhere(); |
$requeteLiaisons .= ' GROUP BY doi.id_observation'; |
$requeteLiaisons .= ' ORDER BY date_transmission DESC '; |
$requeteLiaisons .= $this->gestionBdd->getLimitSql(); |
|
|
return $this->bdd->recupererTous($requeteLiaisons); |
} |
|