Rev 1014 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/**** Service Cartes** Service renvoyant la carte de flore probable issue des données sophy* (très simple, convertir un num tax en numéro fournier, puis construit l'url* de la carte)** Encodage en entrée : utf8* Encodage en sortie : utf8* @package eflore-projets* @author Aurélien PERONNET <jpm@tela-botanica.org>* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>* @version 0.1* @copyright 2014 Tela Botanica (accueil@tela-botanica.org)*/class SophyCartes {const MIME_TEXT = 'text/plain';const MIME_PNG = 'image/png';private $types_cartes_autorises = array('flore-probable');private $bdd;private $format_retour;private $type_num_demande;private $num_demande;public function consulter($ressources, $param) {// Initialisation des variables$this->ressources = $ressources;$this->param = $param;$this->traiterRessources();$this->traiterParametres();if($this->type_num_demande == "nn") {//TODO: obtenir nt grâce aux autres services$this->num_demande = $this->obtenirCorrespondanceNtPourNn($this->num_demande);$this->type_num_demande = "nt";}$resultat = $this->obtenirCarteFloreProbable($this->num_demande);return $resultat;}private function obtenirCarteFloreProbable($nt) {$num_fournier = $this->obtenirCorrespondanceFournier($nt);if($num_fournier == null) {$message = "Aucune carte n'existe pour le numéro demandé";$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;throw new Exception($message, $code);}return $this->formerCarteFloreProbable($num_fournier);}public function formerCarteFloreProbable($num_fournier) {$resultat = new ResultatService();$url = sprintf(Config::get('chemin_cartes_tpl'), $num_fournier);$resultat->corps = ($this->format_retour == self::MIME_PNG) ? self::getCartePng($url) : $url;$resultat->mime = ($this->format_retour == self::MIME_PNG) ? self::MIME_PNG : self::MIME_TEXT;return $resultat;}private static function getCartePng($url){$ch = curl_init();curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_URL, $url);$data = curl_exec($ch);curl_close($ch);return $data;}private function traiterRessources() {if(!in_array($this->ressources[0], $this->types_cartes_autorises)) {$message = 'Erreur dans les parametres de requête : </br> '.'Le type de carte '.$this->ressources[0].' est inconnu, <br />'.'Les type autorisés sont : '.implode(',', $this->types_cartes_autorises);$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;throw new Exception($message, $code);}$matches = array();if(preg_match("/([a-z]*).(nn|nt):([0-9]*)/", $this->ressources[1], $matches)) {//TODO: quoi faire du référentiel$this->type_num_demande = $matches[2];$this->num_demande = $matches[3];} else {$message = 'Erreur dans les parametres de requête : </br> '.'Le service s\'interroge sous la forme sophy/cartes/type_carte/bdtfx.nn:XXXX ou '.'sophy/cartes/type_carte/bdtfx.nt:XXXX ';$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;throw new Exception($message, $code);}}private function traiterParametres() {$formats = array('image/png', 'text/plain');$this->format_retour = self::MIME_PNG;if(isset($this->param['retour.format']) &&!in_array($this->param['retour.format'], $formats)) {$message = 'Erreur dans les parametres de recherche de votre requête : </br> '."Le paramètre retour.format ne peut prendre que les valeurs suivantes : ".implode(',', $formats)." ";$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;throw new Exception($message, $code);} else {if(isset($this->param['retour.format'])) {$this->format_retour = $this->param['retour.format'];} else {$this->format_retour = self::MIME_TEXT;}}}private function obtenirCorrespondanceFournier($num_tax) {$requete = "SELECT * FROM sophy_fournier_bdnff "."WHERE sfb_id_num_bdnff = ".$this->getBdd()->proteger($num_tax);$resultat = $this->getBdd()->recuperer($requete);$num_fournier = null;if(!empty($resultat)) {$num_fournier = $resultat['sfb_id_num_fournier'];}return $num_fournier;}private function obtenirCorrespondanceNtPourNn($num_nom) {// 90% de chances que ces cartes ne soient utilisées que bdtfx// donc on se permet une requete directe dans la table$requete = "SELECT num_taxonomique FROM ".Config::get('bdd_table_taxons')." "."WHERE num_nom = ".$this->getBdd()->proteger($num_nom);$resultat = $this->getBdd()->recuperer($requete);$num_tax = null;if(!empty($resultat)) {$num_tax = $resultat['num_taxonomique'];}return $num_tax;}//+----------------------------------------------------------------------------------------------------------------+// Méthodes d'accès aux objets du Framework/*** Méthode de connection à la base de données sur demande.* Tous les services web n'ont pas besoin de s'y connecter.*/protected function getBdd() {if (! isset($this->bdd)) {$this->bdd = new Bdd();}return $this->bdd;}}?>