Subversion Repositories eFlore/Projets.eflore-projets

Compare Revisions

Ignore whitespace Rev 1011 → Rev 1012

/trunk/services/configurations/config_sophy.ini
New file
0,0 → 1,26
; Encodage : UTF-8
 
; Nom du projet
nom_projet = "eflore"
 
; Nom de la base utilisée.
bdd_nom = "tb_eflore"
 
: Nom de la table contenant les informations sur les taxons
bdd_table_taxons = "bdtfx_v2_00"
 
; Nom de la table métadonnées utilisée.
bdd_table_meta = "sophy_meta"
 
; URL de base des services de ce projet
url_service="{ref:url_base}service:eflore:0.1/sophy"
 
 
; +------------------------------------------------------------------------------------------------------+
; Config spécifique au projet
; Noms des services disponibles pour ce projet
servicesDispo = "meta-donnees,cartes"
 
[Cartes]
; Chemin de base des cartes
chemin_cartes_tpl = "sophy.tela-botanica.org/DETECTERR/FLPRO10/Q%d.PNG";
/trunk/services/modules/0.1/sophy/Cartes.php
New file
0,0 → 1,163
<?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;
}
}
?>
/trunk/services/modules/0.1/Projets.php
174,6 → 174,8
return 'ChorodepCartes';
case 'moissonnage':
return 'MoissonnageCartes';
case 'sophy':
return 'SophyCartes';
}
}
 
231,6 → 233,9
case 'moissonnage':
$c = 'MoissonnageCartes';
break;
case 'sophy':
$c = 'SophyCartes';
break;
}
if($c) {
require_once($this->cheminCourrant . 'commun' . DS . 'Commun.php');