Rev 1239 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Classe mère de l'API 0.1 d'eFLore.** @category PHP 5.2* @package eflore-consultation* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @author Delphine CAUQUIL <delphine@tela-botanica.org>* @copyright 2011 Tela-Botanica* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2* @version $Id$*/abstract class Eflore {const RANG_FAMILLE = 180;const RANG_GENRE = 220;const RANG_ESPECE = 290;const API_EFLORE = '';const API_DEL = 'del';const PROTOCOLE_CARACTERES = 1;const PROTOCOLE_CAPITALISATION = 3;const PROTOCOLE_DEFI = 4;const PROTOCOLE_GENTIANE_AZURE = 5;private $entete = null;private $projet = null;private $api = null;public function __construct($projet = null) {$this->projet = Registre::get('parametres.referentiel');if (!is_null($projet)) {$this->projet = $projet;}$this->api = self::API_EFLORE;}public function setApi($api) {$this->api = $api;return $this;}public function getApi() {return $this->api;}public function setProjet($projet) {$this->projet = $projet;}public function getProjet() {return $this->projet;}public function getEnteteTotal() {return $this->entete['total'];}/*** Récupère un squelette d'URL dans le fichier de configuration, en fonction de l'API spécifiée dans $this->api** @param string $squelette squelette d'URL à chercher dans le fichier de config, sans le préfixe d'API* @param string $api forcer l'API, false par défaut pour utiliser l'API spécifié dans $this->api (utiliser les constantes)* @throws Exception si la clef générée n'est pas présente dans le fichier de configuration*/protected function obtenirSqueletteSelonApi($squelette) {$api = $this->api;if ($api != '') {$squelette = ucfirst($squelette);}$clef = $api . $squelette . 'Tpl';if (Config::existe($clef)) {return Config::get($clef);} else {throw new Exception("Squelette indisponible pour l'API spécifiée");}}/*** Formate une url à partir d'un template contenant des paramètres à remplacer sous la forme {monParametre}.* Le tableau associatif de paramètres doit contenir en clé le paramêtre (monParametre) sans les accolades,* la valeur correspondante sera la valeur de remplacement.* Par défaut, les parametres suivant sont pris en compte par cette méthode :* - {projet} : le code du référentiel courrant ou définit dans le constructeur de l'objet métier.** @param String $tpl le squelette d'url à formater.* @param Array $parametres le tableau de parametres (sans accolades pour les clés).*/public function formaterUrl($tpl, Array $parametres) {$parametres = $this->ajouterParametreParDefaut($parametres);foreach($parametres as $key=> $value) {if(is_array($value)) {$value = implode(',', $value);}$tpl = str_replace('{'.$key.'}',rawurlencode($value),$tpl);}return $tpl;}public function ajouterParametreParDefaut(Array $parametres) {$parametres['projet'] = isset($parametres['projet']) ? $parametres['projet'] : $this->projet;return $parametres;}/*** Permet de consulter une url et retourne le résultat ou une erreur** @param $url l'url du service à appeler pour charger les données. */protected function chargerDonnees($url) {$resultat = false;$json = $this->getRestClient()->consulter($url);$entete = $this->getRestClient()->getReponseEntetes();//Si le service meta-donnees fonctionne correctement, l'entete comprend la clé wrapper_dataif (isset($entete['wrapper_data'])) {$forceTableauAssociatif = true;$resultat = json_decode($json, $forceTableauAssociatif);$this->entete = (isset($resultat['entete'])) ? $resultat['entete'] : null;} else {$m = "L'url <a href=\"$url\">$url</a> lancée via RestClient renvoie une erreur";trigger_error($m, E_USER_WARNING);}return $resultat;}/*** Permet de consulter une url et retourne le résultat ou une erreur** @param $url l'url du service à appeler pour charger les données. */protected function chargerDonneesRecursivement($url) {$resultat = false;$resultat = $this->chargerDonnees($url);if (isset($resultat['entete']['href.suivant'])) {$resultatSuivant = $this->chargerDonneesRecursivement($resultat['entete']['href.suivant']);if ($resultatSuivant) {// utilisation de + obligatoire pour ne pas casser l'indexation par des ids// numériques (au lieu de array merge)$resultat['resultat'] = $resultat['resultat'] + $resultatSuivant['resultat'];}}return $resultat;}//+----------------------------------------------------------------------------------------------------------------+// GESTION DES CLASSES CHARGÉES À LA DEMANDEprivate function getRestClient() {if (!isset($this->restClient)) {$this->restClient = new RestClient();}return $this->restClient;}static function s_formaterUrl($tpl, Array $parametres, $enc = TRUE) {foreach($parametres as $key => $value) {if(is_array($value)) {$value = implode(',', $value);}$tpl = str_replace('{'.$key.'}',$enc ? rawurlencode($value) : $value, $tpl);}return $tpl;}}?>