12,33 → 12,214 |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version 1.0 |
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org) |
* |
* to do : éliminer l'heritage (tratement version et url.suivant url.precedent) |
*/ |
|
class Informations extends Commun{ |
class Informations extends Commun { |
|
private $info_tables = array('InformationsBaseflor', 'InformationsTaxonsSup'); |
protected $limite_requete = array( 'depart' => 0, 'limite' => 10); |
private $table = ""; |
private $champs_recherches = '*'; |
private $requete_condition = ""; |
private $requete_jointure = ""; |
protected $serviceNom = 'informations'; |
|
public function consulter($ressources, $parametres) { |
|
$this->ressources = $ressources; |
$this->parametres = $parametres; |
$versionResultat = null; |
foreach ($this->info_tables as $info_tab) { |
$info = new $info_tab(); |
$versionResultat = $info->consulter($ressources, $parametres); |
if($versionResultat != null) { |
break; |
} |
if (empty($this->ressources)){ |
$this->traiterParametres(); |
} |
|
$this->traiterRessources(); |
$requete = $this->Requete_assemblage->assemblerLaRequete($this->Requete); |
$resultat = $this->Bdd->recupererTous($requete); |
$versionResultat = $this->analyserResultat($resultat); |
if ($versionResultat == null) { |
$message = 'Les données recherchées sont introuvables.'; |
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE; |
throw new Exception($message, $code); |
} |
|
return $versionResultat; |
} |
|
public function __construct() { |
$this->Conteneur = new Conteneur(); |
$this->Bdd = $this->Conteneur ->getBdd(); |
$this->Requete = new Requete(); |
$this->Requete_assemblage = $this->Conteneur->getRequetesAssemblage(); |
} |
|
public function analyserResultat($resultat) { |
$res_formate = array(); |
if (empty($this->ressources)) { |
$res_formate = $this->retournerResultatFormate($resultat); |
} else { |
$classe = empty($resultat[0]['baseflor']) ? 'InformationsTaxonsSup' : 'InformationsBaseflor'; |
$info = new $classe(new Conteneur()); |
$res_formate = $info->consulter($this->ressources, $this->parametres); |
} |
return $res_formate; |
} |
|
|
|
//+--------------------------traitement ressources ou paramètres -------------------------------------+ |
|
//spécifiques à /informations |
public function traiterRessources() { |
$prefixe_table = array ('index' => config::get('bdd_table_index'), |
'baseflor' => config::get('bdd_table'), |
'rangSup' => config::get('bdd_table_rang_sup')); |
$tables = $this->definirTables($prefixe_table); |
if (empty($this->ressources)) { |
$this->Requete->limite_besoin = true; |
$this->Requete->table = $tables['index']; |
$baseflor = $tables['baseflor']; |
$rangSup = $tables['rangSup']; |
$this->Requete->requete_jointure = array( |
array('type' => 'LEFT JOIN', 'table' => $baseflor, |
'on' => array("{$baseflor}.cle = {$this->Requete->table}.baseflor")), |
array('type' => 'LEFT JOIN', 'table' => $rangSup , |
'on' => array("{$rangSup}.cle = {$this->Requete->table}.RangSup")) |
); |
$this->Requete->champs_recherches = " {$baseflor}.num_nomen as 'baseflor.nn', |
{$baseflor}.BDNT as 'baseflor.bdnt', {$baseflor}.catminat_code, {$baseflor}.num_taxon , |
{$rangSup}.num_nomen as 'rangSup.nn', {$rangSup}.bdnt as 'rangSup.bdnt', |
{$this->Requete->table}.cle as 'index.cle' "; |
} else { |
if(preg_match('/^(.+)\.nn:([0-9]+)$/', $this->ressources[0], $retour)){ |
$this->Requete->table = $tables['index']; |
$this->Requete->champs_recherches = " baseflor, rangSup "; |
$this->Requete->requete_condition[] = " `bdnt.nn` = '{$retour[0]}' "; |
} else { |
$e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.'; |
throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); |
break; |
} |
} |
} |
|
//paramètres spécifiques à /informations |
public function traiterParametres() { |
if (isset($this->parametres) && !empty($this->parametres) ) { |
foreach ($this->parametres as $param => $valeur) { |
switch ($param) { |
case 'navigation.depart' : |
if (isset($this->parametres['navigation.limite'])) { |
if(preg_match('/^([0-9]+)$/', $valeur)){ |
$this->Requete->limite_requete['depart'] = $valeur; |
$this->limite_requete['depart'] = $valeur; |
break; |
} else { |
$e = "Erreur : valeur erronnée pour le paramètre navigation.depart."; |
throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); |
} |
} else { |
$e = "indiquez également la valeur pour le paramètre navigation.limite."; |
throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); |
} |
case 'navigation.limite' : |
if (isset($this->parametres['navigation.depart'])) { |
if(preg_match('/^([0-9]+)$/', $valeur) && $valeur != 0){ |
$this->Requete->limite_requete['limite'] = $valeur; |
$this->limite_requete['limite'] = $valeur; |
break; |
} else { |
$e = "Erreur : valeur erronnée pour le paramètre navigation.limite."; |
throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); |
} |
} else { |
$e = "indiquez également la valeur pour le paramètre navigation.depart."; |
throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); |
} |
case 'version.projet' : |
$this->traiterVersion($valeur); |
break; |
default : |
$e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " ' |
.$param.' " n\'existe pas.'; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e); 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 == '*' && empty($this->ressources)) { |
$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($prefixe_table) { |
$table_num_version = $this->recupererVersionDisponible(); |
foreach ($prefixe_table as $nom => $prefixe ) { |
if ( in_array($this->version_projet,$table_num_version) ) { |
$tables[$nom] = $prefixe.'_v'.$this->version_projet; |
} elseif ($this->version_projet == '+') { |
$derniere_version = $table_num_version[count($table_num_version) - 1]; |
$tables[$nom] = $prefixe.'_v'.str_replace('.', '_', $derniere_version); |
} else { |
$e = "Erreur : La version est inconnue."; |
throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); |
} |
} |
return $tables; |
} |
|
|
//+--------------------------formatages de resultats -------------------------------------------+ |
|
public function retournerResultatFormate($resultat) { |
$resultat_json = array(); |
$resultat_json['entete'] = $this->ajouterEnteteResultat(); |
foreach ($resultat as $ligne => $tab) { |
$num = $tab['index.cle']; |
$resultat_json['resultats'][$num]['num_nomen'] = |
(empty ($tab['baseflor.nn'])) ? $tab['rangSup.nn'] : $tab['baseflor.nn']; |
$resultat_json['resultats'][$num]['bdnt'] = |
(empty ($tab['baseflor.bdnt'])) ? $tab['rangSup.bdnt'] : $tab['baseflor.bdnt']; |
$resultat_json['resultats'][$num]['catminat_code'] = |
(empty ($tab['catminat_code'])) ? '' : $tab['catminat_code']; |
$resultat_json['resultats'][$num]['num_taxon'] = |
(empty ($tab['num_taxon'])) ? '' : $tab['num_taxon']; |
|
if ($resultat_json['resultats'][$num]['num_nomen'] != 0) { |
$bdnt = strtolower($resultat_json['resultats'][$num]['bdnt']); |
$nn = $resultat_json['resultats'][$num]['num_nomen']; |
$resultat_json['resultats'][$num]['href'] = |
$this->ajouterHref('informations',$bdnt.".nn:".$nn); |
} |
} |
return $resultat_json; |
} |
|
|
public function ajouterEnteteResultat() { |
$entete['depart'] = $this->Requete->limite_requete['depart']; |
$entete['limite'] = $this->Requete->limite_requete['limite']; |
$entete['total'] = $this->Requete_assemblage->getTotal_resultat(); |
$entete['version'] = $this->version_projet; |
$url = $this->formulerUrl($this->Requete_assemblage->getTotal_resultat(), '/informations'); |
if (isset($url['precedent']) && $url['precedent'] != '') { |
$entete['href.precedent'] = $url['precedent']; |
} |
if (isset($url['suivant']) && $url['suivant'] != '') { |
$entete['href.suivant'] = $url['suivant']; |
} |
return $entete; |
} |
|
|
} |