Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

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