* @author Mathilde Salthun-Lassalle * @license GPL v3 * @license CECILL v2 * @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 :
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; } } ?>