* @license GPL v3 * @license CECILL v2 * @version 0.1 * @copyright 2014 Tela Botanica (accueil@tela-botanica.org) */ class SophyCartes { const MIME_TEXT = 'text/plain'; const MIME_PNG = 'image/png'; const MIME_JSON = 'application/json'; 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) : array('binaire.href' => $url); $resultat->mime = ($this->format_retour == self::MIME_PNG) ? self::MIME_PNG : self::MIME_JSON; 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 :
'. 'Le type de carte '.$this->ressources[0].' est inconnu,
'. '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 :
'. '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 :
'. "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; } } ?>