Rev 132 | Blame | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Classe mère du module Liste.** @category PHP 5.2* @package eflore-consultation* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @author Delphine CAUQUIL <delphine@tela-botanica.org>* @copyright 2011 Tela-Botanica* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2* @version $Id$*/class Resultat extends aControleur {private $resultatType = 'determination';private $masqueRecherche = '';private $projetImg = 'cel';private $reftaxCourant = 'bdtfx';public function initialiser() {$this->capturerParametres();$this->reftaxCourant = Registre::get('parametres.referentiel');$this->projetImg = Config::get($this->reftaxCourant.'.referentielImages');}private function capturerParametres() {if (isset($_GET['resultat'])) {$this->resultatType = $_GET['resultat'];}if (isset($_GET['nom'])) {$this->masqueRecherche = $_GET['nom'];}}public function executerActionParDefaut() {$this->executerResultat();}public function executerResultat() {$resultats = Registre::get('resultats');$donnees = array();$donnees['typeResultat'] = $this->resultatType;$donnees['urlResAlphab'] = $this->obtenirUrlResultatAlphab();$donnees['urlResRetenu'] = $this->obtenirUrlResultatRetenu();$donnees['urlResDetermination'] = $this->obtenirUrlResultatDetermination();$donnees['urlResDecompo'] = $this->obtenirUrlResultatDecompo();$donnees['nbreTaxons'] = $resultats['entete']['total'];$donnees['nomsHtml'] = $this->getNoms($resultats['resultat']);$this->setSortie(self::RENDU_CORPS, $this->getVue('resultat', $donnees));}private function getNoms($resultats) {$noms = null;$methode = 'genererListe'.ucwords($this->resultatType);$noms = $this->$methode($resultats);return $noms;}private function genererListeAlphab($resultats) {$noms = $this->trierParAlphabNaturel($resultats);$noms = $this->surlignerNoms($noms);$donnees = array();$donnees['noms'] = $noms;return $this->getVue('resultat_liste_noms', $donnees);}private function surlignerNoms($noms) {foreach ($noms as $id => $nom) {$noms[$id]['nom_sci'] = $this->surlignerMotsMasqueRecherche($nom['nom_sci']);}return $noms;}private function surlignerMotsMasqueRecherche($nom) {$mots = explode(' ', $this->masqueRecherche);foreach ($mots as $mot) {$nom = $this->surlignerMotDansTxt($mot, $nom);}return $nom;}private function surlignerMotDansTxt($mot, $txt){$ind = stripos($txt, $mot);$len = strlen($mot);$surlignage = $txt;if ($ind !== false){$debut = substr($txt, 0, $ind);$milieu = substr($txt, $ind, $len);$fin = $this->surlignerMotDansTxt($mot, substr($txt, $ind + $len));$surlignage = $debut.'<span class="surlignage">'.$milieu.'</span>'.$fin;}return $surlignage;}private function trierParAlphabNaturel($noms) {$noms = Tableau::trierMDType($noms, array('nom_sci' => SORT_ASC), Tableau::TRI_NATUREL);return $noms;}private function genererListeRetenu($resultats) {$noms = $this->trierParNomsRetenus($resultats);$noms = $this->surlignerNoms($noms);$donnees = array();$donnees['noms'] = $noms;return $this->getVue('resultat_liste_noms', $donnees);}private function trierParNomsRetenus($noms) {$nomsRetenus = array();$nomsSynonymes = array();foreach ($noms as $id => $nom) {if ($nom['retenu'] == 'true') {$nomsRetenus[$id] = $nom;} else {$nomsSynonymes[$id] = $nom;}}$nomsRetenus = Tableau::trierMDType($nomsRetenus, array('nom_sci' => SORT_ASC), Tableau::TRI_NATUREL);$nomsSynonymes = Tableau::trierMDType($nomsSynonymes, array('nom_sci' => SORT_ASC), Tableau::TRI_NATUREL);$noms = array_merge($nomsRetenus, $nomsSynonymes);return $noms;}private function genererListeDetermination($resultats) {$donnees = array();$donnees['imagesUrls'] = $this->obtenirUrlsPhotos($resultats);$noms = $this->extraireNomsPourDetermination($resultats);$donnees['nomsSansCorrespondance'] = isset($noms['nsc']) ? $noms['nsc'] : false;$noms = isset($noms['nac']) ? $noms['nac'] : false;if ($noms) {$noms = $this->tierNomsPourDetermination($noms);$noms = $this->surlignerNomsPourDetermination($noms);}$donnees['noms'] = $noms;return $this->getVue('resultat_determination_noms', $donnees);}private function obtenirUrlsPhotos($noms) {$ids = $this->extraireIdDesNoms($noms);$Images = new Images($this->projetImg);$urls = $Images->getUrlsImagesParIdsNoms($ids);$urlsReftaxCourant = $this->supprimerCodeReftaxDesIds($urls);return $urlsReftaxCourant;}private function extraireIdDesNoms($noms) {$ids = array();foreach ($noms as $id => $nom) {$ids[] = $id;}return $ids;}private function supprimerCodeReftaxDesIds($urls) {$codeReftax = $this->reftaxCourant.'.';foreach ($urls as $id => $url) {$id = str_replace($codeReftax, '', $id);$urls[$id] = $url;}return $urls;}private function surlignerNomsPourDetermination($noms) {foreach ($noms as $idNom => $nom) {$nom['nom_sci_retenu'] = $this->surlignerMotsMasqueRecherche($nom['nom_sci_retenu']);if (isset($nom['synonymes'])) {foreach ($nom['synonymes'] as $idSyn => $synonyme) {$nom['synonymes'][$idSyn]['nom_sci'] = $this->surlignerMotsMasqueRecherche($synonyme['nom_sci']);}}$noms[$idNom] = $nom;}return $noms;}private function extraireNomsPourDetermination($noms) {$nomsSansCorrespondance = array();$nomsAvecCorrespondance = array();foreach ($noms as $idNomCourant => $nom) {if ($nom['retenu'] == 'true') {$nomRetenu = array();$nomRetenu['nom_sci_retenu'] = $nom['nom_sci'];$nomRetenu['url'] = $this->obtenirUrlFiche($idNomCourant);$nomsAvecCorrespondance[$idNomCourant] = $nomRetenu;} else {if ($nom['nom_retenu'] == null) {$nomsSansCorrespondance[$idNomCourant] = $nom['nom_sci'];} else {$idNomRetenu = $nom['nom_retenu.id'];if (array_key_exists($nom['nom_retenu.id'], $nomsAvecCorrespondance) == false) {$nomRetenu = array();$nomRetenu['nom_sci_retenu'] = $nom['nom_retenu'];$nomRetenu['url'] = $this->obtenirUrlFiche($idNomRetenu);$nomsAvecCorrespondance[$idNomRetenu] = $nomRetenu;}$nomsAvecCorrespondance[$idNomRetenu]['synonymes'][] = array('nn' => $idNomCourant, 'nom_sci' => $nom['nom_sci']);}}}$nomsPourDetermination = array();if (count($nomsSansCorrespondance) > 0) {$nomsPourDetermination['nsc'] = $nomsSansCorrespondance;}if (count($nomsAvecCorrespondance) > 0) {$nomsPourDetermination['nac'] = $nomsAvecCorrespondance;}return $nomsPourDetermination;}public function tierNomsPourDetermination($noms) {$nom_demande_ss = strtolower(Chaine::supprimerAccents($this->masqueRecherche));foreach ($noms as $id => $nom) {$nom_flou_ss = strtolower(Chaine::supprimerAccents($nom['nom_sci_retenu']));$stat = array();// Prime pour la ressemblance globale :$score = 500 - levenshtein($nom_flou_ss, $nom_demande_ss);// On affine$score = $score + (similar_text($nom_demande_ss, $nom_flou_ss) * 3);$nom['score'] = $score;$noms[$id] = $nom;}$noms = Tableau::trierMD($noms, array('score' => SORT_DESC));return $noms;}private function genererListeDecompo($noms) {return '<p>À réaliser</p>';}}?>