Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 1103 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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