Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

<?php
/**
 * 
 *  syntaxons/relations -> retourne toutes les relations d'un syntaxon en fonction du numéro catminat
 *  
 *  /syntaxons/catminat:#code_catminat/relations/niveaux_sup --> retourne les niveaux supérieurs d'un syntaxon
 *  /syntaxons/catminat:#code_catminat/relations/synonymie --> retourne tous les synonymes pour un code catminat
 *  
 * @package eflore-projets
* @author mathilde Salthun-Lassalle
* @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-2012 Tela Botanica (accueil@tela-botanica.org)
 *
 */

class SyntaxonsRelation  extends SyntaxonsCommun{
        
        public function consulter($ressources, $parametres) {
                $this->ressources = $ressources;
                $this->parametres = $parametres;
                $this->traiterRessources();
                $this->traiterParametres();
                $this->definirTables();
                $resultats = null;
                $requete = '';
                foreach ($this->table_version as $version) {
                        $this->table = $version;
                        $requete = $this->assemblerLaRequete();
                        $resultat =  $this->Bdd->recupererTous($requete);
                        $versionResultat = $this->traiterResultat($resultat, $this->version_projet);
                        if (count($this->table_version) > 1) {
                                $resultats[$version] = $versionResultat;
                        } else {
                                $resultats = $versionResultat;
                        }
                }
                return $resultats;
        }


        function __construct(Conteneur $conteneur) {
                 parent::__construct($conteneur);
                 $this->champs_recherches = 'cle, code_catminat, syntaxon,  code_fixe_nom, code_natura_2000, niveau ';
        }
        

        
        //surchargée car  le web-service est appelé par SyntaxonsRelationsToutes. 
        //ne doit pas renvoyer une erreur mais un résultat vide.
        public function traiterResultat($resultat, $version) {
                $versionResultat = null;
                if ($resultat == '') {
                        $message = 'La requête SQL formée comporte une erreur!';
                        $code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
                        throw new Exception($message, $code);
                } elseif ($resultat) {
                        $versionResultat = $this->retournerResultatFormate($resultat);
                } else {
                        $versionResultat = 'Les données recherchées sont introuvables';
                }
                return $versionResultat;
        }

        
//+-------------------------------------traitement des ressources et des paramètres----------------------------------------+//
        
        
        public function traiterRessources() {
                $catminat='';
                if(preg_match("/catminat:(([0-9]{2}\-$)|([0-9]{2}\-[0-9]\.$)|([0-9]{2}\-(?:[0-9]\.){1,5}[0-9]$)|([0-9]{2}\-(?:[0-9]\.){4,5}[0-9]\-[0-9]+(?:bis|ter|quater){0,1}$))/",$this->ressources[0], $retour)) {
                        $this->catminat = str_replace('-', '/',$retour[1]);
                        $this->traiterRessourcesRelations();            
                }elseif ($this->ressources[0]) {
                        $e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
                        throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                }
                return $catminat;
        }
        
        public function traiterRessourcesRelations(){
                if($this->ressources[1] == 'relations') {
                                switch($this->ressources[2]) {
                                        case 'niveaux-sup':
                                                $catminat_sup = $this->chercherCatminatSuperieurs();
                                                if (!empty($catminat_sup)) {
                                                        if (count($catminat_sup)>1) {
                                                                $this->requete_condition[] = ' code_catminat in ('.implode(',',$catminat_sup).')';
                                                        } else {
                                                                $this->requete_condition[] = ' code_catminat = '.$catminat_sup[0].' ';
                                                        }
                                                } else  { 
                                                                $e = 'Erreur dans l\'url de votre requête : le code catminat est trop court.';
                                                                throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                                                }
                                                break;
                                        case 'synonymie' :
                                                $this->requete_condition[] = " niveau LIKE 'syn%' and code_catminat = '".$this->catminat."' " ;
                                                break;
                                        default :
                                                $e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
                                        throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                                }
                } else {
                        $e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
                        throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                }
        }
        
        //ne renvoie que les supérieurs ( sans la valeur initiale )
        public function chercherCatminatSuperieurs() {
                $catminat_sup = array();
                $catminat_slash  = explode('/',$this->catminat);
                $catminat_slash = $this->enleverValeursVides($catminat_slash);
                
                $taille_slash = count($catminat_slash);
                if ($taille_slash > 1) {
                        $catminat_sup[0] = "'".array_shift($catminat_slash)."/'";
                        $niveaux = array_shift($catminat_slash);
                        $unites = explode('.',trim($niveaux)); //attention explode peut renvoyer des cases vides (voir la doc php)
                        $unites = $this->enleverValeursVides($unites);
                        $taille = ($taille_slash == 3) ? count($unites) : count($unites)-1 ;
                        for ($i=0; $i< $taille ; $i++) {
                                $sup = "'".trim($catminat_sup[$i],"'");
                                if ($i == 0) {
                                        $sup .= $unites[$i].".'";
                                } elseif ($i == 1) {
                                        $sup .= $unites[$i]."'";
                                } else {
                                        $sup .= ".".$unites[$i]."'";
                                }
                                $catminat_sup[] = $sup;
                        }
                } 
                return $catminat_sup;
        }
        
        
        public function traiterParametres() {
                if (isset($this->parametres) && !empty($this->parametres) ) {
                        foreach ($this->parametres as $param => $valeur) {
                                switch ($param) {
                                        case 'navigation.depart'  :
                                                $this->definirNavigationDepart($valeur);
                                                break;
                                        case 'navigation.limite'  :
                                                $this->definirNavigationLimite($valeur);
                                                break;
                                        case 'version.projet' :
                                                $this->traiterVersion($valeur);
                                                break;
                                        case 'masque.catminat' :
                                                $this->traiterCatminat($valeur);
                                                break;
                                        case 'masque.niveau' :
                                                $this->traiterNiveau($valeur);
                                                break;
                                        case 'masque.fixe':
                                                $this->requete_condition[] = ' code_fixe_nom = \''.$valeur.'\' ';
                                                break;
                                        case 'retour.champs' :
                                                $this->champs_recherches .= ','.$valeur.' ';
                                                break;
                                        case 'masque.retenu' :
                                                $this->traiterRetenu($valeur);
                                                break;
                                        default :
                                                $e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " '
                                        .$param.' " n\'existe pas.';
                                        $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);     break;
                                }
                        }
                        
                }
                        
        }
        
        public function traiterRetenu($valeur) {
                if ($this->ressources[2] == 'niveaux-sup') {
                        $valeur = trim($valeur);
                        if( $valeur == 'true') {
                                $this->requete_condition[] = ' niveau NOT LIKE \'syn%\' ';
                        } elseif ( $valeur == 'false') {
                                $this->requete_condition[] = ' niveau LIKE \'syn%\' ';
                        }
                } else {
                        $e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " masque.retenu " n\'existe pas.';
                        $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);
                }
                
        }
        
        public function traiterCatminat($valeur) {
                if ($this->ressources[2] == 'niveaux-sup') {
                        $valeur = trim($valeur);
                        $valeur = str_replace('-', '/', $valeur);
                        $this->requete_condition[] = ' code_catminat = '.$this->getBdd()->proteger($valeur).'';
                } else {
                        $e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " masque.catminat " n\'existe pas.';
                        $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);     break;
                } 
        }
        
        public function traiterNiveau($valeur) {
                if ($this->ressources[2] == 'niveaux-sup') {
                        $valeur = strtoupper(trim($valeur));
                        if (in_array($valeur,$this->niv)) {
                                $this->requete_condition[] = ' niveau = '.$this->getBdd()->proteger($valeur).'';
                        } else {
                                $e = "Erreur : valeur inconnue pour masque.niveau."
                                ." valeurs possibles : ALL|ORD|CLA|SUBCLA|SUBORD|SUBALL|ASS|SUBASS|BC|DC|GRPT";
                                throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                        }
                } else {
                        $e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " masque.niveau " n\'existe pas.';
                        $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);
                }
        }
        
        
        //+--------------------------formatages de resultats  -------------------------------------------+//
        
        
        public function retournerResultatFormate($resultat) {
                $resultat_json = array();
        $resultat_json['entete'] = $this->ajouterEnteteResultat();
                foreach ($resultat as $cle => $res) {
                        $resultat[$cle]['href'] = $this->ajouterHref('syntaxons','cle:'.$res['cle']);
                        $resultat[$cle] = array_merge($resultat[$cle],$this->traiterOntologieNiveau($res['niveau']));
                        unset($resultat[$cle]['niveau']);
                }
                $resultat_json['resultat'] = $resultat;
                return $resultat_json;
        }
        
        public function ajouterEnteteResultat() {
                $entete['depart'] = $this->limite_requete['depart'];
                $entete['limite'] = $this->limite_requete['limite'];
                $entete['total']  =  $this->total_resultat;
                $entete['version']  = $this->version_projet;
                $ressources = (empty($this->ressources)) ? '/syntaxons' : '/syntaxons/' ;
                $url = $this->formulerUrl($this->total_resultat, $ressources.implode('/',$this->ressources));
                if (isset($url['precedent']) && $url['precedent'] != '') {
                        $entete['href.precedent'] = $url['precedent'];
                }
                if (isset($url['suivant']) && $url['suivant'] != '') {
                        $entete['href.suivant']   = $url['suivant'];
                }
                return $entete;
        }
        

}

?>