Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 286 | Rev 348 | Go to most recent revision | 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;

        private $entete = null;
        private $projet = null;

        public function __construct($projet = null) {
                $this->projet = Registre::get('parametres.referentiel');
                if (!is_null($projet)) {
                        $this->projet = $projet;
                }
        }

        public function setProjet($projet) {
                $this->projet = $projet;
        }

        public function getEnteteTotal() {
                return $this->entete['total'];
        }

        /**
         * 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).*/
        protected function formaterUrl($tpl, Array $parametres) {
                $parametres = $this->ajouterParametreParDefaut($parametres);
                foreach ($parametres as $cle => $valeur) {
                        $cle = '{'.$cle.'}';
                        $parametres[$cle] = rawurlencode($valeur);
                }
                $url = strtr($tpl, $parametres);
                return $url;
        }

        private 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) {
                                $resultat['resultat'] = array_merge($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;
        }

}
?>