* @author Delphine CAUQUIL * @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_data if (isset($entete['wrapper_data'])) { $forceTableauAssociatif = true; $resultat = json_decode($json, $forceTableauAssociatif); $this->entete = (isset($resultat['entete'])) ? $resultat['entete'] : null; } else { $m = "L'url $url 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 DEMANDE private 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; } } ?>