Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev 3 Rev 81
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 consulter($ressources, $parametres) {
47
	public function consulter($ressources, $parametres) {
48
			$this->ressources = $ressources;
48
			$this->ressources = $ressources;
49
			$this->parametres = $parametres;
49
			$this->parametres = $parametres;
50
			$this->chargerNomDuService();
50
			$this->chargerNomDuService();
51
 
51
 
52
			$this->traiterParametres();
52
			$this->traiterParametres();
53
			$this->traiterVersionProjet();
53
			$this->traiterVersionProjet();
54
 
54
 
55
			$resultats = '';
55
			$resultats = '';
56
			foreach ($this->table_version as $version) {
56
			foreach ($this->table_version as $version) {
57
				$this->table = $version; //on stocke le nom de la table correspondant à la version du projet en cours
57
				$this->table = $version; //on stocke le nom de la table correspondant à la version du projet en cours
58
				$this->recupererNomChamp($this->table); //on récupère les noms des champs disponibles (Ds Commun.php)
58
				$this->recupererNomChamp($this->table); //on récupère les noms des champs disponibles (Ds Commun.php)
59
				$this->traiterRessources(); //dans CommunNomsTaxons.php
59
				$this->traiterRessources(); //dans CommunNomsTaxons.php
60
				$requete = $this->assemblerLaRequete();
60
				$requete = $this->assemblerLaRequete();
61
				$resultat = $this->getBdd()->recupererTous($requete);
61
				$resultat = $this->getBdd()->recupererTous($requete);
62
				$versionResultat = $this->traiterResultat($resultat, $version, $requete);
62
				$versionResultat = $this->traiterResultat($resultat, $version, $requete);
63
				if (count($this->table_version) > 1) {
63
				if (count($this->table_version) > 1) {
64
					$resultats[$version] = $versionResultat;
64
					$resultats[$version] = $versionResultat;
65
				} else {
65
				} else {
66
					$resultats = $versionResultat;
66
					$resultats = $versionResultat;
67
				}
67
				}
68
			}
68
			}
69
 
69
 
70
		return $resultats;
70
		return $resultats;
71
	}
71
	}
72
 
72
 
73
	private function chargerNomDuService() {
73
	private function chargerNomDuService() {
74
		$this->serviceNom = get_class($this);
74
		$this->serviceNom = get_class($this);
75
	}
75
	}
76
 
76
 
77
	public function traiterResultat($resultat, $version, $requete) {
77
	public function traiterResultat($resultat, $version, $requete) {
78
		$versionResultat = null;
78
		$versionResultat = null;
79
		if ($resultat == '') {
79
		if ($resultat == '') {
80
			//cas ou la requete comporte des erreurs
80
			//cas ou la requete comporte des erreurs
81
			$message = 'La requête SQL formée comporte une erreur!';
81
			$message = 'La requête SQL formée comporte une erreur!';
82
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
82
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
83
			throw new Exception($message, $code);
83
			throw new Exception($message, $code);
84
		} elseif ($resultat) {
84
		} elseif ($resultat) {
85
			$versionResultat = $this->retournerResultatFormate($resultat, $version);
85
			$versionResultat = $this->retournerResultatFormate($resultat, $version);
86
		} else {
86
		} else {
87
			$message = 'Les données recherchées sont introuvables.';
87
			$message = 'Les données recherchées sont introuvables.';
88
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
88
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
89
			throw new Exception($message, $code);
89
			throw new Exception($message, $code);
90
		}
90
		}
91
		return $versionResultat;
91
		return $versionResultat;
92
	}
92
	}
93
 
93
 
94
	//+------------------------------------------------------------------------------------------------------+
94
	//+------------------------------------------------------------------------------------------------------+
95
	// Méthodes concernant les paramètres
95
	// Méthodes concernant les paramètres
96
	/**
96
	/**
97
	 *  Permet de récupérer une liste des noms des champs de la table passée en paramètre
97
	 *  Permet de récupérer une liste des noms des champs de la table passée en paramètre
98
	 *  @param $table : Nom de la table dont on souhaite connaitre les champs
98
	 *  @param $table : Nom de la table dont on souhaite connaitre les champs
99
	 */
99
	 */
100
	public function recupererNomChamp($table) {
100
	public function recupererNomChamp($table) {
101
		$requete = 'SHOW FIELDS FROM '.$table;
101
		$requete = 'SHOW FIELDS FROM '.$table;
102
 
102
 
103
		$resultat = $this->getBdd()->recupererTous($requete);
103
		$resultat = $this->getBdd()->recupererTous($requete);
104
		if ($resultat == '') {
104
		if ($resultat == '') {
105
			$e = 'La requête SQL formée comporte une erreur!';
105
			$e = 'La requête SQL formée comporte une erreur!';
106
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
106
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
107
		} elseif ($resultat) {
107
		} elseif ($resultat) {
108
			foreach ($resultat as $info) {
108
			foreach ($resultat as $info) {
109
				$this->champs_table[] = $info['Field'];
109
				$this->champs_table[] = $info['Field'];
110
			}
110
			}
111
		} else {
111
		} else {
112
			$m = "La table recherchée n'existe pas";
112
			$m = "La table recherchée n'existe pas";
113
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $m);
113
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $m);
114
		}
114
		}
115
	}
115
	}
116
 
116
 
117
	/**
117
	/**
118
	 * Fonction permettant de creer la table dont le nom est passé en paramètre (champs_api, champs_bdtfx,
118
	 * Fonction permettant de creer la table dont le nom est passé en paramètre (champs_api, champs_bdtfx,
119
	 * correspondance_champs...). Les données de chaque table sont présentes dans le fichier de configuration config.ini
119
	 * correspondance_champs...). Les données de chaque table sont présentes dans le fichier de configuration config.ini
120
	 * @param String $table : Peut contenir plusieurs nom de table dont on souhaite récupérer les données : table,table,table.
120
	 * @param String $table : Peut contenir plusieurs nom de table dont on souhaite récupérer les données : table,table,table.
121
	 * 	Ex : recupererTableConfig('champs_api,champs_bdtfx')
121
	 * 	Ex : recupererTableConfig('champs_api,champs_bdtfx')
122
	 */
122
	 */
123
	public function recupererTableConfig($table) {
123
	public function recupererTableConfig($table) {
124
		$tables = explode(',', $table);
124
		$tables = explode(',', $table);
125
		foreach ($tables as $tab) {
125
		foreach ($tables as $tab) {
126
			$tableau = explode(',', Config::get($tab));
126
			$tableau = explode(',', Config::get($tab));
127
			$tableau = array_map('trim', $tableau);
127
			$tableau = array_map('trim', $tableau);
128
			foreach ($tableau as $champ) {
128
			foreach ($tableau as $champ) {
129
				list($code, $rang) = explode('=', $champ);
129
				list($code, $rang) = explode('=', $champ);
130
				$tab_tampon[$code] = $rang;
130
				$tab_tampon[$code] = $rang;
131
			}
131
			}
132
			$this->$tab = $tab_tampon;
132
			$this->$tab = $tab_tampon;
133
			$tab_tampon = array();
133
			$tab_tampon = array();
134
		}
134
		}
135
	}
135
	}
136
 
136
 
137
	public function renvoyerErreur($entete, $message) {
137
	public function renvoyerErreur($entete, $message) {
138
		throw new Exception($message, $entete);
138
		throw new Exception($message, $entete);
139
	}
139
	}
140
 
140
 
141
	/**
141
	/**
142
	 * Permet de remplir la variable version_projet et de retirer cette donnée du tableau des ressources
142
	 * Permet de remplir la variable version_projet et de retirer cette donnée du tableau des ressources
143
	 * @param $ressources
143
	 * @param $ressources
144
	 */
144
	 */
145
	public function traiterVersionProjet() {
145
	public function traiterVersionProjet() {
146
		if (isset($this->parametres['version'])) {
146
		if (isset($this->parametres['version.projet'])) {
147
			if (preg_match('/(?:v[0-9]+(?:(?:_|[.])[0-9]+)?|[*])/', $this->parametres['version'])) {
147
			if (preg_match('/(?:v[0-9]+(?:(?:_|[.])[0-9]+)?|[*])/', $this->parametres['version.projet'])) {
148
				$this->version_projet = $this->parametres['version'];
148
				$this->version_projet = $this->parametres['version.projet'];
149
				$this->version_projet = str_replace('.', '_', $this->version_projet);
149
				$this->version_projet = str_replace('.', '_', $this->version_projet);
150
			} else {
-
 
151
				$this->version_projet = '+';
-
 
152
			}
150
			}
153
		}
151
		}
154
		//si la liste des noms est demandée pr toutes les versions, on affiche seulement la dernière version :
152
		//si la liste des noms est demandée pr toutes les versions, on affiche seulement la dernière version :
155
		if ($this->version_projet == '*' && $this->ressources == array()) {
153
		if ($this->version_projet == '*' && $this->ressources == array()) {
156
			$this->version_projet = '+';
154
			$this->version_projet = '+';
157
		}
155
		}
158
		//on recupère les versions du projet disponible dans la table des meta-donnees (utilisation service MetaDonnees)
156
		//on recupère les versions du projet disponible dans la table des meta-donnees (utilisation service MetaDonnees)
159
		$table_num_version = $this->recupererVersionDisponible();
157
		$table_num_version = $this->recupererVersionDisponible();
160
		//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
158
		//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
161
		$this->recupererListeNomTablePrChaqueVersion($table_num_version);
159
		$this->recupererListeNomTablePrChaqueVersion($table_num_version);
162
	}
160
	}
163
 
161
 
164
	/**
162
	/**
165
	 * Recupération des versions disponibles par appel du service metaDonnees
163
	 * Recupération des versions disponibles par appel du service metaDonnees
166
	 * Verification de l'existance du service recherché dans la requete (si précisé : hors *)
164
	 * Verification de l'existance du service recherché dans la requete (si précisé : hors *)
167
	 * @return array  : tableau contenant le numéro de chaque version disponible
165
	 * @return array  : tableau contenant le numéro de chaque version disponible
168
	 */
166
	 */
169
	public function recupererVersionDisponible() {
167
	public function recupererVersionDisponible() {
170
		$versions_dispo = '';
168
		$versions_dispo = '';
171
		$req_version = 'SELECT version FROM '.Config::get('bdd_table_meta');
169
		$req_version = 'SELECT version FROM '.Config::get('bdd_table_meta');
172
		$res_version = $this->getBdd()->recupererTous($req_version);
170
		$res_version = $this->getBdd()->recupererTous($req_version);
173
		if ($res_version == '') { //cas ou la requete comporte des erreurs
171
		if ($res_version == '') { //cas ou la requete comporte des erreurs
174
			$e = "La requête SQL de versionnage formée comporte une erreur : $req_version";
172
			$e = "La requête SQL de versionnage formée comporte une erreur : $req_version";
175
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
173
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
176
		} elseif ($res_version) {
174
		} elseif ($res_version) {
177
			foreach ($res_version as $version) {
175
			foreach ($res_version as $version) {
178
				$versions_dispo[] = $version['version'];
176
				$versions_dispo[] = $version['version'];
179
			}
177
			}
180
		} else {
178
		} else {
181
			$m = 'Versions introuvables dans la table des méta-données';
179
			$m = 'Versions introuvables dans la table des méta-données';
182
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $m);
180
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $m);
183
		}
181
		}
184
		return $versions_dispo;
182
		return $versions_dispo;
185
	}
183
	}
186
 
184
 
187
	public function recupererListeNomTablePrChaqueVersion($table_num_version) {
185
	public function recupererListeNomTablePrChaqueVersion($table_num_version) {
188
		switch ($this->serviceNom) {
186
		switch ($this->serviceNom) {
189
			case 'Ontologies' :
187
			case 'Ontologies' :
190
				$prefixe_table = 'bdd_table_ontologies';
188
				$prefixe_table = 'bdd_table_ontologies';
191
				break;
189
				break;
192
			default:
190
			default:
193
				$prefixe_table = 'bdd_table';
191
				$prefixe_table = 'bdd_table';
194
		}
192
		}
195
		switch ($this->version_projet) {
193
		switch ($this->version_projet) {
196
			case '+' :
194
			case '+' :
197
				$derniere_version = $table_num_version[count($table_num_version) - 1];
195
				$derniere_version = $table_num_version[count($table_num_version) - 1];
198
				$this->table_version[] = Config::get($prefixe_table).'_v'.str_replace('.', '_', $derniere_version);
196
				$this->table_version[] = Config::get($prefixe_table).'_v'.str_replace('.', '_', $derniere_version);
199
				break;
197
				break;
200
			case '*' :
198
			case '*' :
201
				foreach ($table_num_version as $num_version) {
199
				foreach ($table_num_version as $num_version) {
202
					$this->table_version[] = Config::get($prefixe_table).'_v'.str_replace('.', '_', $num_version);
200
					$this->table_version[] = Config::get($prefixe_table).'_v'.str_replace('.', '_', $num_version);
203
				}
201
				}
204
				break;
202
				break;
205
			default  :
203
			default  :
206
				$this->table_version[] = Config::get($prefixe_table).'_'.$this->version_projet;
204
				$this->table_version[] = Config::get($prefixe_table).'_'.$this->version_projet;
207
				break;
205
				break;
208
		}
206
		}
209
	}
207
	}
210
 
208
 
211
	/**
209
	/**
212
	 * Est appelée pour former l'url complete des resultats precedants ou suivants.
210
	 * Est appelée pour former l'url complete des resultats precedants ou suivants.
213
	 * @param int : Permet de connaitre le nombre de noms obtenus par la requete
211
	 * @param int : Permet de connaitre le nombre de noms obtenus par la requete
214
	 * @return string Retourne l'url complete des resultats precedents ou suivant sous la forme d'un tableau
212
	 * @return string Retourne l'url complete des resultats precedents ou suivant sous la forme d'un tableau
215
	 */
213
	 */
216
	public function formulerUrl($nb_resultat, $id = null) {
214
	public function formulerUrl($nb_resultat, $id = null) {
217
		$url = array();
215
		$url = array();
218
		$debut_url = Config::get('url_service').$id.'?';
216
		$debut_url = Config::get('url_service').$id.'?';
219
		//on recré l'url sans les parametres de navigation qui seront rajouter ci-apres. On les enlève dc de la table des parametres
217
		//on recré l'url sans les parametres de navigation qui seront rajouter ci-apres. On les enlève dc de la table des parametres
220
		foreach($this->parametres as $cle => $val) {
218
		foreach($this->parametres as $cle => $val) {
221
			$param_url[str_replace('_', '.', $cle)] = $val;
219
			$param_url[str_replace('_', '.', $cle)] = $val;
222
		}
220
		}
223
 
221
 
224
		$this->recupererLesLimitesSuivantes($nb_resultat, $param_url);
222
		$this->recupererLesLimitesSuivantes($nb_resultat, $param_url);
225
		if (isset($param_url['navigation.depart']) && isset($param_url['navigation.limite'])) {
223
		if (isset($param_url['navigation.depart']) && isset($param_url['navigation.limite'])) {
226
			$url['suivant'] = $debut_url.http_build_query($param_url);
224
			$url['suivant'] = $debut_url.http_build_query($param_url);
227
		}
225
		}
228
 
226
 
229
		$this->recupererLesLimitesPrecedentes($param_url);
227
		$this->recupererLesLimitesPrecedentes($param_url);
230
		if (isset($param_url['navigation.depart']) && isset($param_url['navigation.limite'])) {
228
		if (isset($param_url['navigation.depart']) && isset($param_url['navigation.limite'])) {
231
			$url['precedent'] = $debut_url.http_build_query($param_url);
229
			$url['precedent'] = $debut_url.http_build_query($param_url);
232
		}
230
		}
233
		return $url;
231
		return $url;
234
	}
232
	}
235
 
233
 
236
	public function supprimerNavigation(&$param_url) {
234
	public function supprimerNavigation(&$param_url) {
237
		unset($param_url['navigation.depart']);
235
		unset($param_url['navigation.depart']);
238
		unset($param_url['navigation.limite']);
236
		unset($param_url['navigation.limite']);
239
	}
237
	}
240
 
238
 
241
	/**
239
	/**
242
	 * Description :
240
	 * Description :
243
	 * Permet de former les limites de la requete retournant les résultats suivants.
241
	 * Permet de former les limites de la requete retournant les résultats suivants.
244
	 * Cette url sera afficher dans l'entete de la reponse retournée en format JSON (retour.format=defaut).
242
	 * Cette url sera afficher dans l'entete de la reponse retournée en format JSON (retour.format=defaut).
245
	 * @param int : $nb_resultat : Permet de connaitre le nombre de résultats obtenus par la requete
243
	 * @param int : $nb_resultat : Permet de connaitre le nombre de résultats obtenus par la requete
246
	 * @return string : la fin de l'url decrivant les limites des resultats suivants. Si aucun résultats ne suient,
244
	 * @return string : la fin de l'url decrivant les limites des resultats suivants. Si aucun résultats ne suient,
247
	 * une chaine de caractère vide est retournée
245
	 * une chaine de caractère vide est retournée
248
	 */
246
	 */
249
	public function recupererLesLimitesSuivantes($nb_resultat, &$param_url_suiv) {
247
	public function recupererLesLimitesSuivantes($nb_resultat, &$param_url_suiv) {
250
		$this->supprimerNavigation($param_url);
248
		$this->supprimerNavigation($param_url);
251
		$depart = $this->limite_requete['depart'];
249
		$depart = $this->limite_requete['depart'];
252
		$limite = $this->limite_requete['limite'];
250
		$limite = $this->limite_requete['limite'];
253
		$depart_suivant = $depart + $limite;
251
		$depart_suivant = $depart + $limite;
254
		$limite_suivant = $limite;
252
		$limite_suivant = $limite;
255
		if ($nb_resultat > $depart_suivant) {
253
		if ($nb_resultat > $depart_suivant) {
256
			$param_url_suiv['navigation.depart'] = $depart_suivant;
254
			$param_url_suiv['navigation.depart'] = $depart_suivant;
257
			$param_url_suiv['navigation.limite'] = $limite_suivant;
255
			$param_url_suiv['navigation.limite'] = $limite_suivant;
258
		} else {
256
		} else {
259
			$param_url_suiv['navigation.depart'] = null;
257
			$param_url_suiv['navigation.depart'] = null;
260
			$param_url_suiv['navigation.limite'] = null;
258
			$param_url_suiv['navigation.limite'] = null;
261
		}
259
		}
262
	}
260
	}
263
 
261
 
264
	/**
262
	/**
265
	 * Description :
263
	 * Description :
266
	 * Permet de former les limites de la requete retournant les résultats precedents.
264
	 * Permet de former les limites de la requete retournant les résultats precedents.
267
	 * Cette url sera afficher dans l'entete de la taxons/105reponse retournée en format JSON (retour.format=defaut)
265
	 * Cette url sera afficher dans l'entete de la taxons/105reponse retournée en format JSON (retour.format=defaut)
268
	 * @return string : la fin de l'url decrivant les limites des resultats precedents.
266
	 * @return string : la fin de l'url decrivant les limites des resultats precedents.
269
	 * Si aucun résultats ne precedent, une chaine de caractère vide est retournée
267
	 * Si aucun résultats ne precedent, une chaine de caractère vide est retournée
270
	 */
268
	 */
271
	public function recupererLesLimitesPrecedentes(&$param_url) {
269
	public function recupererLesLimitesPrecedentes(&$param_url) {
272
		$this->supprimerNavigation($param_url);
270
		$this->supprimerNavigation($param_url);
273
		$depart = $this->limite_requete['depart'];
271
		$depart = $this->limite_requete['depart'];
274
		$limite = $this->limite_requete['limite'];
272
		$limite = $this->limite_requete['limite'];
275
		if ($depart == 0) {
273
		if ($depart == 0) {
276
			$url_precedente = '';
274
			$url_precedente = '';
277
		} else {
275
		} else {
278
			if (($depart - $limite) < 0) {
276
			if (($depart - $limite) < 0) {
279
				$depart_precedent = 0;
277
				$depart_precedent = 0;
280
			} else {
278
			} else {
281
				$depart_precedent = $depart - $limite;
279
				$depart_precedent = $depart - $limite;
282
			}
280
			}
283
			$param_url['navigation.depart'] = $depart_precedent;
281
			$param_url['navigation.depart'] = $depart_precedent;
284
			$param_url['navigation.limite'] = $limite;
282
			$param_url['navigation.limite'] = $limite;
285
		}
283
		}
286
	}
284
	}
287
 
285
 
288
	public function ajouterHref($service, $val) {
286
	public function ajouterHref($service, $val) {
289
		// http://tela-botanica.org/service:eflore:0.1/[projet]/[version_projet]/[service]/[ressource]:[valeur]
287
		// http://tela-botanica.org/service:eflore:0.1/[projet]/[version_projet]/[service]/[ressource]:[valeur]
290
		if ($this->version_projet == '+') {
288
		if ($this->version_projet == '+') {
291
			$url = Config::get('url_service_base').Config::get('nom_projet').'/'.$service.'/'.$val;
289
			$url = Config::get('url_service_base').Config::get('nom_projet').'/'.$service.'/'.$val;
292
		} else {
290
		} else {
293
			$url = Config::get('url_service_base').Config::get('nom_projet').'/'.$this->version_projet.'/'.$service.'/'.$val;
291
			$url = Config::get('url_service_base').Config::get('nom_projet').'/'.$service.'/'.$val.'?version.projet='.$this->version_projet;
294
		}
292
		}
295
		return $url;
293
		return $url;
296
	}
294
	}
297
 
295
 
298
	public function ajouterHrefAutreProjet($service, $ressource, $valeur, $projet = null, $param = null) {
296
	public function ajouterHrefAutreProjet($service, $ressource, $valeur, $projet = null, $param = null) {
299
		//on enleve les GA et Co, les meta ou les "_"
297
		//on enleve les GA et Co, les meta ou les "_"
300
		$this->transliterer($service, $valeur);
298
		$this->transliterer($service, $valeur);
301
		//on définit les nom des projets, des services et des ressources de l'url (dans les méta-donnees)
299
		//on définit les nom des projets, des services et des ressources de l'url (dans les méta-donnees)
302
		$tab = array(
300
		$tab = array(
303
			'langue' 			  => array('service' => 'langues', 'projet' => 'iso-639-1', 'ressource' => ''),
301
			'langue' 			  => array('service' => 'langues', 'projet' => 'iso-639-1', 'ressource' => ''),
304
			'couverture_spatiale' => array('service' => 'zone-geo', 'projet' => 'iso-3166-1', 'ressource' => ''),
302
			'couverture_spatiale' => array('service' => 'zone-geo', 'projet' => 'iso-3166-1', 'ressource' => ''),
305
			'type' 				  => array('service' => 'ontologies', 'projet' => 'commun', 'ressource' => 'contactType:'),
303
			'type' 				  => array('service' => 'ontologies', 'projet' => 'commun', 'ressource' => 'contactType:'),
306
			'datum' 			  => array('service' => 'ontologies', 'projet' => 'commun', 'ressource' => 'datum:')
304
			'datum' 			  => array('service' => 'ontologies', 'projet' => 'commun', 'ressource' => 'datum:')
307
		);
305
		);
308
		if (array_key_exists($service, $tab)) {
306
		if (array_key_exists($service, $tab)) {
309
			extract($tab[$service]);
307
			extract($tab[$service]);
310
		} else {
308
		} else {
311
			if (strpos(Config::get('nom_projet'), 'bd') === 0 && $projet == null) {
309
			if (strpos(Config::get('nom_projet'), 'bd') === 0 && $projet == null) {
312
				$projet 		= 'bdnt';
310
				$projet 		= 'bdnt';
313
				$service 		= 'ontologies';
311
				$service 		= 'ontologies';
314
				$ressource 		= '';
312
				$ressource 		= '';
315
			}
313
			}
316
		}
314
		}
-
 
315
		if (isset($this->parametres['version.projet'])) {
-
 
316
			$param = ($param) ? "?version.projet=".$this->parametres['version.projet']."&".$param : "?".$this->parametres['version.projet'];
-
 
317
		} else {
317
		$param = ($param) ? "?$param" : "";
318
			$param = ($param) ? "?".$param : "";
-
 
319
		}
-
 
320
		
318
		$url = Config::get('url_service_base').$projet.'/'.$service.'/'.$ressource.$valeur.$param;
321
		$url = Config::get('url_service_base').$projet.'/'.$service.'/'.$ressource.$valeur.$param;
319
		return $url;
322
		return $url;
320
	}
323
	}
321
 
324
 
322
	/**Permet de consulter une url et retourne le résultat ou une erreur
325
	/**Permet de consulter une url et retourne le résultat ou une erreur
323
	 * @param $url	 */
326
	 * @param $url	 */
324
	public function consulterHref($url) {
327
	public function consulterHref($url) {
325
		$res = $this->getRestClient()->consulter($url);
328
		$res = $this->getRestClient()->consulter($url);
326
		$entete = $this->getRestClient()->getReponseEntetes();
329
		$entete = $this->getRestClient()->getReponseEntetes();
327
		//Si le service meta-donnees fonctionne correctement, l'entete comprend la clé wrapper_data
330
		//Si le service meta-donnees fonctionne correctement, l'entete comprend la clé wrapper_data
328
		if (isset($entete['wrapper_data'])) {
331
		if (isset($entete['wrapper_data'])) {
329
			$res = json_decode($res);
332
			$res = json_decode($res);
330
			return $res;
333
			return $res;
331
		} else {
334
		} else {
332
			$u = 'L\'url <a href="'.$url.'">'.$url.'</a> lancée via RestClient renvoie une erreur';
335
			$u = 'L\'url <a href="'.$url.'">'.$url.'</a> lancée via RestClient renvoie une erreur';
333
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $u);
336
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $u);
334
		}
337
		}
335
	}
338
	}
336
 
339
 
337
	public function transliterer(&$service, &$val) {
340
	public function transliterer(&$service, &$val) {
338
		if (preg_match('/^.+:(.+)$/', $val, $match)) {
341
		if (preg_match('/^.+:(.+)$/', $val, $match)) {
339
			$val = $match[1];
342
			$val = $match[1];
340
		}
343
		}
341
		$service = str_replace(array('_Ga','_Co','_meta'), '', $service);
344
		$service = str_replace(array('_Ga','_Co','_meta'), '', $service);
342
		if ($service == 'rang') {
345
		if ($service == 'rang') {
343
			$ressource = 'rangTaxo';
346
			$ressource = 'rangTaxo';
344
		} elseif (preg_match('/^(statut)(?:_|-)([^_-]+)$/', $service, $match)) {
347
		} elseif (preg_match('/^(statut)(?:_|-)([^_-]+)$/', $service, $match)) {
345
			$service = $match[1].ucfirst($match[2]);
348
			$service = $match[1].ucfirst($match[2]);
346
		} elseif (strrpos($service, 'datum') !== false) {
349
		} elseif (strrpos($service, 'datum') !== false) {
347
			$service = 'datum';
350
			$service = 'datum';
348
		}
351
		}
349
	}
352
	}
350
 
353
 
351
	// prend en valeur la valeur de la recherche, les résultats approchés, le paramétre recherche
354
	// prend en valeur la valeur de la recherche, les résultats approchés, le paramétre recherche
352
	// retourne le tableau trié en fonction de la ressemble entre le résultat approché et la valeur recherchée
355
	// retourne le tableau trié en fonction de la ressemble entre le résultat approché et la valeur recherchée
353
	public function trierRechercheFloue($nom_demande, $tab_approchee, $nom) {
356
	public function trierRechercheFloue($nom_demande, $tab_approchee, $nom) {
354
		$trie = '';
357
		$trie = '';
355
		$resultat = array();
358
		$resultat = array();
356
		foreach ($tab_approchee as $id => $tab) {
359
		foreach ($tab_approchee as $id => $tab) {
357
			$nom_demande_ss = strtolower(Chaine::supprimerAccents($nom_demande));
360
			$nom_demande_ss = strtolower(Chaine::supprimerAccents($nom_demande));
358
			$nom_flou_ss = strtolower(Chaine::supprimerAccents($tab[$nom]));
361
			$nom_flou_ss = strtolower(Chaine::supprimerAccents($tab[$nom]));
359
			$stat = array();
362
			$stat = array();
360
			// Prime pour la ressemblance globale :
363
			// Prime pour la ressemblance globale :
361
			$score = 500 - levenshtein($nom_flou_ss, $nom_demande_ss);
364
			$score = 500 - levenshtein($nom_flou_ss, $nom_demande_ss);
362
			// On affine
365
			// On affine
363
			$score = $score + (similar_text($nom_demande_ss, $nom_flou_ss) * 3);
366
			$score = $score + (similar_text($nom_demande_ss, $nom_flou_ss) * 3);
364
			$stat['score'] = $score;
367
			$stat['score'] = $score;
365
			foreach ($tab as $key => $valeur) {
368
			foreach ($tab as $key => $valeur) {
366
				$stat[$key] = $valeur;
369
				$stat[$key] = $valeur;
367
			}
370
			}
368
			$resultat[] = $stat;
371
			$resultat[] = $stat;
369
		}
372
		}
370
 
373
 
371
 
374
 
372
		// Vérification que nous avons bien trouvé un nom approché
375
		// Vérification que nous avons bien trouvé un nom approché
373
		if (count($resultat) > 0) {
376
		if (count($resultat) > 0) {
374
			$trie = Tableau::trierMD($resultat, array('score' => SORT_DESC));
377
			$trie = Tableau::trierMD($resultat, array('score' => SORT_DESC));
375
		}
378
		}
376
		return $trie;
379
		return $trie;
377
	}
380
	}
378
 
381
 
379
	protected function recupererTableauConfig($param) {
382
	protected function recupererTableauConfig($param) {
380
		$tableau = array();
383
		$tableau = array();
381
		$tableauPartiel = explode(',', Config::get($param));
384
		$tableauPartiel = explode(',', Config::get($param));
382
		$tableauPartiel = array_map('trim', $tableauPartiel);
385
		$tableauPartiel = array_map('trim', $tableauPartiel);
383
		foreach ($tableauPartiel as $champ) {
386
		foreach ($tableauPartiel as $champ) {
384
			if (strpos($champ, '=') === false) {
387
			if (strpos($champ, '=') === false) {
385
				$tableau[] = $champ;
388
				$tableau[] = $champ;
386
			} else {
389
			} else {
387
				list($cle, $val) = explode('=', $champ);
390
				list($cle, $val) = explode('=', $champ);
388
				$tableau[$cle] = $val;
391
				$tableau[$cle] = $val;
389
			}
392
			}
390
		}
393
		}
391
		return $tableau;
394
		return $tableau;
392
	}
395
	}
393
 
396
 
394
	//+------------------------------------------------------------------------------------------------------+
397
	//+------------------------------------------------------------------------------------------------------+
395
	// Méthodes d'accès aux objets du Framework
398
	// Méthodes d'accès aux objets du Framework
396
	/**
399
	/**
397
	 * Méthode de connection à la base de données sur demande.
400
	 * Méthode de connection à la base de données sur demande.
398
	 * Tous les services web n'ont pas besoin de s'y connecter.
401
	 * Tous les services web n'ont pas besoin de s'y connecter.
399
	 */
402
	 */
400
	protected function getBdd() {
403
	protected function getBdd() {
401
		if (! isset($this->Bdd)) {
404
		if (! isset($this->Bdd)) {
402
			$this->Bdd = new Bdd();
405
			$this->Bdd = new Bdd();
403
		}
406
		}
404
		return $this->Bdd;
407
		return $this->Bdd;
405
	}
408
	}
406
 
409
 
407
	/**
410
	/**
408
	 * Méthode permettant de faire appel à un client REST en fonction des besoins du service.
411
	 * Méthode permettant de faire appel à un client REST en fonction des besoins du service.
409
	 */
412
	 */
410
	protected function getRestClient() {
413
	protected function getRestClient() {
411
		if (! isset($this->RestClient)) {
414
		if (! isset($this->RestClient)) {
412
			$this->RestClient = new RestClient();
415
			$this->RestClient = new RestClient();
413
		}
416
		}
414
		return $this->RestClient;
417
		return $this->RestClient;
415
	}
418
	}
416
}
419
}
417
?>
420
?>