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 * @license CECILL v2 * @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 :
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 :
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 :
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 :
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 :
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 :
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 :
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; } } ?>