Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 1118 | Blame | 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_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 <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 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;
        }
}
?>