Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 939 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php

/**
* classe pour web service qui affiche les images de Coste.
* il n'existe qu'une seule version pour les images de Coste : 2.00
* retour en application/json
* 
* exemple d'appel du service  : 
* .../service:eflore:0.1/coste/images?masque.nt=1053
* .../service:eflore:0.1/coste/images?masque.nn=39594,39601
* .../service:eflore:0.1/coste/images
* 
* paramètres disponibles : navigation.depart, navigation.limite, masque.nn, masque.nt
* 
* @package eFlore/services
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Mathilde Salthun-Lassalle <mathilde@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @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)
*/

class Images extends Commun {
        
        protected  $table ;
        private $requete_condition = array(" image != '' ");
        private $champs_recherches = " num_nom, image, flore_bdtfx_nn, flore_bdtfx_nt ";
        private $total_resultat;
        protected $limite_requete = array('depart' => 0, 'limite' => 100);
        private $masque = array();
        
        

        
        public function consulter($ressources, $parametres) {
                $this->ressources = $ressources;
                $this->parametres = $parametres;
                $this->traiterRessources();
                $this->traiterParametres();
                $this->table = config::get('bdd_table').'_v2_00'; 
                $requete = $this->assemblerLaRequete();
                $resultat = $this->getBdd()->recupererTous($requete);
                $resultats = $this->formaterResultat($resultat);
                return $resultats;
        }
        
        //+-----------------------------------traitement ressources et paramètres --------------------------------+
        
        
        public function traiterRessources() {
                        if (empty($this->ressources) ) {
                                if (isset($this->parametres['masque.nn']) == false
                                && isset($this->parametres['masque.nt']) == false) {
                                $this->requete_condition[] = " flore_bdtfx_nt != '' AND flore_bdtfx_nn != '' ";
                                }
                        } else {
                                $e = "La ressource {$this->ressources[0]} n'existe pas.";
                                $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
                        }
        }
        
        public function traiterParametres() {
                foreach ($this->parametres as $param => $val ) {
                        switch ($param) {
                                case 'masque.nt' :
                                        $this->analyserMasque($val,'nt');
                                        break;
                                case 'masque.nn' :
                                        $this->analyserMasque($val,'nn');
                                        break;
                                case 'referentiel' :
                                        // ce paramètre est ignoré dans le cas de coste
                                        // car seul le cel le prend en compte pour le moment
                                        // on l'indique ici dans le switch car ce sont les mêmes url
                                        // qui sont appelées pour le cel et coste (à retirer donc si ça change)
                                        break;
                                case 'navigation.depart' :
                                        $this->limite_requete['depart'] = $val;
                                        break;
                                case 'navigation.limite' :
                                        $this->limite_requete['limite'] = $val;
                                        break;
                                default : 
                                        $e = 'Erreur dans les paramètres de recherche de votre requête : </br> Le parametre " '
                                        .$param.' " n\'existe pas.';
                                        $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
                                        break;
                        }
                }
        }
        
        

        
        private function analyserMasque($valeur, $type_masque) {
                $this->masque[] = "$type_masque=$valeur";
                if (!$valeur) {
                        $e = 'renseignez une valeur pour masque.nn';
                        $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,$e);
                }
                $arr = array_filter(array_map('intval', explode(',', $valeur)));
                if(!$arr) $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, "valeur incorrecte pour masque.".$type_masque);
                $this->requete_condition[] = sprintf(" flore_bdtfx_%s IN (%s)", $type_masque, implode(',', array_unique($arr)));
        }
        
        
        
        

//+-------------------------------------------formatage résultats---------------------------------------------+

        public function formaterResultat($resultat) {
                $versionResultat['entete'] = $this->formaterEnteteResultat();;
                if ($resultat == '') {
                        $message = 'La requête SQL formée comporte une erreur!';
                        $code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
                        throw new Exception($message, $code);
                } elseif ($resultat) {
                        $versionResultat = $this->retournerResultatFormate($resultat);
                } else {
                        $versionResultat['resultats'] = array();
                }
                return $versionResultat;
        }
        
        public function retournerResultatFormate($resultat) {
                $resultat_json = array();
                        foreach ($resultat as $tab) {
                                $num_coste = $tab['num_nom'];
                                unset($tab['num_nom']);
                                $resultat_json['resultats'][$num_coste]['num_nomenclatural'] = $tab['flore_bdtfx_nn'];
                                $resultat_json['resultats'][$num_coste]['num_taxonomique'] = $tab['flore_bdtfx_nt'];
                                $resultat_json['resultats'][$num_coste]['binaire.href'] = $this->formaterUrlImage($tab['image']);
                                $resultat_json['resultats'][$num_coste]['mime'] = "images/png";
                        }
                return $resultat_json;
        }
        
        public function formaterUrlImage($fichier) {
                $chemin = config::get('donnees')."2.00/img/$fichier"; 
                return $chemin;
        }
        

        
        
        public function formaterEnteteResultat() {
                $entete['depart'] = $this->limite_requete['depart'];
                $entete['limite'] = $this->limite_requete['limite'];
                $entete['total']  =  $this->total_resultat;
                $entete['masque']  = empty($this->masque) ? 'aucun' : implode('&', $this->masque);
                $url = $this->formulerUrl($this->total_resultat, '/images');
                if (isset($url['precedent']) && $url['precedent'] != '') {
                        $entete['href.precedent'] = $url['precedent'];
                }
                if (isset($url['suivant']) && $url['suivant'] != '') {
                        $entete['href.suivant']   = $url['suivant'];
                }
                return $entete;
        }
        
        //+--------------------------FONCTIONS D'ASSEMBLAGE DE LA REQUETE-------------------------------------------+
        
        public function assemblerLaRequete() {
                $requete =      ' SELECT '.$this->champs_recherches.' FROM '.$this->table.' '
                .$this->retournerRequeteCondition().' '
                .$this->delimiterResultatsRequete();
                return $requete;
        }
        

        
        public  function retournerRequeteCondition() {
                $condition = '';
                if (empty($this->requete_condition) == false) {
                        $condition = ' WHERE '.implode(' AND ', $this->requete_condition);
                }
                return $condition;
        }
        

        
        public function calculerTotalResultat() {
                $requete = 'SELECT count(*) as nombre FROM '.$this->table.' '
                .$this->retournerRequeteCondition();
                $res = $this->getBdd()->recuperer($requete);
                if ($res) {
                        $this->total_resultat = $res['nombre'];
                } else { 
                        $this->total_resultat = 0;
                        $e = 'Données introuvables dans la base';
                        $this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
                }
        }
        
        
        public function delimiterResultatsRequete() {
                $this->calculerTotalResultat();
                $requete_limite = '';
                if ((count($this->ressources)) == 0)  {
                        if (($this->limite_requete['depart'] <  $this->total_resultat) && 
                                (($this->limite_requete['limite'] + $this->limite_requete['depart'] )
                                 < $this->total_resultat  )) {  
                                        $requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
                                        .$this->limite_requete['limite'];
                        } 
                }
                return $requete_limite;
        }
        
}
?>