Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 880 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6 jpm 1
<?php
2
 
3
 
4
/**
5
* Description :
6
* Classe Noms.php permettant de fournir des informations sur les noms scientifiques.
7
* Si l'url finit par /noms on retourne une liste de noms latin et leurs identifiants (seulement les 100 premeiers noms par défaut).
8
* L'url peut contenir des paramètres optionnels passés après le ? : /noms?param1=val1&param2=val2&...
9
*
10
* Les paramètres de requête disponibles sont : masque, masque.gen (nom de genre), masque.sp (épithète d'espèce), masque.ssp (épithète infra-spécifique),
11
* masque.au (auteur du nom), masque.an (année de publication du nom), masque.bib (réf biblio de la publi d'origine du nom), masque.ad (nomen addendum),
12
* masque.nn (identifiant du nom), recherche, rang, distinct, retour.format, nl.format, nl.structure, navigation.depart et navigation.limite.
13
*
14
* Encodage en entrée : utf8
15
* Encodage en sortie : utf8
16
* @package framework-v3
17
* @author Jennifer Dhé <jennifer.dhe@tela-botanica.org>
18
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
19
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
20
* @version 1.0
21
* @copyright 1999-${year} Tela Botanica (accueil@tela-botanica.org)
22
*/
23
 
24
 
25
class Noms extends CommunNomsTaxons {
26
 
27
	/** Permet de stocker la requete formulée :
28
	 *   - noms | noms/#id | noms/#id/#champ+#champ
29
	 *   - noms/#id/relations | noms/#id/relations/synonymie | noms/#id/relations/homonymie | noms/#id/relations/flores
30
	 *   - noms/stats/rangs | noms/stats/annees | noms/stats/initiales  */
31
	protected $format_reponse	= 'noms';
32
 
33
	protected $service = 'noms';
34
 
35
	/** Valeur du paramètre de requete recherche : stricte etendue floue  */
36
	protected $recherche  		= false;
37
 
38
	/** Valeur du paramètre de requete distinct (=0|1) */
39
	protected $distinct		 	= null;
40
 
41
	/** Représente la première partie de la requete SQL (entre le SELECT et le WHERE) */
42
	protected $requete_champ 	 = 'num_nom, nom_sci, num_nom_retenu';
43
 
44
	/** Représente la partie de la requete SQL ajoutant une condition (WHERE ...)  */
45
	protected $requete_condition = '';
46
 
47
	/** Représente la partie GROUP BY de la requete SQL (GROUP BY ...) */
48
	protected $requete_group_by  = '';
49
 
50
	/** Permet de stocker les limite de la requete SQL (par défaut seul les 100 premiers résultats seront retournés).*/
51
	protected $limite_requete 	 = array(
52
		'depart' => 0,
53
		'limite' => 100
54
	);
55
 
56
 
57
 
58
	public function consulter($ressources, $parametres) {
59
 
60
		$resultat_formate = '';
61
		$res_version = '';
62
		$this->initialiserRestClient(); //création d'un objet RestClient
63
 
64
		$this->traiterParametres($parametres);
65
		//On récupère les différentes versions existantes ds la table des meta-données (WS metaDonnees) et on traite la version demandée :
66
		$this->traiterVersionProjet($ressources);
67
 
68
		if ($this->corps_http == '' && $this->entete_http == '') {
69
 
70
			foreach ($this->table_version as $version) {
71
				$this->table = $version; //on stocke le nom de la table correspondant à la version du projet en cours
72
				$this->recupererNomChamp($this->table); //on récupère les noms des champs disponibles (Ds Commun.php)
73
				$this->traiterRessources($ressources); //dans CommunNomsTaxons.php
74
 
75
				$requete = $this->assemblerLaRequete();
76
			    $resultat = $this->getBdd()->recupererTous($requete);
77
 
78
				if ($resultat == '') { //cas ou la requete comporte des erreurs
79
					$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,
80
						'La requ&ecirc;te SQL form&eacute;e comporte une erreur !!');
81
				} elseif ($resultat) {
82
					 $res_version[$version] = $resultat;
83
			    } else {
84
			    	$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,
85
			    		'Les donn&eacute;es recherch&eacute;es sont introuvables dans la version '.$version);
86
			    }
87
			}
88
		}
89
 
90
		if ($this->corps_http == '' && $this->entete_http == '') {
91
			$resultat_formate = $this->retournerResultatFormate($res_version);
92
		}
93
		$this->formerReponseHTTP($resultat_formate);
94
	}
95
 
96
 
97
 
98
//-----------------FONCTION D'ANALYSE DES PARAMETRES--------------------------------------------------------------------
99
 
100
 
101
	/**
102
	 *
103
	 * Permet d'analyser les paramètres
104
	 * @param array $parametres
105
	 */
106
	public function traiterParametres($parametres) {
107
 
108
		$this->table_param = $parametres;
109
		if (isset($parametres) && !empty($parametres)) {
110
			//définition de $recherche permettant d'ajouter les % ds la requete sql (cas recherche étendue) utilisé dans la fct ajouterLeFiltreMasque()
111
			if (isset($parametres['recherche']) && $parametres['recherche'] != '') {
112
				$this->recherche = $parametres['recherche'];
113
			}
114
			foreach ($parametres as $param => $val) {
115
				switch ($param) {
116
					case 'ns_format' 		: $this->html = $val;  										  	break;
117
					case 'ns_structure' 	: $this->remplirTableCompositionNom($val); //ds CommunNomsTaxons.php
118
											  $this->requete_champ .= ' ,'.implode(', ',$this->compo_nom); 	break;
119
					case 'masque'	 		: $this->ajouterLeFiltreMasque('nom_sci', $val);				break;
120
					case 'masque_sg'  		: $this->ajouterLeFiltreMasque('nom_supra_generique', $val); 	break;
121
			        case 'masque_gen' 		: $this->ajouterLeFiltreMasque('genre', $val);			  		break;
122
			        case 'masque_sp'  		: $this->ajouterLeFiltreMasque('epithete_sp', $val); 	 	  	break;
123
			        case 'masque_ssp' 		: $this->ajouterLeFiltreMasque('epithete_infra_sp',$val);   	break;
124
			        case 'masque_au'  		: $this->ajouterLeFiltreMasque('auteur', $val);   		  	  	break;
125
			        case 'masque_an'  		: $this->ajouterLeFiltreMasque('annee', $val);	 				break;
126
			        case 'masque_bib' 		: $this->ajouterLeFiltreMasque('biblio_origine',$val);  	  	break;
127
			        case 'masque_ad'  		: $this->ajouterLeFiltreMasque('nom_addendum', $val);     	  	break;
128
			        case 'masque_nn'  		: $this->requete_condition .= ' AND num_nom IN ('.$val.')'; break;
129
			        case 'masque_rg' 		: $this->ajouterLeFiltreMasque('rang', $val);					break;
130
			        case 'navigation_depart': $this->limite_requete['depart'] = $val;	  					break;
131
			        case 'navigation_limite': $this->limite_requete['limite'] = $val;	  					break;
132
			        case 'retour_format'	: $this->retour_format = $val; 	  								break;
133
			        case 'distinct'			: $this->distinct = $val; 	  									break;
134
			        case 'recherche'		: 																break;
135
			        default 				: $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
136
			        							'Erreur dans les parametres de recherche de votre requ&ecirc;te :
137
			        							</br> Le parametre " '.$param.' " n\'existe pas.');			break;
138
				}
139
			}
140
			$this->ajouterNomDistinct();
141
			if ($this->recherche == 'floue') {
142
				$this->rechercheFloue();
143
			}
144
		}
145
	}
146
 
147
	/**
148
	 *
149
	 * fonction d'ajout dans la requete SQL des conditions (WHERE ...) en fonctions des parametres demandés
150
	 * @param $nom_champ
151
	 * @param $valeur
152
	 * @param $masque
153
	 */
154
	public function ajouterLeFiltreMasque($nom_champ, $valeur) {
155
 
156
		if ($nom_champ == 'annee' || $nom_champ == 'rang') {
157
			$this->requete_condition .= ' AND '.$nom_champ.' = '.$this->getBdd()->proteger($valeur);
158
		} else {
159
			if ($this->recherche == 'etendue') {
160
				$valeur = str_replace(' ','%', $valeur);
161
				$valeur .= '%';
162
			}
163
			$this->requete_condition .= ' AND '.$nom_champ.' LIKE '.$this->getBdd()->proteger($valeur);
164
		}
165
	}
166
 
167
 
168
	/**
169
	 * Permet de rajouter à la requete sql le parametre distinct. N'est utilisé qu'avec le format oss
170
	 */
171
	public function ajouterNomDistinct() {
172
 
173
		if (isset($this->distinct)) {
174
			if (($this->distinct == 1) && ($this->retour_format == 'oss')) {
175
				if ($this->compo_nom == '') {
176
					$this->requete_champ = ' DISTINCT nom_sci ';
177
				} else {
178
					$this->requete_champ = ' DISTINCT nom_sci, '.implode(', ',$this->compo_nom);
179
				}
180
 
181
			} elseif (($this->distinct == 1) && ($this->retour_format != 'oss')) {
182
				$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,'Erreur dans votre requ&ecirc;te </br>
183
									  L\'utilisation du parametre distinct ne se fait que sous le format oss');
184
			}
185
		}
186
	}
187
 
188
	/**
189
	 *
190
	 * Permet d'ajouter à notre requete une condition de recherche floue à l'aide de l'alhorithme soundex.
191
	 * On remplace ainsi les filtres exceptés le masque année et le filtre rang
192
	 */
193
	public function rechercheFloue() {
194
 
195
		foreach ($this->ordre_masque as $masque) {
196
			if (array_key_exists($masque, $this->table_param)) {
197
				$radical = $this->table_param[$masque];
198
				switch ($masque) {
199
					case 'masque'		: $this->ajoutSoundex('nom_sci', $radical); 			break;
200
					case 'masque_sg'	: $this->ajoutSoundex('nom_supra_generique', $radical); break;
201
					case 'masque_gen'	: $this->ajoutSoundex('genre', $radical); 				break;
202
					case 'masque_sp'	: $this->ajoutSoundex('epithete_sp', $radical); 		break;
203
					case 'masque_ssp'	: $this->ajoutSoundex('epithete_infra_sp', $radical); 	break;
204
					case 'masque_au'	: $this->ajoutSoundex('auteur', $radical); 				break;
205
					default : break;
206
				}
207
			}
208
		}
209
	}
210
 
211
	/** Ajoute à la requete SQL l'expression pour la recherche floue en fonction du masque demandé */
212
	public function ajoutSoundex($champ, $radical) {
213
 
214
		$this->requete_condition = str_replace(' AND '.$champ.' LIKE \''.$radical.'\'',
215
												' AND (SOUNDEX('.$champ.') = SOUNDEX(\''.$radical.'\')'.
216
												' OR SOUNDEX(REVERSE('.$champ.')) = SOUNDEX(REVERSE(\''.$radical.'\'))) ',
217
												$this->requete_condition
218
												);
219
	}
220
 
221
 
222
//-----------------FONCTION D'ANALYSE DES RESSOURCES--------------------------------------------------------------------
223
 
224
 
225
	public function traiterRessourcesIdentifiant() {
226
 
227
		//on initialise la condition de la requete sql et le format de réponse
228
		$this->requete_condition = ' num_nom = '.$this->getBdd()->proteger($this->table_ressources[0]);
229
		$this->format_reponse = $this->service.'/id';
230
 
231
		if (isset($this->table_ressources[1]) && !empty($this->table_ressources[1])) {
232
			// requete de type noms/#id/#champ+#champ
233
			if (($this->table_ressources[1] != 'relations')) {
234
				$this->requete_champ = ' *, nom_sci ';
235
				$this->format_reponse .= '/champ';
236
			// requete de type noms/#id/relations/#relations
237
			} elseif ($this->table_ressources[1] == 'relations') {
238
				$this->traiterRessourceIdRelations();
239
			} else {
240
				$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
241
					  'Erreur dans votre requ&ecirc;te </br> Ressources disponibles : <br/>
242
					 <li> noms/#id/relations </li> <li> noms/#id/#champ+#champ </li>
243
					 <li> noms/#id/relations/synonymie </li> <li> noms/#id/relations/flores </li>
244
					 <li> noms/#id/relations/homonymie </li>');
245
			}
246
		} else {
247
			// requete de type noms/#id : rajout du nom_sci pour récupérer le format html par la fct mettreAuFormat()
248
			// SELECT *, nom_sci FROM bdtfx_v2_00 WHERE num_nom = X;
249
			$this->requete_champ = ' *, nom_sci ';
250
		}
251
	}
252
 
253
 
254
	public function traiterRessourceIdRelations() {
255
 
256
		$this->format_reponse .= '/relations';
257
		if (isset($this->table_ressources[2]) && !empty($this->table_ressources[2])) {
258
			// requete de type noms/#id/relations/#relation
259
			switch ($this->table_ressources[2]) {
260
				case 'synonymie' : $this->traiterRessourceIdSynonymie(); break;
261
				case 'flores' 	 : $this->traiterRessourceIdFlores(); 	 break;
262
				case 'homonymie' : $this->traiterRessourceIdHomonymie(); break;
263
				default : $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
264
					  'Erreur dans votre requ&ecirc;te </br> Ressources disponibles : <br/>
265
					 <li> noms/#id/relations </li>  <li> noms/#id/relations/synonymie </li>
266
					 <li> noms/#id/relations/flores </li> <li> noms/#id/relations/homonymie </li>'); break;
267
			}
268
		}
269
	}
270
 
271
 
272
	public function traiterRessourceIdSynonymie() {
273
		// SELECT num_nom, nom_sci, num_nom_retenu, basionyme FROM bdtfx_v2_00 WHERE num_nom = X LIMIT 0,100;
274
		$this->format_reponse 	 .=  '/synonymie';
275
		if (strrpos($this->requete_champ, ', basionyme') === false) $this->requete_champ 	 .=  ', basionyme ';
276
		$this->requete_condition =  ' num_nom_retenu = (SELECT num_nom_retenu FROM '.$this->table
277
									.' WHERE '.$this->requete_condition.')';
278
	}
279
 
280
 
281
	public function traiterRessourceIdHomonymie() {
282
		// SELECT num_nom, nom_sci, num_nom_retenu FROM bdtfx_v2_00 WHERE nom_sci =
283
		// (SELECT nom_sci FROM bdtfx_v2_00 WHERE num_nom = X);
284
		$this->format_reponse 	 .=  '/homonymie';
285
		$this->requete_condition =  'nom_sci = (SELECT nom_sci FROM '.$this->table
286
									.' WHERE '.$this->requete_condition.')';
287
	}
288
 
289
 
290
	public function traiterRessourceIdFlores() {
291
		$champ_flores = '';
292
		foreach ($this->champs_table as $champ) {
293
			if (preg_match('/^flore_.*$/', $champ)) {
294
				$champ_flores .= ', '.$champ;
295
			}
296
		}
297
		$this->format_reponse .=  '/flores';
298
		$this->requete_champ   = 'num_nom'.$champ_flores;
299
	}
300
 
301
 
302
	public function traiterRessourceStatsRangs() {
303
		// SELECT count(*) as nombre, rang FROM bdtfx_v2_00 [WHERE rang = 290] GROUP BY rang ORDER BY rang;
304
		$this->format_reponse   .= '/rangs';
305
		$this->requete_champ 	 = 'count(*) as nombre, rang ';
306
		$this->requete_group_by  = ' GROUP BY rang ORDER BY rang ';
307
	}
308
 
309
 
310
	public function traiterRessourceStatsAnnees() {
311
		// SELECT count(*) as nombre, annee FROM bdtfx_v2_00 GROUP BY annee ORDER BY annee;
312
		$this->format_reponse   .= '/annees';
313
		$this->requete_champ   	 = 'count(*) as nombre, annee ';
314
		$this->requete_condition = '';
315
		$this->requete_group_by  = ' GROUP BY annee ORDER BY annee ';
316
	}
317
 
318
 
319
	public function traiterRessourceStatsInitiales() {
320
		// SELECT count(left( nom_sci, 2 )) as nb, rang, left(nom_sci, 2) as lettre GROUP BY rang, left(nom_sci, 2);
321
		$this->format_reponse .= '/initiales';
322
		$this->requete_condition = '';
323
		$this->requete_champ   = 'count(left( nom_sci, 2 )) as nb, rang, left(nom_sci, 2) as lettre ';
324
		$this->requete_group_by  = ' GROUP BY rang, left(nom_sci, 2)';
325
	}
326
 
327
 
328
 
329
//-----------------------------FONCTIONS DASSEMBLAGE DE LA REQUETE-----------------------------------------------------
330
 
331
	public function assemblerLaRequete() {
332
 
333
		if ( strrpos($this->format_reponse, 'noms/stats/') === false ) {
334
			$this->mettreAuFormat(); //Ds CommunNomsTaxons.php
335
		}
336
		if ($this->requete_condition != '') {
337
			$this->requete_condition = ltrim($this->requete_condition, ' AND, WHERE');
338
			$this->requete_condition = ' WHERE '.$this->requete_condition;
339
		}
340
		if ($this->format_reponse != 'noms' && $this->format_reponse != 'noms/id/relations/synonymie' && $this->format_reponse != 'noms/id/relations/homonymie') {
341
			$this->requete_limite = '';
342
 
343
		} elseif (($depart = $this->limite_requete['depart']) > ($this->total_resultat = $this->recupererTotalResultat())) {
344
			$this->limite_requete['depart'] =
345
				(($this->total_resultat - $this->limite_requete['limite']) < 0) ? 0 : ($this->total_resultat - $this->limite_requete['limite']);
346
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
347
 
348
		} else {
349
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
350
		}
351
 
352
      	$requete = 	' SELECT '.$this->requete_champ.
353
      				' FROM '.$this->table
354
      				.$this->requete_condition
355
      				.$this->requete_group_by
356
      				.$this->requete_limite;
357
 
358
      	return $requete;
359
 
360
	}
361
 
362
	/**
363
	 * Recupere le nombre total de résultat d'une requete lancée.
364
	 * Est utilisée lors de l'affichage du total dans le résultat retourné et pr déterminer les limites et départ
365
	 * @return nombre total de résultat
366
	 */
367
	public function recupererTotalResultat() {
368
		$total = null;
369
 
370
		$requete = 'SELECT count(*) as nombre FROM '.$this->table.$this->requete_condition.$this->requete_group_by;
371
		$res = $this->getBdd()->recuperer($requete);
372
		if ($res) {
373
			$total = $res['nombre'];
374
		} else {
375
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,
376
			'Fct recupererTotalResultat() : <br/>Donn&eacute;es introuvables dans la base');
377
		}
378
 
379
		return $total;
380
	}
381
 
382
 
383
//-------------------FONCTIONS POUR LE FORMATAGE EN JSON----------------------------------------------------------------
384
 
385
	/**
386
	 * Permet de récupérer le résultat à retourner propre à chaque requete et de l'encoder en json
387
	 * @param array $resultat
388
	 * @param array $ressources
389
	 * @return le résultat encoder en json
390
	 */
391
	public function retournerResultatFormate($resultat) {
392
 
393
		switch ($this->format_reponse) {
394
			case 'noms/id'					   : $reponse = $this->formaterId($resultat); 		 	  break; //ds CommunNomsTaxons
395
			case 'noms/id/champ' 			   : $reponse = $this->formaterIdChamp($resultat); 	  	  break; //ds CommunNomsTaxons
396
			case 'noms/id/relations' 		   : $reponse = $this->formaterIdRelations($resultat);    break;
397
			case 'noms/id/relations/synonymie' : $reponse = $this->formaterIdSynonymie($resultat); 	  break;
398
			case 'noms/id/relations/homonymie' : $reponse = $this->formaterIdHomonymie($resultat); 	  break;
399
			case 'noms/id/relations/flores'    : $reponse = $this->formaterIdFlores($resultat); 	  break; //ds CommunsNomsTaxons
400
			case 'noms/stats/annees' 		   : $reponse = $this->formaterStatsAnnee($resultat); 	  break; //ds CommunNomsTaxons
401
			case 'noms/stats/rangs' 		   : $reponse = $this->formaterStatsRang($resultat); 	  break; //ds CommunNomsTaxons
402
			case 'noms/stats/initiales' 	   : $reponse = $this->formaterStatsInitiales($resultat); break; //ds CommunNomsTaxons
403
			case 'noms' 					   : $reponse = $this->formaterNoms($resultat);     	  break;
404
			default							   : break;
405
		}
406
		return json_encode($reponse);
407
	}
408
 
409
//----------------------concerne les resultats pour des requetes de type noms/id----------------------------------------
410
 
411
 
412
	/**
413
	 * Formate et retourne toutes les relations correpondant au nom recherché : les flores, les synonyme et les homonymes
414
	 * @param array $resultat
415
	 */
416
	public function formaterIdRelations($resultat) {
417
 
418
		$this->recupererTableSignification('correspondance_champs,champs_api,champs_comp');
419
		$res = array();
420
 
421
		foreach ($resultat as $version => $res_version) {
422
			$res_version = $res_version[0];
423
			$this->resultat_req = $res_version;
424
			$retour_id_rel = array ('entete' => array()); //on initialise pr que l'entete apparaisse en premier lors de l'affichage
425
 
426
			//on recupère le resultat de chaque relation (appel du WS correspondant)
427
			$flores = $this->ajouterRelations('flores', $version);
428
			if (isset($flores)) $retour_id_rel['resultat']['flores'] = $flores;
429
			$homonymes = $this->ajouterRelations('homonymie', $version);
430
			if (isset($homonymes)) $retour_id_rel['resultat']['homonymes'] = $homonymes;
431
			$synonymes = $this->ajouterRelations('synonymie', $version);
432
			if (isset($synonymes)) $retour_id_rel['resultat']['synonyme'] = $synonymes;
433
 
434
			//on renvoit un tableau null si il n'existe aucune relations (on efface l'entete en premier lieu)
435
			if (!isset($retour_id_rel['resultat']))	{
436
				$retour_id_rel = null;
437
 
438
			//on rajoute l'entete si des relations existent
439
			} else {
440
				$this->afficherDonnees('num_nom', $this->table_ressources[0]);
441
				$retour_id_rel['entete'] = $this->table_retour;
442
				$this->table_retour = array();
443
			}
444
 
445
			//recuperation du resultat de chaque version
446
			$res = $this->afficherVersionOuPas($version, $retour_id_rel, $res);
447
		}
448
 
449
		return $res;
450
	}
451
 
452
 
453
	/**
454
	 * Recupere les relations (type de la relation passée en paramètres :[type_relation] = synonymie, homonymie ou
455
	 * flores) par l'appel du web service [version]/noms/#id/relations/[type_relation]
456
	 * @param String $relation
457
	 * @param String $version (numéro de la version)
458
	 */
459
	public function ajouterRelations($relation, $version) {
460
 
461
		$version = str_replace(Config::get('bdd_table').'_v', '', $version);
462
		$res = null;
463
		$parametres_url = '';
464
 
465
		if ($this->table_param != array()) $parametres_url = '?'.http_build_query($this->table_param, '', '&');
466
		$url = Config::get('url_service').'/'.$version.'/'.$this->service.'/'.$this->table_ressources[0].'/relations/'
467
									.$relation.$parametres_url;
468
 
469
		$relation = $this->rest_client->consulter($url);
470
		$entete = $this->rest_client->getReponseEntetes();
471
 
472
		//Si le service meta-donnees fonctionne correctement, l'entete comprend la clé wrapper_data
473
		if (isset($entete['wrapper_data'])) {
474
			$relation = json_decode($relation);
475
			if (isset($relation->resultat)) {
476
				$res = $relation->resultat;
477
			}
478
		} else {
479
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,
480
				'Le service '.$this->service.' de ce projet comporte des erreurs. url lancée : '.$url);
481
		}
482
		return $res;
483
	}
484
 
485
 
486
 
487
	/**
488
	 * Formate et retourne toutes les synonymes correpondants au nom recherché
489
	 * @param array $resultat
490
	 */
491
	public function formaterIdSynonymie($resultat) {
492
 
493
		$this->recupererTableSignification('correspondance_champs,champs_api,champs_comp');
494
		$res = array();
495
 
496
		foreach ($resultat as $version => $res_version) {
497
			$retour_id_syn = array();
498
			if ($res_version[0]['num_nom_retenu'] == '') {
499
				$retour_id_syn[] = 'nom_retenu N.D.';
500
			} elseif (count($res_version) != 1) {
501
				//on remplit d'abord l'entete du resultat
502
				$this->table_retour['id'] = $this->table_ressources[0];
503
				$this->afficherEnteteRangBorneTotalUrls($res_version, '/'.$this->service.'/'.$this->table_ressources[0].'/relations/synonymie');
504
				$retour_id_syn['entete'] = $this->table_retour;
505
				$this->table_retour = array();
506
 
507
				//on remplit ensuite les resultats
508
				foreach ($res_version as $tab) {
509
					//pour chaque basionyme, on recupère le résultat : num_nom, nom_sci, basionyme et num_nom_retenu :
510
					$this->resultat_req = $tab;
511
					foreach ($tab as $key => $val) {
512
						if ($val != '') {
513
							switch ($key) {
514
								case 'num_nom_retenu' : $retenu = ($val == $num) ? 'true' : 'false';
515
														$this->table_retour['retenu'] = $retenu; 			break;
516
								case 'basionyme'      : $this->afficherDonnees($key, $val);					break;
517
								case 'num_nom' 		  : $num = $val;
518
														$this->afficherDonnees($key, $val);
519
														unset($this->table_retour['id']);					break;
520
								default 			  : 													break;
521
							}
522
						}
523
					}
524
					$retour_id_syn['resultat'][$num] = $this->table_retour;
525
					$this->table_retour = array();
526
				}
527
			}
528
			if (!isset($retour_id_syn['resultat']) && !in_array('nom_retenu N.D.', $retour_id_syn)) {
529
				$retour_id_syn = null; //on initialise le resultat à null
530
			}
531
			$res = $this->afficherVersionOuPas($version, $retour_id_syn, $res);
532
		}
533
 
534
		return $res;
535
	}
536
 
537
 
538
	/**
539
	 * Formate et retourne toutes les homonymes correpondants au nom recherché
540
	 * @param array $resultat
541
	 */
542
	public function formaterIdHomonymie($resultat) {
543
 
544
		$this->recupererTableSignification('correspondance_champs,champs_api,champs_comp');
545
		$res = array();
546
 
547
		foreach ($resultat as $version => $res_version) {
548
			if (count($res_version) != 1) {
549
				$this->table_retour['id'] = $this->table_ressources[0];
550
				$this->afficherEnteteRangBorneTotalUrls($res_version, '/'.$this->service.'/'.$this->table_ressources[0].'/relations/homonymie');
551
				$retour_id_hom['entete'] = $this->table_retour;
552
				$this->table_retour = array();
553
 
554
				foreach ($res_version as $homonyme) {
555
					$this->resultat_req = $homonyme;
556
					$id = $homonyme['num_nom'];
557
					$this->afficherDonnees('num_nom', $id);
558
					if ($homonyme['num_nom_retenu'] != '') {
559
						$retenu = ($id == $homonyme['num_nom_retenu']) ? 'true' : 'false';
560
						$this->table_retour['retenu'] = $retenu;
561
					}
562
					$retour_id_hom['resultat'][$id] = $this->table_retour;
563
					unset($retour_id_hom['resultat'][$id]['id']);
564
					$this->table_retour = array();
565
				}
566
			} else {
567
				$retour_id_hom = null;
568
			}
569
			$res = $this->afficherVersionOuPas($version, $retour_id_hom, $res);
570
		}
571
		return $res;
572
	}
573
 
574
 
575
	public function formaterIdFlores($resultat) {
576
 
577
		$this->recupererTableSignification('correspondance_champs,champs_api,champs_comp,noms_projets');
578
		$res = array();
579
 
580
		foreach ($resultat as $version => $res_version) {
581
			$res_version = $res_version[0];
582
			$this->resultat_req = $res_version;
583
			$id = array_shift($res_version);
584
			//-----formatage de l'entete du résultat
585
			$reponse['entete']['id'] = $id;
586
			//-----formatage du résultat
587
			$total = 0;
588
 
589
			foreach ($res_version as $flores => $valeur) {
590
				if ($valeur != '' && $valeur != '0') {
591
					$this->afficherInfosFlore($res_version, $flores, $valeur);
592
					$total++;
593
				}
594
			}
595
			$reponse['entete']['total'] = $total;
596
 
597
			if ($this->table_retour != array()) {
598
				$reponse['resultat'] = $this->table_retour;
599
				$this->table_retour = array();
600
			} else {
601
				$reponse = null;
602
			}
603
			//Si les infos de plrs versions sont renvoyés, on ajoute au tableau de resultat le numéro de la version
604
			$res = $this->afficherVersionOuPas($version, $reponse, $res);
605
		}
606
		return $res;
607
	}
608
 
609
 
610
	public function afficherInfosFlore(&$resultat, $flores, $valeur) {
611
 
612
		$flore = substr($flores,0,strrpos($flores, '_'));
613
 
614
		if (strrpos($flores, 'num') !== false) {
615
			$projet = $this->noms_projets[$flore];
616
			if (preg_match('/^([0-9]+)(?:[.]syn[^a-z]*|(.*))?$/', $valeur, $match)) {
617
				$this->table_retour[$flore]['id'] = $match[1];
618
				$this->table_retour[$flore]['href'] = $this->ajouterHrefAutreProjet('noms', $match[1], $projet);
619
				if (isset($match[2]) && $match[2] != '') $this->table_retour[$flore]['cle'] = $match[2];
620
			}
621
			if (isset($resultat[$flore.'_rem']) && !empty($resultat[$flore.'_rem'])) {
622
				$this->table_retour[$flore]['remarque'] = $resultat[$flore.'_rem'];
623
				unset($resultat[$flore.'_rem']);
624
			}
625
 
626
		} elseif (strrpos($flores,'belge') !== false) {
627
			$projet = $this->noms_projets[$flore];
628
			if (preg_match('/^([0-9]+) (R|S)?$/', $valeur, $match)) {
629
				if (isset($match[2])) $type = ($match[2] == 'R') ? 'taxons' : 'synonyme';
630
				$this->table_retour[$flore]['page'] = $match[1];
631
				$this->table_retour[$flore]['type'] = $type;
632
				//$this->table_retour[$flore]['href'] = $this->ajouterHrefAutreProjet('noms', $match[1], $projet);
633
			}
634
		}
635
	}
636
 
637
 
638
 
639
//----------------------concerne les resultats pour des requetes de type /noms avec ou sans paramètres------------------
640
 
641
	/**
642
	 *
643
	 * Est utilisée pour les requetes de type /noms avec ou sans parametres. Détermine le format json ou oss.
644
	 * @param retourne le résultat sous forme de tableau, à encoder en json.
645
	 */
646
	public function formaterNoms($resultat) {
647
 
648
		if ($this->retour_format == 'oss') {
649
			$reponse = $this->formaterEnOss($resultat);	 //Ds CommunNomsTaxons.php
650
		} else {
651
			$reponse = $this->formaterEnJsonMax($resultat);
652
		}
653
 
654
		return $reponse;
655
	}
656
 
657
 
658
	/**
659
	 *
660
	 * Permet de créer un tableau ($table_retour_json) au format defaut puis de l'encoder en json (json_encode).
661
	 * Le format comprend deux parties, une partie entete (contenu dans le tableau $entete_json) et une partie
662
	 * resultat (contenu dans le tableau $resultat_json).
663
	 * @param string $resultat : résultat de la requete (liste des noms et leur identifiant)
664
	 * @return une chaine encodé json (format par default)
665
	 */
666
	public function formaterEnJsonMax($resultat) {
667
 
668
		$this->recupererTableSignification('correspondance_champs,champs_api,champs_comp');
669
		$res = array();
670
 
671
		foreach ($resultat as $version => $res_version) {
672
			//on remplit la table $table_retour_json['entete']
673
			$masque = $this->ordonnerMasque();
674
			if ($masque != '') $this->table_retour['masque'] = $masque;
675
			$this->afficherEnteteRangBorneTotalUrls($res_version, '/'.$this->service);
676
			$table_retour_json['entete'] = $this->table_retour;
677
			$this->table_retour = array();
678
 
679
			//on remplit la table $table_retour_json['resultat']
680
			foreach ($res_version as $tab) {
681
				$this->resultat_req = $tab;
682
				foreach ($tab as $key => $val) {
683
					if ($val != '') {
684
						switch ($key) {
685
							case 'num_nom' : $num = $val;
686
											 $this->afficherDonnees($key, $val);			break;
687
							case 'nom_sci' : if ($this->retour_format == 'min') {
688
												 // sinon est affiché ds afficherDonnees(num_nom, $val) ci-dessus
689
												 $this->table_retour[$key] = $val.$this->ajouterCompositionNom($tab);
690
											 } 												break;
691
							case 'num_nom_retenu' :
692
											 $retenu = ($val == $num) ? 'true' : 'false';
693
											 $this->table_retour['retenu'] = $retenu;		break;
694
							default : 														break;
695
						}
696
						unset($this->table_retour['id']);
697
					}
698
				}
699
				$resultat_json[$num] = $this->table_retour;
700
				$this->table_retour = array();
701
			}
702
			$table_retour_json['resultat'] = $resultat_json;
703
			$res = $this->afficherVersionOuPas($version, $table_retour_json, $res);
704
		}
705
		return $res;
706
	}
707
 
708
 
709
}
710
 
711
?>