| 3 | jpm | 1 | <?php
 | 
        
           |  |  | 2 | /**
 | 
        
           |  |  | 3 | * Classe Commun.php est une classe abstraite qui contient les méthodes de base communes à tous les
 | 
        
           |  |  | 4 | * sous-services des projets.
 | 
        
           |  |  | 5 | *
 | 
        
           |  |  | 6 | * Encodage en entrée : utf8
 | 
        
           |  |  | 7 | * Encodage en sortie : utf8
 | 
        
           |  |  | 8 | * @package eflore-projets
 | 
        
           |  |  | 9 | * @author Jennifer DHÉ <jennifer.dhe@tela-botanica.org>
 | 
        
           |  |  | 10 | * @author Delphine CAUQUIL <delphine@tela-botanica.org>
 | 
        
           |  |  | 11 | * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
 | 
        
           |  |  | 12 | * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 | 
        
           |  |  | 13 | * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 | 
        
           |  |  | 14 | * @version 1.0
 | 
        
           |  |  | 15 | * @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
 | 
        
           |  |  | 16 | */
 | 
        
           |  |  | 17 |   | 
        
           |  |  | 18 | abstract class Commun {
 | 
        
           |  |  | 19 |   | 
        
           |  |  | 20 | 	/** Objet Bdd. */
 | 
        
           |  |  | 21 | 	private $Bdd = null;
 | 
        
           |  |  | 22 | 	/** Objet Rest Client. */
 | 
        
           |  |  | 23 | 	private $RestClient = null;
 | 
        
           |  |  | 24 |   | 
        
           |  |  | 25 | 	/** Contients les paramètres. Doit remplacer table_param. */
 | 
        
           |  |  | 26 | 	protected $parametres = array();
 | 
        
           |  |  | 27 | 	/** Contients les ressources. Doit remplacer table_ressources. */
 | 
        
           |  |  | 28 | 	protected $ressources = array();
 | 
        
           |  |  | 29 | 	/** Le nom du service courrant. */
 | 
        
           |  |  | 30 | 	protected $serviceNom = null;
 | 
        
           |  |  | 31 |   | 
        
           |  |  | 32 | 	//Classe commune à tous les services web d'un projet. Contient par exemple les fonctions permettant de
 | 
        
           |  |  | 33 | 	//renvoyer la réponse http...
 | 
        
           |  |  | 34 | 	protected $entete_http; // Entete de la réponse correspondant au code de réponse de la requete http */
 | 
        
           |  |  | 35 | 	protected $corps_http; // Tableau de résultat à retourner au format json ou la description de l'erreur si elle existe */
 | 
        
           |  |  | 36 | 	protected $service; // Nom du service appelé
 | 
        
           |  |  | 37 | 	/** Stocke la version du projet demandée dans la requete
 | 
        
           |  |  | 38 | 	 *  - "*" : (/#projet/* /meta-donnees) Renvoi les meta-données de toutes les versions du projet
 | 
        
           |  |  | 39 | 	 *  - "numero de la version" : (/#projet/2.00/meta-donnees) Renvoi les meta-données de la version 2.00 du projet */
 | 
        
           |  |  | 40 | 	protected $version_projet = '+';
 | 
        
           |  |  | 41 | 	protected $table_version; //Stocke les noms des tables de toutes les versions du projet disponibles
 | 
        
           |  |  | 42 | 	/** tableau contenant tous les champs d'une table (est rempli par la fonction Commun::recupererNomChamp($table)) */
 | 
        
           |  |  | 43 | 	protected $champs_table = array();
 | 
        
           |  |  | 44 | 	private static $tri_multi_dimension = array();
 | 
        
           |  |  | 45 | 	private static $tri_type = '';
 | 
        
           |  |  | 46 |   | 
        
           | 563 | aurelien | 47 | 	public function __construct($config = null) {
 | 
        
           | 536 | gduche | 48 | 		$this->config = is_null($config) ? Config::get($this->serviceNom) : $config;
 | 
        
           |  |  | 49 | 	}
 | 
        
           | 654 | jpm | 50 |   | 
        
           | 3 | jpm | 51 | 	public function consulter($ressources, $parametres) {
 | 
        
           | 236 | delphine | 52 | 		$this->ressources = $ressources;
 | 
        
           |  |  | 53 | 		$this->parametres = $parametres;
 | 
        
           |  |  | 54 | 		$this->chargerNomDuService();
 | 
        
           | 3 | jpm | 55 |   | 
        
           | 236 | delphine | 56 | 		$this->traiterParametres();
 | 
        
           |  |  | 57 | 		$this->traiterVersionProjet();
 | 
        
           | 3 | jpm | 58 |   | 
        
           | 236 | delphine | 59 | 		$resultats = '';
 | 
        
           |  |  | 60 | 		foreach ($this->table_version as $version) {
 | 
        
           |  |  | 61 | 			$this->table = $version; //on stocke le nom de la table correspondant à la version du projet en cours
 | 
        
           |  |  | 62 | 			$this->recupererNomChamp($this->table); //on récupère les noms des champs disponibles (Ds Commun.php)
 | 
        
           |  |  | 63 | 			$this->traiterRessources(); //dans CommunNomsTaxons.php
 | 
        
           | 654 | jpm | 64 | 			$requete = $this->assemblerLaRequete();// dans Noms ou Taxons...
 | 
        
           | 767 | raphael | 65 | 			$resultat = $this->getBdd()->recupererTous($requete . ' -- ' . __FILE__ . ':' . __LINE__ . ' (' .$this->table . ')');
 | 
        
           | 236 | delphine | 66 | 			$versionResultat = $this->traiterResultat($resultat, $version, $requete);
 | 
        
           |  |  | 67 | 			if (count($this->table_version) > 1) {
 | 
        
           |  |  | 68 | 				$resultats[$version] = $versionResultat;
 | 
        
           |  |  | 69 | 			} else {
 | 
        
           |  |  | 70 | 				$resultats = $versionResultat;
 | 
        
           | 3 | jpm | 71 | 			}
 | 
        
           | 236 | delphine | 72 | 		}
 | 
        
           | 3 | jpm | 73 |   | 
        
           |  |  | 74 | 		return $resultats;
 | 
        
           |  |  | 75 | 	}
 | 
        
           |  |  | 76 |   | 
        
           |  |  | 77 | 	private function chargerNomDuService() {
 | 
        
           |  |  | 78 | 		$this->serviceNom = get_class($this);
 | 
        
           |  |  | 79 | 	}
 | 
        
           |  |  | 80 |   | 
        
           | 654 | jpm | 81 | 	public function traiterResultat($resultat, $version) {
 | 
        
           | 3 | jpm | 82 | 		$versionResultat = null;
 | 
        
           |  |  | 83 | 		if ($resultat == '') {
 | 
        
           |  |  | 84 | 			//cas ou la requete comporte des erreurs
 | 
        
           |  |  | 85 | 			$message = 'La requête SQL formée comporte une erreur!';
 | 
        
           |  |  | 86 | 			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
 | 
        
           |  |  | 87 | 			throw new Exception($message, $code);
 | 
        
           |  |  | 88 | 		} elseif ($resultat) {
 | 
        
           |  |  | 89 | 			$versionResultat = $this->retournerResultatFormate($resultat, $version);
 | 
        
           |  |  | 90 | 		} else {
 | 
        
           |  |  | 91 | 			$message = 'Les données recherchées sont introuvables.';
 | 
        
           |  |  | 92 | 			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
 | 
        
           |  |  | 93 | 			throw new Exception($message, $code);
 | 
        
           |  |  | 94 | 		}
 | 
        
           |  |  | 95 | 		return $versionResultat;
 | 
        
           |  |  | 96 | 	}
 | 
        
           |  |  | 97 |   | 
        
           |  |  | 98 | 	//+------------------------------------------------------------------------------------------------------+
 | 
        
           |  |  | 99 | 	// Méthodes concernant les paramètres
 | 
        
           |  |  | 100 | 	/**
 | 
        
           |  |  | 101 | 	 *  Permet de récupérer une liste des noms des champs de la table passée en paramètre
 | 
        
           |  |  | 102 | 	 *  @param $table : Nom de la table dont on souhaite connaitre les champs
 | 
        
           |  |  | 103 | 	 */
 | 
        
           |  |  | 104 | 	public function recupererNomChamp($table) {
 | 
        
           |  |  | 105 | 		$requete = 'SHOW FIELDS FROM '.$table;
 | 
        
           |  |  | 106 | 		$resultat = $this->getBdd()->recupererTous($requete);
 | 
        
           |  |  | 107 | 		if ($resultat == '') {
 | 
        
           |  |  | 108 | 			$e = 'La requête SQL formée comporte une erreur!';
 | 
        
           |  |  | 109 | 			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
 | 
        
           |  |  | 110 | 		} elseif ($resultat) {
 | 
        
           |  |  | 111 | 			foreach ($resultat as $info) {
 | 
        
           |  |  | 112 | 				$this->champs_table[] = $info['Field'];
 | 
        
           |  |  | 113 | 			}
 | 
        
           |  |  | 114 | 		} else {
 | 
        
           |  |  | 115 | 			$m = "La table recherchée n'existe pas";
 | 
        
           |  |  | 116 | 			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $m);
 | 
        
           |  |  | 117 | 		}
 | 
        
           |  |  | 118 | 	}
 | 
        
           |  |  | 119 |   | 
        
           |  |  | 120 | 	/**
 | 
        
           |  |  | 121 | 	 * Fonction permettant de creer la table dont le nom est passé en paramètre (champs_api, champs_bdtfx,
 | 
        
           |  |  | 122 | 	 * correspondance_champs...). Les données de chaque table sont présentes dans le fichier de configuration config.ini
 | 
        
           |  |  | 123 | 	 * @param String $table : Peut contenir plusieurs nom de table dont on souhaite récupérer les données : table,table,table.
 | 
        
           |  |  | 124 | 	 * 	Ex : recupererTableConfig('champs_api,champs_bdtfx')
 | 
        
           |  |  | 125 | 	 */
 | 
        
           |  |  | 126 | 	public function recupererTableConfig($table) {
 | 
        
           |  |  | 127 | 		$tables = explode(',', $table);
 | 
        
           |  |  | 128 | 		foreach ($tables as $tab) {
 | 
        
           |  |  | 129 | 			$tableau = explode(',', Config::get($tab));
 | 
        
           |  |  | 130 | 			$tableau = array_map('trim', $tableau);
 | 
        
           |  |  | 131 | 			foreach ($tableau as $champ) {
 | 
        
           |  |  | 132 | 				list($code, $rang) = explode('=', $champ);
 | 
        
           |  |  | 133 | 				$tab_tampon[$code] = $rang;
 | 
        
           |  |  | 134 | 			}
 | 
        
           |  |  | 135 | 			$this->$tab = $tab_tampon;
 | 
        
           |  |  | 136 | 			$tab_tampon = array();
 | 
        
           |  |  | 137 | 		}
 | 
        
           |  |  | 138 | 	}
 | 
        
           |  |  | 139 |   | 
        
           |  |  | 140 | 	public function renvoyerErreur($entete, $message) {
 | 
        
           |  |  | 141 | 		throw new Exception($message, $entete);
 | 
        
           |  |  | 142 | 	}
 | 
        
           |  |  | 143 |   | 
        
           |  |  | 144 | 	/**
 | 
        
           |  |  | 145 | 	 * Permet de remplir la variable version_projet et de retirer cette donnée du tableau des ressources
 | 
        
           |  |  | 146 | 	 * @param $ressources
 | 
        
           |  |  | 147 | 	 */
 | 
        
           |  |  | 148 | 	public function traiterVersionProjet() {
 | 
        
           | 81 | delphine | 149 | 		if (isset($this->parametres['version.projet'])) {
 | 
        
           | 92 | jpm | 150 | 			if (preg_match('/^[0-9]+(?:[._][0-9]+|)$/', $this->parametres['version.projet'])) {
 | 
        
           | 81 | delphine | 151 | 				$this->version_projet = $this->parametres['version.projet'];
 | 
        
           | 92 | jpm | 152 | 				$this->version_projet = 'v'.str_replace('.', '_', $this->version_projet);
 | 
        
           |  |  | 153 | 			} else  {
 | 
        
           |  |  | 154 | 				$this->version_projet = $this->parametres['version.projet'];
 | 
        
           | 3 | jpm | 155 | 			}
 | 
        
           |  |  | 156 | 		}
 | 
        
           |  |  | 157 | 		//si la liste des noms est demandée pr toutes les versions, on affiche seulement la dernière version :
 | 
        
           |  |  | 158 | 		if ($this->version_projet == '*' && $this->ressources == array()) {
 | 
        
           | 92 | jpm | 159 | 			$message = "L'affichage de plusieurs versions ne fonctionne que pour les ressources de type /ressources/#id";
 | 
        
           |  |  | 160 | 			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
 | 
        
           |  |  | 161 | 			throw new Exception($message, $code);
 | 
        
           | 3 | jpm | 162 | 		}
 | 
        
           |  |  | 163 | 		//on recupère les versions du projet disponible dans la table des meta-donnees (utilisation service MetaDonnees)
 | 
        
           |  |  | 164 | 		$table_num_version = $this->recupererVersionDisponible();
 | 
        
           |  |  | 165 | 		//on recupere la liste des noms des tables de la bdd correspondant aux differentes versions du projet en fct de la ou les versions demandées
 | 
        
           |  |  | 166 | 		$this->recupererListeNomTablePrChaqueVersion($table_num_version);
 | 
        
           |  |  | 167 | 	}
 | 
        
           |  |  | 168 |   | 
        
           |  |  | 169 | 	/**
 | 
        
           |  |  | 170 | 	 * Recupération des versions disponibles par appel du service metaDonnees
 | 
        
           |  |  | 171 | 	 * Verification de l'existance du service recherché dans la requete (si précisé : hors *)
 | 
        
           |  |  | 172 | 	 * @return array  : tableau contenant le numéro de chaque version disponible
 | 
        
           |  |  | 173 | 	 */
 | 
        
           |  |  | 174 | 	public function recupererVersionDisponible() {
 | 
        
           |  |  | 175 | 		$versions_dispo = '';
 | 
        
           |  |  | 176 | 		$req_version = 'SELECT version FROM '.Config::get('bdd_table_meta');
 | 
        
           |  |  | 177 | 		$res_version = $this->getBdd()->recupererTous($req_version);
 | 
        
           |  |  | 178 | 		if ($res_version == '') { //cas ou la requete comporte des erreurs
 | 
        
           |  |  | 179 | 			$e = "La requête SQL de versionnage formée comporte une erreur : $req_version";
 | 
        
           |  |  | 180 | 			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
 | 
        
           |  |  | 181 | 		} elseif ($res_version) {
 | 
        
           |  |  | 182 | 			foreach ($res_version as $version) {
 | 
        
           |  |  | 183 | 				$versions_dispo[] = $version['version'];
 | 
        
           |  |  | 184 | 			}
 | 
        
           |  |  | 185 | 		} else {
 | 
        
           |  |  | 186 | 			$m = 'Versions introuvables dans la table des méta-données';
 | 
        
           |  |  | 187 | 			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $m);
 | 
        
           |  |  | 188 | 		}
 | 
        
           |  |  | 189 | 		return $versions_dispo;
 | 
        
           |  |  | 190 | 	}
 | 
        
           |  |  | 191 |   | 
        
           |  |  | 192 | 	public function recupererListeNomTablePrChaqueVersion($table_num_version) {
 | 
        
           |  |  | 193 | 		switch ($this->serviceNom) {
 | 
        
           |  |  | 194 | 			case 'Ontologies' :
 | 
        
           |  |  | 195 | 				$prefixe_table = 'bdd_table_ontologies';
 | 
        
           |  |  | 196 | 				break;
 | 
        
           |  |  | 197 | 			default:
 | 
        
           |  |  | 198 | 				$prefixe_table = 'bdd_table';
 | 
        
           |  |  | 199 | 		}
 | 
        
           |  |  | 200 | 		switch ($this->version_projet) {
 | 
        
           |  |  | 201 | 			case '+' :
 | 
        
           |  |  | 202 | 				$derniere_version = $table_num_version[count($table_num_version) - 1];
 | 
        
           |  |  | 203 | 				$this->table_version[] = Config::get($prefixe_table).'_v'.str_replace('.', '_', $derniere_version);
 | 
        
           |  |  | 204 | 				break;
 | 
        
           |  |  | 205 | 			case '*' :
 | 
        
           |  |  | 206 | 				foreach ($table_num_version as $num_version) {
 | 
        
           |  |  | 207 | 					$this->table_version[] = Config::get($prefixe_table).'_v'.str_replace('.', '_', $num_version);
 | 
        
           |  |  | 208 | 				}
 | 
        
           |  |  | 209 | 				break;
 | 
        
           |  |  | 210 | 			default  :
 | 
        
           |  |  | 211 | 				$this->table_version[] = Config::get($prefixe_table).'_'.$this->version_projet;
 | 
        
           |  |  | 212 | 				break;
 | 
        
           |  |  | 213 | 		}
 | 
        
           |  |  | 214 | 	}
 | 
        
           |  |  | 215 |   | 
        
           | 593 | mathilde | 216 | 	//valeur * signifie pas de limites
 | 
        
           |  |  | 217 | 	public function definirNavigationLimite($valeur){
 | 
        
           |  |  | 218 | 		if (isset($this->parametres['navigation.limite'])  ) {
 | 
        
           |  |  | 219 | 			if ((preg_match('/^([0-9]+)$/', $valeur) && $valeur != 0 ) || $valeur == '*' ){
 | 
        
           |  |  | 220 | 				$this->limite_requete['limite'] = $valeur;
 | 
        
           |  |  | 221 | 			} else {
 | 
        
           |  |  | 222 | 				$e = "Erreur : valeur erronnée pour le paramètre navigation.limite.";
 | 
        
           |  |  | 223 | 				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
 | 
        
           |  |  | 224 | 			}
 | 
        
           | 654 | jpm | 225 | 		}
 | 
        
           | 593 | mathilde | 226 | 	}
 | 
        
           | 654 | jpm | 227 |   | 
        
           | 593 | mathilde | 228 | 	public function definirNavigationDepart($valeur){
 | 
        
           |  |  | 229 | 		if (isset($this->parametres['navigation.depart'])) {
 | 
        
           |  |  | 230 | 			if(preg_match('/^([0-9]+)$/', $valeur)){
 | 
        
           |  |  | 231 | 				$this->limite_requete['depart'] = $valeur;
 | 
        
           |  |  | 232 | 			} else {
 | 
        
           |  |  | 233 | 				$e = "Erreur : valeur erronnée pour le paramètre navigation.depart.";
 | 
        
           |  |  | 234 | 				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
 | 
        
           |  |  | 235 | 			}
 | 
        
           |  |  | 236 | 		} else {
 | 
        
           |  |  | 237 | 			$e = "indiquez également la valeur pour le paramètre navigation.limite.";
 | 
        
           |  |  | 238 | 			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
 | 
        
           |  |  | 239 | 		}
 | 
        
           |  |  | 240 | 	}
 | 
        
           | 3 | jpm | 241 | 	/**
 | 
        
           |  |  | 242 | 	 * Est appelée pour former l'url complete des resultats precedants ou suivants.
 | 
        
           |  |  | 243 | 	 * @param int : Permet de connaitre le nombre de noms obtenus par la requete
 | 
        
           |  |  | 244 | 	 * @return string Retourne l'url complete des resultats precedents ou suivant sous la forme d'un tableau
 | 
        
           |  |  | 245 | 	 */
 | 
        
           |  |  | 246 | 	public function formulerUrl($nb_resultat, $id = null) {
 | 
        
           |  |  | 247 | 		$url = array();
 | 
        
           |  |  | 248 | 		$debut_url = Config::get('url_service').$id.'?';
 | 
        
           | 597 | mathilde | 249 | 		//on recréé l'url sans les parametres de navigation qui seront rajoutés ci-apres. On les enlève dc de la table des parametres
 | 
        
           | 3 | jpm | 250 | 		foreach($this->parametres as $cle => $val) {
 | 
        
           |  |  | 251 | 			$param_url[str_replace('_', '.', $cle)] = $val;
 | 
        
           |  |  | 252 | 		}
 | 
        
           |  |  | 253 |   | 
        
           |  |  | 254 | 		$this->recupererLesLimitesSuivantes($nb_resultat, $param_url);
 | 
        
           |  |  | 255 | 		if (isset($param_url['navigation.depart']) && isset($param_url['navigation.limite'])) {
 | 
        
           |  |  | 256 | 			$url['suivant'] = $debut_url.http_build_query($param_url);
 | 
        
           |  |  | 257 | 		}
 | 
        
           |  |  | 258 |   | 
        
           |  |  | 259 | 		$this->recupererLesLimitesPrecedentes($param_url);
 | 
        
           |  |  | 260 | 		if (isset($param_url['navigation.depart']) && isset($param_url['navigation.limite'])) {
 | 
        
           |  |  | 261 | 			$url['precedent'] = $debut_url.http_build_query($param_url);
 | 
        
           |  |  | 262 | 		}
 | 
        
           |  |  | 263 | 		return $url;
 | 
        
           |  |  | 264 | 	}
 | 
        
           |  |  | 265 |   | 
        
           |  |  | 266 | 	public function supprimerNavigation(&$param_url) {
 | 
        
           |  |  | 267 | 		unset($param_url['navigation.depart']);
 | 
        
           |  |  | 268 | 		unset($param_url['navigation.limite']);
 | 
        
           |  |  | 269 | 	}
 | 
        
           |  |  | 270 |   | 
        
           |  |  | 271 | 	/**
 | 
        
           |  |  | 272 | 	 * Description :
 | 
        
           |  |  | 273 | 	 * Permet de former les limites de la requete retournant les résultats suivants.
 | 
        
           |  |  | 274 | 	 * Cette url sera afficher dans l'entete de la reponse retournée en format JSON (retour.format=defaut).
 | 
        
           |  |  | 275 | 	 * @param int : $nb_resultat : Permet de connaitre le nombre de résultats obtenus par la requete
 | 
        
           |  |  | 276 | 	 * @return string : la fin de l'url decrivant les limites des resultats suivants. Si aucun résultats ne suient,
 | 
        
           |  |  | 277 | 	 * une chaine de caractère vide est retournée
 | 
        
           |  |  | 278 | 	 */
 | 
        
           |  |  | 279 | 	public function recupererLesLimitesSuivantes($nb_resultat, &$param_url_suiv) {
 | 
        
           |  |  | 280 | 		$this->supprimerNavigation($param_url);
 | 
        
           |  |  | 281 | 		$depart = $this->limite_requete['depart'];
 | 
        
           |  |  | 282 | 		$limite = $this->limite_requete['limite'];
 | 
        
           |  |  | 283 | 		$depart_suivant = $depart + $limite;
 | 
        
           |  |  | 284 | 		$limite_suivant = $limite;
 | 
        
           |  |  | 285 | 		if ($nb_resultat > $depart_suivant) {
 | 
        
           |  |  | 286 | 			$param_url_suiv['navigation.depart'] = $depart_suivant;
 | 
        
           |  |  | 287 | 			$param_url_suiv['navigation.limite'] = $limite_suivant;
 | 
        
           |  |  | 288 | 		} else {
 | 
        
           |  |  | 289 | 			$param_url_suiv['navigation.depart'] = null;
 | 
        
           |  |  | 290 | 			$param_url_suiv['navigation.limite'] = null;
 | 
        
           |  |  | 291 | 		}
 | 
        
           |  |  | 292 | 	}
 | 
        
           |  |  | 293 |   | 
        
           |  |  | 294 | 	/**
 | 
        
           |  |  | 295 | 	 * Description :
 | 
        
           |  |  | 296 | 	 * Permet de former les limites de la requete retournant les résultats precedents.
 | 
        
           |  |  | 297 | 	 * Cette url sera afficher dans l'entete de la taxons/105reponse retournée en format JSON (retour.format=defaut)
 | 
        
           |  |  | 298 | 	 * @return string : la fin de l'url decrivant les limites des resultats precedents.
 | 
        
           |  |  | 299 | 	 * Si aucun résultats ne precedent, une chaine de caractère vide est retournée
 | 
        
           |  |  | 300 | 	 */
 | 
        
           |  |  | 301 | 	public function recupererLesLimitesPrecedentes(&$param_url) {
 | 
        
           |  |  | 302 | 		$this->supprimerNavigation($param_url);
 | 
        
           |  |  | 303 | 		$depart = $this->limite_requete['depart'];
 | 
        
           |  |  | 304 | 		$limite = $this->limite_requete['limite'];
 | 
        
           |  |  | 305 | 		if ($depart == 0) {
 | 
        
           |  |  | 306 | 			$url_precedente = '';
 | 
        
           |  |  | 307 | 		} else {
 | 
        
           |  |  | 308 | 			if (($depart - $limite) < 0) {
 | 
        
           |  |  | 309 | 				$depart_precedent = 0;
 | 
        
           |  |  | 310 | 			} else {
 | 
        
           |  |  | 311 | 				$depart_precedent = $depart - $limite;
 | 
        
           |  |  | 312 | 			}
 | 
        
           |  |  | 313 | 			$param_url['navigation.depart'] = $depart_precedent;
 | 
        
           |  |  | 314 | 			$param_url['navigation.limite'] = $limite;
 | 
        
           |  |  | 315 | 		}
 | 
        
           |  |  | 316 | 	}
 | 
        
           |  |  | 317 |   | 
        
           | 801 | raphael | 318 | 	static function getDureeCache() {
 | 
        
           | 536 | gduche | 319 | 		$dureecache = 0;
 | 
        
           |  |  | 320 | 		$dureecache = Config::get('dureecache');
 | 
        
           |  |  | 321 | 		if ($dureecache == null || !is_numeric($dureecache) || $dureecache < 0) {
 | 
        
           |  |  | 322 | 			$dureecache = 0;
 | 
        
           |  |  | 323 | 		}
 | 
        
           |  |  | 324 | 		return (int) $dureecache;
 | 
        
           |  |  | 325 | 	}
 | 
        
           | 654 | jpm | 326 |   | 
        
           | 3 | jpm | 327 | 	public function ajouterHref($service, $val) {
 | 
        
           |  |  | 328 | 		// http://tela-botanica.org/service:eflore:0.1/[projet]/[version_projet]/[service]/[ressource]:[valeur]
 | 
        
           |  |  | 329 | 		if ($this->version_projet == '+') {
 | 
        
           |  |  | 330 | 			$url = Config::get('url_service_base').Config::get('nom_projet').'/'.$service.'/'.$val;
 | 
        
           |  |  | 331 | 		} else {
 | 
        
           | 151 | delphine | 332 | 			$url = Config::get('url_service_base').Config::get('nom_projet').'/'.$service.'/'.$val.'?version.projet='.ltrim($this->version_projet, 'v');
 | 
        
           | 3 | jpm | 333 | 		}
 | 
        
           |  |  | 334 | 		return $url;
 | 
        
           |  |  | 335 | 	}
 | 
        
           |  |  | 336 |   | 
        
           | 937 | raphael | 337 | 	static function s_ajouterHref($service, $val, $version_projet = '') {
 | 
        
           |  |  | 338 | 		// http://tela-botanica.org/service:eflore:0.1/[projet]/[version_projet]/[service]/[ressource]:[valeur]
 | 
        
           |  |  | 339 | 		return Config::get('url_service_base').Config::get('nom_projet').'/'.$service.'/'.$val . ($version_projet != '+') ? ('?version.projet='.ltrim($version_projet, 'v')) : '';
 | 
        
           |  |  | 340 | 	}
 | 
        
           |  |  | 341 |   | 
        
           | 3 | jpm | 342 | 	public function ajouterHrefAutreProjet($service, $ressource, $valeur, $projet = null, $param = null) {
 | 
        
           |  |  | 343 | 		//on enleve les GA et Co, les meta ou les "_"
 | 
        
           |  |  | 344 | 		$this->transliterer($service, $valeur);
 | 
        
           |  |  | 345 | 		//on définit les nom des projets, des services et des ressources de l'url (dans les méta-donnees)
 | 
        
           |  |  | 346 | 		$tab = array(
 | 
        
           |  |  | 347 | 			'langue' 			  => array('service' => 'langues', 'projet' => 'iso-639-1', 'ressource' => ''),
 | 
        
           |  |  | 348 | 			'couverture_spatiale' => array('service' => 'zone-geo', 'projet' => 'iso-3166-1', 'ressource' => ''),
 | 
        
           | 265 | jpm | 349 | 			'type' 				  => array('service' => 'ontologies', 'projet' => 'eflore', 'ressource' => 'contactType:'),
 | 
        
           |  |  | 350 | 			'datum' 			  => array('service' => 'ontologies', 'projet' => 'eflore', 'ressource' => 'datum:')
 | 
        
           | 3 | jpm | 351 | 		);
 | 
        
           |  |  | 352 | 		if (array_key_exists($service, $tab)) {
 | 
        
           |  |  | 353 | 			extract($tab[$service]);
 | 
        
           |  |  | 354 | 		} else {
 | 
        
           |  |  | 355 | 			if (strpos(Config::get('nom_projet'), 'bd') === 0 && $projet == null) {
 | 
        
           |  |  | 356 | 				$projet 		= 'bdnt';
 | 
        
           |  |  | 357 | 				$service 		= 'ontologies';
 | 
        
           |  |  | 358 | 				$ressource 		= '';
 | 
        
           |  |  | 359 | 			}
 | 
        
           |  |  | 360 | 		}
 | 
        
           | 88 | delphine | 361 | 		$param = ($param) ? "?".$param : "";
 | 
        
           | 3 | jpm | 362 | 		$url = Config::get('url_service_base').$projet.'/'.$service.'/'.$ressource.$valeur.$param;
 | 
        
           |  |  | 363 | 		return $url;
 | 
        
           |  |  | 364 | 	}
 | 
        
           |  |  | 365 |   | 
        
           | 937 | raphael | 366 | 	static function s_ajouterHrefAutreProjet($service, $ressource, $valeur, $projet = null, $param = null) {
 | 
        
           |  |  | 367 | 		//on enleve les GA et Co, les meta ou les "_"
 | 
        
           |  |  | 368 | 		self::s_transliterer($service, $valeur);
 | 
        
           |  |  | 369 | 		//on définit les nom des projets, des services et des ressources de l'url (dans les méta-donnees)
 | 
        
           |  |  | 370 | 		$tab = array(
 | 
        
           |  |  | 371 | 			'langue' 			  => array('service' => 'langues', 'projet' => 'iso-639-1', 'ressource' => ''),
 | 
        
           |  |  | 372 | 			'couverture_spatiale' => array('service' => 'zone-geo', 'projet' => 'iso-3166-1', 'ressource' => ''),
 | 
        
           |  |  | 373 | 			'type' 				  => array('service' => 'ontologies', 'projet' => 'eflore', 'ressource' => 'contactType:'),
 | 
        
           |  |  | 374 | 			'datum' 			  => array('service' => 'ontologies', 'projet' => 'eflore', 'ressource' => 'datum:')
 | 
        
           |  |  | 375 | 		);
 | 
        
           |  |  | 376 | 		if (array_key_exists($service, $tab)) {
 | 
        
           |  |  | 377 | 			extract($tab[$service]);
 | 
        
           |  |  | 378 | 		} else {
 | 
        
           |  |  | 379 | 			if (strpos(Config::get('nom_projet'), 'bd') === 0 && $projet == null) {
 | 
        
           |  |  | 380 | 				$projet 		= 'bdnt';
 | 
        
           |  |  | 381 | 				$service 		= 'ontologies';
 | 
        
           |  |  | 382 | 				$ressource 		= '';
 | 
        
           |  |  | 383 | 			}
 | 
        
           |  |  | 384 | 		}
 | 
        
           |  |  | 385 | 		$param = ($param) ? "?".$param : "";
 | 
        
           |  |  | 386 | 		$url = Config::get('url_service_base').$projet.'/'.$service.'/'.$ressource.$valeur.$param;
 | 
        
           |  |  | 387 | 		return $url;
 | 
        
           |  |  | 388 | 	}
 | 
        
           |  |  | 389 |   | 
        
           | 3 | jpm | 390 | 	/**Permet de consulter une url et retourne le résultat ou une erreur
 | 
        
           |  |  | 391 | 	 * @param $url	 */
 | 
        
           |  |  | 392 | 	public function consulterHref($url) {
 | 
        
           |  |  | 393 | 		$res = $this->getRestClient()->consulter($url);
 | 
        
           |  |  | 394 | 		$entete = $this->getRestClient()->getReponseEntetes();
 | 
        
           |  |  | 395 | 		//Si le service meta-donnees fonctionne correctement, l'entete comprend la clé wrapper_data
 | 
        
           |  |  | 396 | 		if (isset($entete['wrapper_data'])) {
 | 
        
           |  |  | 397 | 			$res = json_decode($res);
 | 
        
           |  |  | 398 | 			return $res;
 | 
        
           |  |  | 399 | 		} else {
 | 
        
           |  |  | 400 | 			$u = 'L\'url <a href="'.$url.'">'.$url.'</a> lancée via RestClient renvoie une erreur';
 | 
        
           |  |  | 401 | 			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $u);
 | 
        
           |  |  | 402 | 		}
 | 
        
           |  |  | 403 | 	}
 | 
        
           |  |  | 404 |   | 
        
           |  |  | 405 | 	public function transliterer(&$service, &$val) {
 | 
        
           |  |  | 406 | 		if (preg_match('/^.+:(.+)$/', $val, $match)) {
 | 
        
           |  |  | 407 | 			$val = $match[1];
 | 
        
           |  |  | 408 | 		}
 | 
        
           |  |  | 409 | 		$service = str_replace(array('_Ga','_Co','_meta'), '', $service);
 | 
        
           |  |  | 410 | 		if ($service == 'rang') {
 | 
        
           |  |  | 411 | 			$ressource = 'rangTaxo';
 | 
        
           |  |  | 412 | 		} elseif (preg_match('/^(statut)(?:_|-)([^_-]+)$/', $service, $match)) {
 | 
        
           |  |  | 413 | 			$service = $match[1].ucfirst($match[2]);
 | 
        
           |  |  | 414 | 		} elseif (strrpos($service, 'datum') !== false) {
 | 
        
           |  |  | 415 | 			$service = 'datum';
 | 
        
           |  |  | 416 | 		}
 | 
        
           |  |  | 417 | 	}
 | 
        
           |  |  | 418 |   | 
        
           | 937 | raphael | 419 | 	static function s_transliterer(&$service, &$val) {
 | 
        
           |  |  | 420 | 		if (preg_match('/^.+:(.+)$/', $val, $match)) {
 | 
        
           |  |  | 421 | 			$val = $match[1];
 | 
        
           |  |  | 422 | 		}
 | 
        
           |  |  | 423 | 		$service = str_replace(array('_Ga','_Co','_meta'), '', $service);
 | 
        
           |  |  | 424 | 		if ($service == 'rang') {
 | 
        
           |  |  | 425 | 			$ressource = 'rangTaxo';
 | 
        
           |  |  | 426 | 		} elseif (preg_match('/^(statut)(?:_|-)([^_-]+)$/', $service, $match)) {
 | 
        
           |  |  | 427 | 			$service = $match[1].ucfirst($match[2]);
 | 
        
           |  |  | 428 | 		} elseif (strrpos($service, 'datum') !== false) {
 | 
        
           |  |  | 429 | 			$service = 'datum';
 | 
        
           |  |  | 430 | 		}
 | 
        
           |  |  | 431 | 	}
 | 
        
           |  |  | 432 |   | 
        
           | 609 | mathilde | 433 | 	// prend en arguments la valeur de la recherche, les résultats approchés, le paramétre recherche
 | 
        
           |  |  | 434 | 	// retourne le tableau trié en fonction de la ressemblance entre le résultat approché et la valeur recherchée
 | 
        
           | 3 | jpm | 435 | 	public function trierRechercheFloue($nom_demande, $tab_approchee, $nom) {
 | 
        
           |  |  | 436 | 		$trie = '';
 | 
        
           |  |  | 437 | 		$resultat = array();
 | 
        
           |  |  | 438 | 		foreach ($tab_approchee as $id => $tab) {
 | 
        
           |  |  | 439 | 			$nom_demande_ss = strtolower(Chaine::supprimerAccents($nom_demande));
 | 
        
           |  |  | 440 | 			$nom_flou_ss = strtolower(Chaine::supprimerAccents($tab[$nom]));
 | 
        
           |  |  | 441 | 			$stat = array();
 | 
        
           |  |  | 442 | 			// Prime pour la ressemblance globale :
 | 
        
           |  |  | 443 | 			$score = 500 - levenshtein($nom_flou_ss, $nom_demande_ss);
 | 
        
           |  |  | 444 | 			// On affine
 | 
        
           |  |  | 445 | 			$score = $score + (similar_text($nom_demande_ss, $nom_flou_ss) * 3);
 | 
        
           |  |  | 446 | 			$stat['score'] = $score;
 | 
        
           |  |  | 447 | 			foreach ($tab as $key => $valeur) {
 | 
        
           |  |  | 448 | 				$stat[$key] = $valeur;
 | 
        
           |  |  | 449 | 			}
 | 
        
           |  |  | 450 | 			$resultat[] = $stat;
 | 
        
           |  |  | 451 | 		}
 | 
        
           |  |  | 452 |   | 
        
           |  |  | 453 |   | 
        
           |  |  | 454 | 		// Vérification que nous avons bien trouvé un nom approché
 | 
        
           |  |  | 455 | 		if (count($resultat) > 0) {
 | 
        
           |  |  | 456 | 			$trie = Tableau::trierMD($resultat, array('score' => SORT_DESC));
 | 
        
           |  |  | 457 | 		}
 | 
        
           |  |  | 458 | 		return $trie;
 | 
        
           |  |  | 459 | 	}
 | 
        
           |  |  | 460 |   | 
        
           |  |  | 461 | 	protected function recupererTableauConfig($param) {
 | 
        
           |  |  | 462 | 		$tableau = array();
 | 
        
           |  |  | 463 | 		$tableauPartiel = explode(',', Config::get($param));
 | 
        
           |  |  | 464 | 		$tableauPartiel = array_map('trim', $tableauPartiel);
 | 
        
           |  |  | 465 | 		foreach ($tableauPartiel as $champ) {
 | 
        
           |  |  | 466 | 			if (strpos($champ, '=') === false) {
 | 
        
           |  |  | 467 | 				$tableau[] = $champ;
 | 
        
           |  |  | 468 | 			} else {
 | 
        
           |  |  | 469 | 				list($cle, $val) = explode('=', $champ);
 | 
        
           |  |  | 470 | 				$tableau[$cle] = $val;
 | 
        
           |  |  | 471 | 			}
 | 
        
           |  |  | 472 | 		}
 | 
        
           |  |  | 473 | 		return $tableau;
 | 
        
           |  |  | 474 | 	}
 | 
        
           |  |  | 475 |   | 
        
           | 937 | raphael | 476 | 	static function s_recupererTableauConfig($param) {
 | 
        
           |  |  | 477 | 		$tableau = array();
 | 
        
           |  |  | 478 | 		$tableauPartiel = array_map('trim', explode(',', Config::get($param)));
 | 
        
           |  |  | 479 | 		foreach ($tableauPartiel as $champ) {
 | 
        
           |  |  | 480 | 			if (strpos($champ, '=') === false) {
 | 
        
           |  |  | 481 | 				$tableau[] = $champ;
 | 
        
           |  |  | 482 | 			} else {
 | 
        
           |  |  | 483 | 				list($cle, $val) = explode('=', $champ);
 | 
        
           |  |  | 484 | 				$tableau[$cle] = $val;
 | 
        
           |  |  | 485 | 			}
 | 
        
           |  |  | 486 | 		}
 | 
        
           |  |  | 487 | 		return $tableau;
 | 
        
           |  |  | 488 | 	}
 | 
        
           |  |  | 489 |   | 
        
           | 3 | jpm | 490 | 	//+------------------------------------------------------------------------------------------------------+
 | 
        
           |  |  | 491 | 	// Méthodes d'accès aux objets du Framework
 | 
        
           |  |  | 492 | 	/**
 | 
        
           |  |  | 493 | 	 * Méthode de connection à la base de données sur demande.
 | 
        
           |  |  | 494 | 	 * Tous les services web n'ont pas besoin de s'y connecter.
 | 
        
           |  |  | 495 | 	 */
 | 
        
           |  |  | 496 | 	protected function getBdd() {
 | 
        
           |  |  | 497 | 		if (! isset($this->Bdd)) {
 | 
        
           |  |  | 498 | 			$this->Bdd = new Bdd();
 | 
        
           |  |  | 499 | 		}
 | 
        
           |  |  | 500 | 		return $this->Bdd;
 | 
        
           |  |  | 501 | 	}
 | 
        
           |  |  | 502 |   | 
        
           |  |  | 503 | 	/**
 | 
        
           |  |  | 504 | 	 * Méthode permettant de faire appel à un client REST en fonction des besoins du service.
 | 
        
           |  |  | 505 | 	 */
 | 
        
           |  |  | 506 | 	protected function getRestClient() {
 | 
        
           |  |  | 507 | 		if (! isset($this->RestClient)) {
 | 
        
           |  |  | 508 | 			$this->RestClient = new RestClient();
 | 
        
           |  |  | 509 | 		}
 | 
        
           |  |  | 510 | 		return $this->RestClient;
 | 
        
           |  |  | 511 | 	}
 | 
        
           | 807 | raphael | 512 |   | 
        
           |  |  | 513 |   | 
        
           |  |  | 514 | 	/**
 | 
        
           |  |  | 515 | 	 * Génération de fichiers pour les cartes
 | 
        
           |  |  | 516 | 	 */
 | 
        
           |  |  | 517 | 	static function convertirEnPNGAvecRsvg($idFichier, $chemin, $svg) {
 | 
        
           |  |  | 518 | 		// test répertoire de cache
 | 
        
           |  |  | 519 | 		if(!is_dir($chemin)) {
 | 
        
           |  |  | 520 | 			mkdir($chemin, 0777, true);
 | 
        
           |  |  | 521 | 		}
 | 
        
           |  |  | 522 | 		if(!is_dir($chemin)) {
 | 
        
           |  |  | 523 | 			error_log(__FILE__ . ": can't create cache {$chemin}");
 | 
        
           |  |  | 524 | 			return NULL;
 | 
        
           |  |  | 525 | 		}
 | 
        
           |  |  | 526 |   | 
        
           |  |  | 527 | 		// test présence du binaire de conversion (rsvg)
 | 
        
           |  |  | 528 | 		/*
 | 
        
           |  |  | 529 | 		  // `which` no possible using safe-mode...
 | 
        
           |  |  | 530 | 		$i = $s = NULL;
 | 
        
           |  |  | 531 | 		exec('which rsvg-convert', $s, $i);
 | 
        
           |  |  | 532 | 		if($i != 0) {
 | 
        
           |  |  | 533 | 			error_log(__FILE__ . ": no rsvg-convert binary");
 | 
        
           |  |  | 534 | 			return NULL;
 | 
        
           |  |  | 535 | 		}
 | 
        
           |  |  | 536 | 		*/
 | 
        
           |  |  | 537 | 		// conversion svg => png
 | 
        
           | 847 | aurelien | 538 | 		// troncage du nom de fichier si celui-ci est trop long
 | 
        
           |  |  | 539 | 		// (passé 255 caractères, le risque de collision est très faible)
 | 
        
           |  |  | 540 | 		$cheminReduit = substr($chemin.$idFichier, 0, 240);
 | 
        
           |  |  | 541 |   | 
        
           |  |  | 542 | 		$fichierPng = $cheminReduit.'.png';
 | 
        
           |  |  | 543 | 		$fichierSvg = $cheminReduit.'.svg';
 | 
        
           |  |  | 544 |   | 
        
           |  |  | 545 |   | 
        
           | 807 | raphael | 546 | 		file_put_contents($fichierSvg, $svg);
 | 
        
           |  |  | 547 | 		$i = $s = NULL;
 | 
        
           |  |  | 548 | 		$rsvg = exec("rsvg-convert $fichierSvg -d 75 -p 75 -o $fichierPng", $s, $i);
 | 
        
           |  |  | 549 | 		if($i != 0) {
 | 
        
           |  |  | 550 | 			error_log(__FILE__ . ": `rsvg-convert $fichierSvg -o $fichierPng` returned $i: " . implode(', ', $s));
 | 
        
           |  |  | 551 | 			return NULL;
 | 
        
           |  |  | 552 | 		}
 | 
        
           |  |  | 553 |   | 
        
           |  |  | 554 | 		self::indexerFichierPng($fichierPng);
 | 
        
           |  |  | 555 | 		return file_get_contents($fichierPng);
 | 
        
           |  |  | 556 | 	}
 | 
        
           |  |  | 557 |   | 
        
           |  |  | 558 | 	static function indexerFichierPng($fichierPng) {
 | 
        
           |  |  | 559 | 		$img = imagecreatefrompng($fichierPng);
 | 
        
           |  |  | 560 | 		imagetruecolortopalette($img, false, 32);
 | 
        
           |  |  | 561 | 		$blanc = imagecolorallocate($img, 255, 255, 255);
 | 
        
           |  |  | 562 | 		imagefill($img, 0, 0, $blanc);
 | 
        
           |  |  | 563 | 		imagepng($img, $fichierPng, 9, PNG_ALL_FILTERS);
 | 
        
           |  |  | 564 | 	}
 | 
        
           | 940 | aurelien | 565 |   | 
        
           |  |  | 566 | 	//+------------------------------------------------------------------------------------------------------+
 | 
        
           |  |  | 567 | 	// Fonctions appelées par plusieurs web services
 | 
        
           | 941 | aurelien | 568 | 	public function obtenirNumNomTaxonsSuperieurs($referentiel, $nn_demande) {
 | 
        
           | 940 | aurelien | 569 | 		$nn_taxons_sup = array();
 | 
        
           |  |  | 570 | 		// TODO: ceci ramène trop de champs alors que l'on a besoin que du numéro nomenclatural
 | 
        
           |  |  | 571 | 		// et il y a peut-être un meilleur moyen que ramener la hierarchie des taxons supérieurs
 | 
        
           |  |  | 572 | 		// mais pour le moment ça marche et c'est assez rapide
 | 
        
           | 941 | aurelien | 573 | 		$url = $this->ajouterHrefAutreProjet('taxons', $nn_demande, '/relations/superieurs',$referentiel);
 | 
        
           | 940 | aurelien | 574 | 		$classification = $this->consulterHref($url);
 | 
        
           |  |  | 575 | 		$classification = is_object($classification) ? get_object_vars($classification) : array();
 | 
        
           |  |  | 576 |   | 
        
           |  |  | 577 | 		if(isset($classification[$nn_demande])) {
 | 
        
           |  |  | 578 | 			$classification_nn_demande = get_object_vars($classification[$nn_demande]);
 | 
        
           |  |  | 579 | 			$tab_nn_demandes = array_keys($classification_nn_demande);
 | 
        
           |  |  | 580 | 			$nn_taxons_sup = $tab_nn_demandes;
 | 
        
           |  |  | 581 | 		}
 | 
        
           |  |  | 582 | 		return $nn_taxons_sup;
 | 
        
           |  |  | 583 | 	}
 | 
        
           | 3 | jpm | 584 | }
 | 
        
           |  |  | 585 | ?>
 |