retourne champs ecologiques pour un BDNT et un num_nomen * * * Encodage en entrée : utf8 * Encodage en sortie : utf8 * @package eflore-projets * @author Mathilde SALTHUN-LASSALLE * @author Delphine CAUQUIL * @author Jean-Pascal MILCENT * @license GPL v3 * @license CECILL v2 * @version 1.0 * @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org) */ class InformationsTaxonsSup extends Commun{ protected $table = ""; private $champs_ontologiques = array(); private $format_reponse = 'informations'; protected $serviceNom = 'informations'; private $retour_format = 'max'; private $Bdd; private $requete_condition = []; private $champs_recherches = '*'; public function consulter($ressources, $parametres) { $this->ressources = $ressources; $this->parametres = $parametres; $this->traiterParametres(); $this->definirTables(); $this->traiterRessources(); $resultats = ''; foreach ($this->table_version as $version) { $this->table = $version; $requete = $this->assemblerLaRequete(); $resultat = $this->Bdd->recupererTous($requete); $versionResultat = $this->analyserResultat($resultat); if (count($this->table_version) > 1) { $resultats[$version] = $versionResultat; } else { $resultats = $versionResultat; } } return $resultats; } public function analyserResultat($resultat) { $versionResultat = null; if ($resultat == '') { $message = 'La requête SQL formée comporte une erreur!'; $code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE; throw new Exception($message, $code); } elseif ($resultat) { $versionResultat = $this->retournerResultatFormate($resultat); } return $versionResultat; } public function __construct(Conteneur $Conteneur) { $this->Bdd = $Conteneur->getBdd(); } //+--------------------------traitement ressources ou paramètres -------------------------------------------+ public function traiterRessources() { if(preg_match('/^(.+)\.nn:([0-9]+)$/', $this->ressources[0], $retour)==1){ switch ($retour[1]) { case 'bdtfx' : $this->requete_condition[] = "num_nomen = ".$retour[2]." AND bdnt = 'bdtfx' "; break; default : $e = 'Erreur dans l\'url de votre requête :
Le référentiel " ' .$retour[1].' " n\'existe pas.'; throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); break; } } } //+---- paramètres ----+ public function traiterParametres() { if (isset($this->parametres) && !empty($this->parametres) ) { foreach ($this->parametres as $param => $valeur) { switch ($param) { case 'categorie' : if ($valeur == "ecologie"){ $this->champs_recherches = ' num_nomen, bdnt, ve_lumiere_min , ve_lumiere_max,' .' ve_temperature_min, ve_temperature_max, ve_continentalite_min,' .' ve_continentalite_max, ve_humidite_atmos_min, ve_humidite_atmos_max,' .' ve_humidite_edaph_min, ve_humidite_edaph_max, ve_reaction_sol_min,' .' ve_reaction_sol_max, ve_nutriments_sol_min, ve_nutriments_sol_max,' .' ve_salinite_min, ve_salinite_max, ve_texture_sol_min,ve_texture_sol_max,' .' ve_mat_org_sol_min, ve_mat_org_sol_max '; } else { $e = "Valeur de paramètre inconnue pour 'categorie'. Ce paramètre n'est pas autorisé pour informations/#id"; throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); } break; case 'retour.format' : if ($valeur == 'min' || $valeur == 'max') { $this->retour_format = $valeur; break; } else { $e = "Valeur de paramètre inconnue pour 'retour.format'. Ce paramètre n'est pas autorisé pour informations/#id"; throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); } case 'navigation.depart' : $this->definirNavigationDepart($valeur); break; case 'navigation.limite' : $this->definirNavigationLimite($valeur); break; case 'version.projet' : $this->traiterVersion($valeur); break; default : $e = 'Erreur dans les parametres de votre requête :
Le paramètre " ' .$param.' " n\'existe pas.'; throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); break; } } } } //+++------------------------------traitement des versions----------------------------------------++ public function traiterVersion($valeur) { if (preg_match('/^[0-9]+(?:[._][0-9]+)*$/', $valeur) || $valeur == '*' || $valeur == '+') { $this->version_projet = $valeur; } else { $e = "Erreur : La version est inconnue."; throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); } if ($this->version_projet == '*' && $this->ressources == array()) { $message = "L'affichage de plusieurs versions ne fonctionne que pour les ressources de type /ressources/#id"; $code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE; throw new Exception($message, $code); } } public function definirTables() { $table_num_version = $this->recupererVersionDisponible(); $prefixe_table = config::get('bdd_table_rang_sup'); if ( in_array($this->version_projet,$table_num_version) ) { $this->table_version[] = $prefixe_table.'_v'.$this->version_projet; } elseif ($this->version_projet == '+') { $derniere_version = $table_num_version[count($table_num_version) - 1]; $this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $derniere_version); } elseif ($this->version_projet == '*') { foreach ($table_num_version as $num_version) { $this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $num_version); } } else { $e = "Erreur : La version est inconnue."; throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); } } //+--------------------------formatages de resultats -------------------------------------------+ public function retournerResultatFormate($resultat) { $this->resultat_json = $resultat[0]; if ($this->retour_format == 'max') { $graphique_presence = $this->traiterEcologie() ; if ($graphique_presence) { $this->ajouterLiensGraphique($graphique_presence); } } return $this->resultat_json ; } public function traiterEcologie() { $donnees_presence = false; $this->champs_ontologiques = Commun::s_recupererTableauConfig('Paramètres.champs_ontologiques'); foreach ($this->champs_ontologiques as $cle => $valeur){ /* Les deux tests commentés ci-dessous étaient présents dans eflore-test (uniquement) jusqu'à juin 2013. La valeur 0 pose question. cf baseflor_v2012_12_31 cf services/modules/0.1/baseflor/CommunGraphiques.php traiterValeursEcologiques() */ if ($this->resultat_json[$cle.'_min'] != "") { // && $this->resultat_json[$cle.'_min'] != 0) { $donnees_presence[$this->getNomGraphique($valeur)] = true; $tab_ontologie = $this->recupererOntologies($this->resultat_json[$cle.'_min'], $cle.'_min'); unset($this->resultat_json[$cle.'_min']); } if ($this->resultat_json[$cle.'_max'] != "") { // && $this->resultat_json[$cle.'_max'] != 0) { $this->recupererOntologies($this->resultat_json[$cle.'_max'], $cle.'_max'); unset($this->resultat_json[$cle.'_max']); } } return $donnees_presence; } //donne le nom du graphique correspondant à un champ écologique public function getNomGraphique($code_ecolo) { $graphique = null; if (in_array($code_ecolo, explode(',',Config::get('Paramètres.climat')))) { $graphique = 'climat'; } elseif (in_array($code_ecolo, explode(',', Config::get('Paramètres.sol')) )) { $graphique = 'sol'; } return $graphique; } public function ajouterLiensGraphique($graphique_presence) { if ($graphique_presence['climat']) { $this->resultat_json['graphique_climat']['libelle'] = 'climat'; $this->resultat_json['graphique_climat']['href'] = $this->ajouterHref('graphiques/climat', strtolower($this->resultat_json['bdnt']).'.nn:'.$this->resultat_json['num_nomen']); } if ($graphique_presence['sol']) { $this->resultat_json['graphique_sol']['libelle'] = 'sol'; $this->resultat_json['graphique_sol']['href'] = $this->ajouterHref('graphiques/sol', strtolower($this->resultat_json['bdnt']).'.nn:'.$this->resultat_json['num_nomen']); } } //+--------------------------traitement ontologies -------------------------------------------+ public function recupererOntologies($valeur, $champs){ $chps_sans = preg_replace("/_min|_max/", '', $champs); $url = Config::get('url_service_base').Config::get('nom_projet'). '/ontologies/'.$this->champs_ontologiques[$chps_sans].':'.urlencode(urlencode($valeur)); try { $val = $this->getBdd()->recuperer(sprintf( "SELECT a.nom FROM baseflor_ontologies a LEFT JOIN baseflor_ontologies b ON a.id = b.id LEFT JOIN baseflor_ontologies c ON b.classe_id = c.id WHERE". " b.code = BINARY '%s' AND c.code = BINARY '%s' LIMIT 0, 100", $valeur, $this->champs_ontologiques[$chps_sans]), Bdd::MODE_OBJET); $this->resultat_json[$champs.'.libelle'] = $val->nom; $this->resultat_json[$champs.'.code'] = $valeur; $this->resultat_json[$champs.'.href'] = $url; } catch (Exception $e) { $this->resultat_json[$champs.'.libelle'] = ''; $this->resultat_json[$champs.'.code'] = ''; $this->resultat_json[$champs.'.href'] = ''; } } //+--------------------------FONCTIONS D'ASSEMBLAGE DE LA REQUETE-------------------------------------------+ public function assemblerLaRequete() { $requete = ' SELECT '.$this->champs_recherches.' FROM '.$this->table.' ' .$this->retournerRequeteCondition(); return $requete; } public function retournerRequeteCondition() { $condition = ''; if (empty($this->requete_condition) == false) { $condition = ' WHERE '.implode(' AND ', $this->requete_condition); } return $condition; } } ?>