Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev Author Line No. Line
6 jpm 1
<?php
2
 
3
abstract class CommunNomsTaxons extends Commun {
4
 
5
	protected $table_param = array(); /** Permet de stocker le tableau des parametres (= $parametres) */
6
	protected $table_ressources = array(); /** Permet de stocker le tableau des ressources (= $ressources) */
7
	protected $table_retour; /** Permet de stocker le tableau de résultat (non encodé en json)*/
8
	protected $resultat_req; /** Permet de stocker le résultat de la requete principale. */
9
	/** Permet de stocker sous forme de tableau les composant du nom à ajouter au nom scientifique (fonction du paramètre ns.structure) */
10
	protected $compo_nom;
11
	protected $ordre_masque = array('masque', 'masque_sg', 'masque_gen', 'masque_sp', 'masque_ssp', 'masque_au',
12
		'masque_an', 'masque_bib', 'masque_ad', 'masque_nn', 'masque_rg' );
13
	protected $tab_nom_sci   = array('nom_supra_generique', 'genre', 'epithete_infra_generique', 'epithete_sp',
14
		'type_epithete', 'epithete_infra_sp', 'cultivar_groupe', 'cultivar', 'nom_commercial');
15
	protected $retour_format = 'max';
16
	protected $html 		 = 'txt'; /** Valeur du paramètre de requete ns.format */
17
	protected $table_version; /** Stocke les noms des tables de toutes les versions du projet disponibles */
18
	/** Nom de la table dans laquelle on récupèrera les données (remplace Config::get('bdd_table') dans les requetes SQL */
19
	protected $table;
20
	protected $total_resultat = null;
21
	 /** Stocke le service appelé correspondant. Est utilisé principalement lors de l'affichage du href d'un synonyme
22
	  (ex id=12, basionyme num 25 est un synonyme) dans le service taxon */
23
	protected $service_href = null;
24
 
25
 
26
//----------------------------------Fonctions d'analyse des ressources--------------------------------------------------
27
 
28
	/** Permet de remplir la variable version_projet et de retirer cette donnée du tableau des ressources */
29
	public function traiterVersionProjet(&$ressources) {
30
		if (isset($ressources) && !empty($ressources)) {
31
			if (preg_match('/(?:[0-9]+(?:_|[.])[0-9]+|[*])/', $ressources[0])) {
32
				$this->version_projet = array_shift($ressources);
33
				$this->version_projet = str_replace('_', '.', $this->version_projet);
34
			} else {
35
				if ($ressources[0] == ' ') array_shift($ressources); //si un + a été ajouté
36
				$this->version_projet = '+';
37
			}
38
		}
39
		//si la liste des noms est demandée pr toutes les versions, on affiche seulement la dernière version pour :
40
		// - la liste des noms et taxons: /noms et /taxons
41
		// - la liste des taxons inferieurs/supérieur : /taxons/relations/inferieurs et /taxons/relations/superieurs
42
		// - la liste des relations : /taxons/relations ou /noms/relations
43
		if ($this->version_projet == '*' && ($ressources == array()
44
			|| (isset($ressources[1]) && $ressources[1] == 'relations' && isset($ressources[2]) && in_array($ressources[2], array('superieurs', 'inferieurs')))
45
			|| (isset($ressources[1]) && $ressources[1] == 'relations' && !isset($ressources[2])) )) {
46
			$this->version_projet = '+';
47
		}
48
		//on recupère les versions du projet disponible dans la table des meta-donnees (utilisation service MetaDonnees)
49
		$table_num_version = $this->recupererVersionDisponible();
50
		//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
51
		$this->recupererListeNomTablePrChaqueVersion($table_num_version);
52
	}
53
 
54
 
55
	public function traiterRessources($ressources) {
56
		$this->table_ressources = $ressources;
57
		if (isset($ressources) && !empty($ressources)) {
58
			if ($this->estUnIdentifiant()) { //l'identifiant peut etre de type /#id ou /nt:#id
59
				$this->traiterRessourcesIdentifiant(); // dans le service noms ou taxons
60
			} elseif ($this->table_ressources[0] == 'stats') { //ressource = noms/stats
61
				$this->traiterRessourcesStats();
62
			} else {
63
				$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
64
					'Erreur dans votre requete </br> Ressources disponibles : <br/>
65
					<li> /'.$this->service.'/#id (id : L\'identifiant du nom rechercher)</li>
66
					<li> /'.$this->service.'/nt:#id (id : Numero du taxon recherche)</li>
67
					<li> /'.$this->service.'/stats </li>' );
68
			}
69
		}
70
	}
71
 
72
 
73
	public function traiterRessourcesStats() {
74
		$this->format_reponse = $this->service.'/stats';
75
		if (isset($this->table_ressources[1]) && !empty($this->table_ressources[1])) {
76
			switch ($this->table_ressources[1]) {
77
				case 'annees' 	 :
78
					$this->traiterRessourceStatsAnnees();
79
					break;
80
				case 'rangs'  	 :
81
					$this->traiterRessourceStatsRangs();
82
					break;
83
				case 'initiales' :
84
					$this->traiterRessourceStatsInitiales();
85
					break;
86
				default 		 :
87
					$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
88
						'Erreur dans votre requete </br> Ressources disponibles : <br/>
89
		 				<li> /'.$this->service.'/stats/annees </li>
90
						<li> /'.$this->service.'/stats/rangs </li>
91
		 				<li> /'.$this->service.'/stats/initiales </li>' );
92
					break;
93
			}
94
		} else {
95
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
96
				  'Erreur dans votre requete </br> Ressources disponibles : <br/>
97
				 <li> /'.$this->service.'/stats/annees </li>
98
				 <li> /'.$this->service.'/stats/rangs </li>
99
				 <li> /'.$this->service.'/stats/initiales </li>' );
100
		}
101
	}
102
 
103
 
104
	/** Vérifie si la première valeur de la table de ressource est un identifiant : un numerique ou un numéro
105
	 * taxonomique sous la forme nt:xx */
106
	public function estUnIdentifiant() {
107
		return (is_numeric($this->table_ressources[0]) || (strrpos($this->table_ressources[0],'nt:') !== false
108
				&& is_numeric(str_replace('nt:','',$this->table_ressources[0]))));
109
	}
110
 
111
//---------------------------------------------Fonction d'analyse des parametres----------------------------------------
112
 
113
	/** Permet de remplir le tableau compo_nom. Il comprendra en fct du paramètre ns.structure les éléments à rajouter
114
	 * au nom_sci (annee, auteur, biblio ou addendum).*/
115
	public function remplirTableCompositionNom($valeur) {
116
		$structure_nom = explode(",",$valeur);
117
		foreach ($structure_nom as $structure) {
118
			switch ($structure) {
119
				case 'au'	:	$this->compo_nom['au']  = 'auteur'; 			break;
120
				case 'an'	:	$this->compo_nom['an']  = 'annee';				break;
121
				case 'bib'	:	$this->compo_nom['bib'] = 'biblio_origine';		break;
122
				case 'ad'	:	$this->compo_nom['ad']  = 'nom_addendum';		break;
123
				default 	:	$this->renvoyerErreur( RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
124
									'Erreur : Le parametre "'.$structure.'" n\'existe pas. <br/><br/>
125
									Les parametres du nom possibles sont : <li> au (auteur)</li><li> an (annee)</li>
126
									<li> bib (bibliographie)</li><li> ad (nom_addendum)</li>');
127
																				break;
128
			}
129
		}
130
	}
131
 
132
 
133
	/** Permet de recupérer le nom scientigfique au format html. Le champ nom_sci de la requete sql est remplacé par
134
	 * le champ nom_sci_html */
135
	public function mettreAuFormat() {
136
		if ($this->html == 'htm') {
137
			if (strrpos($this->requete_champ, 'nom_sci_html as nom_sci') === false) {
138
				$this->requete_champ = str_replace('nom_sci', 'nom_sci_html as nom_sci', $this->requete_champ);
139
			}
140
		} elseif ($this->html != 'txt') {
141
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
142
				'Erreur dans votre requete </br> ns.format = htm ou txt (par defaut)' );
143
		}
144
	}
145
 
146
//--------------------------------fonctions de formatage----------------------------------------------------------
147
 
148
	/** Fonction permettant de creer la table dont le nom est passé en paramètre (champs_api, champs_bdtfx,
149
	 * correspondance_champs...). Les données de chaque table sont présentes dans le fichier de configuration config.ini
150
	 * @param String $table : Peut contenir plusieurs nom de table dont on souhaite récupérer les données : table,table,table.
151
	 *  Ex : recupererTableSignification('champs_api,champs_bdtfx') */
152
	public function recupererTableSignification($table) {
153
		$tables = explode(',', $table);
154
		foreach ($tables as $tab) {
155
			if ($tab == 'champs_comp') {
156
				$champ_bdnff_api = array_keys($this->champs_api); //on recupère le nom des champ ds la bdd
157
				$this->champs_comp = array_diff($this->champs_table, $champ_bdnff_api);
158
			} elseif ($tab == 'champs_api') {
159
				foreach ($this->correspondance_champs as $key => $val) {
160
					preg_match('/(hybride[.]parent_0[12](?:[.]notes)?|nom_sci[.][^.]+|[^.]+)(?:[.](id|code))?/', $val, $match);
161
					$val = $match[1];
162
					$this->champs_api[$key] = $val;
163
				}
164
			} else {
165
				$tableau = explode(',', Config::get($tab));
166
				$tableau = array_map('trim', $tableau);
167
				foreach ($tableau as $champ) {
168
					list($code, $rang) = explode('=', $champ);
169
					$tab_tampon[$code] = $rang;
170
				}
171
				$this->$tab = $tab_tampon;
172
				$tab_tampon = array();
173
			}
174
		}
175
	}
176
 
177
 
178
	public function formaterEnOss($resultat) {
179
		$res = array();
180
		$table_nom = array();
181
		foreach ($resultat as $version => $res_version) {
182
			$oss = '';
183
			foreach ($res_version as $tab) {
184
 
185
				if (isset($tab['nom_sci']) ) {
186
					if (!in_array($tab['nom_sci'], $table_nom)) {
187
						$table_nom[] = $tab['nom_sci'];
188
						$oss [] = $tab['nom_sci'].$this->ajouterCompositionNom($tab);
189
					}
190
				}
191
			}
192
			$masque = $this->ordonnerMasque();
193
			if ($masque == '') $masque = 'Pas de masque';
194
			$table_retour_oss = array($masque, $oss);
195
			//Si les infos de plrs versions sont renvoyés, on ajoute au tableau de resultat le numéro de la version
196
			$res = $this->afficherVersionOuPas($version, $table_retour_oss, $res);
197
		}
198
		return $res;
199
	}
200
 
201
 
202
	/** Permet de récupérer le masque de rang superieur parmi les parametres de la requete.
203
	 * Sera affiche dans l'entete du fichier json (clé 'masque') et oss.
204
	 * @return string le masque de rang supérieur ou '' si aucun masque n'a été mis en parametre de
205
	 * requete (la clé masque ne sera alors pas affichée dans l'entete).*/
206
	public function ordonnerMasque() {
207
		$masque = '';
208
		foreach ($this->ordre_masque as $key => $filtre) {
209
			if (isset($this->table_param[$filtre])) {
210
				$masque .= '&'.$filtre.'='.$this->table_param[$filtre];
211
			}
212
		}
213
		$masque = ltrim($masque, '&'); //on enlève le & du début
214
		$masque = str_replace('masque_','',$masque);
215
		return $masque;
216
	}
217
 
218
 
219
	/** Affiche l'entete du résultat pour le service /noms et /noms/relations. L'entete comprend le rang (s'il est un
220
	 * filtre), le départ, la limite, le total des résultats et les urls suivante et precedente. */
221
	public function afficherEnteteRangBorneTotalUrls($resultat, $url_service) {
222
		if (isset($this->table_param['masque_rg'])) $this->afficherDonnees('rang', $this->table_param['masque_rg']);
223
		$this->table_retour['depart'] = $this->limite_requete['depart'];
224
		$this->table_retour['limite'] = $this->limite_requete['limite'];
225
		$this->table_retour['total']  = $this->total_resultat;
226
		//formuler les urls precedentes et suivantes
227
		$url = $this->formulerUrl($this->total_resultat, $url_service);
228
		if ($url['precedent'] != '') { $this->table_retour['href.precedent'] = $url['precedent']; }
229
		if ($url['suivant']   != '') { $this->table_retour['href.suivant']   = $url['suivant']; }
230
	}
231
 
232
//----------------------------Fonction de formatage pour les services /#id/---------------------------------------------
233
	/** Ajout du numero de la version au tableau de résultat à retourner :
234
	 * 'bdtfx_v2_00' : {'infos' : 'toto' ...}, 'bdtfx_v3_00' : {'infos' : 'tata' ...}
235
	 * @param string $num_version : numéro de version (sous la forme de l'intitulé du nom de la table bdd)
236
	 * @param array $tab : tableau contenant le resultat à retourner pour une version donnée
237
	 * @param array $res : tableau contenant le resultat à retourner pour toutes les versions disponibles */
238
	public function afficherVersionOuPas($version, &$tab, &$res) {
239
		if (count($this->table_version) > 1) {
240
			$res[$version] = $tab;
241
			$tab = array();
242
		} else {
243
			$res = $tab;
244
		}
245
		return $res;
246
	}
247
 
248
 
249
	public function formaterId($resultat) {
250
		$this->recupererTableSignification('correspondance_champs,champs_api,champs_comp');
251
		$res = array();
252
		foreach ($resultat as $version => $res_version) {
253
			$res_version = $res_version[0];
254
			$this->resultat_req = $res_version;
255
			foreach ($res_version as $key => $valeur) {
256
				if ($valeur != '') {
257
					$this->afficherDonnees($key, $valeur);
258
				}
259
			}
260
			unset($this->table_retour['href']);
261
			//Si les infos de plrs versions sont renvoyés, on ajoute au tableau de resultat le numéro de la version
262
			$res = $this->afficherVersionOuPas($version, $this->table_retour, $res);
263
		}
264
		return $res;
265
	}
266
 
267
 
268
	public function formaterIdChamp($resultat) {
269
		$this->recupererTableSignification('correspondance_champs,champs_api,champs_comp');
270
		$res = array();
271
		foreach ($resultat as $version => $res_version) {
272
			$res_version = $res_version[0];
273
			$this->resultat_req = $res_version;
274
			$this->table_retour['id'] = $res_version['num_nom'];
275
			//on récupère les champs (le + est transformé en espace par le navigateur)
276
			$tab_ress = explode(' ', $this->table_ressources[1]);
277
			foreach ($tab_ress as $nom_champ_api) {
278
				if ($this->verifierValiditeChamp($nom_champ_api)) {
279
					switch ($nom_champ_api) {
280
						case 'nom_sci' 	 : $this->afficherNomSci($res_version); break;
281
						case 'nom_sci.*' : $this->afficherNomSciPointEpithete($res_version); break;
282
						case 'hybride.*' :
283
							$this->afficherChamps('hybride.parent_01.*', $res_version['hybride_parent_01']);
284
							$this->afficherChamps('hybride.parent_02.*', $res_version['hybride_parent_02']); break;
285
						default :
286
							$this->afficherChamps($nom_champ_api,
287
							$res_version[$this->trouverChampBddCorrespondant($nom_champ_api)]); break;
288
					}
289
				}
290
			}
291
			//Si les infos de plrs versions sont renvoyés, on ajoute au tableau de resultat le numéro de la version
292
			$res = $this->afficherVersionOuPas($version, $this->table_retour, $res);
293
		}
294
		return $res;
295
	}
296
 
297
	/** Les champs passés dans l'url lors de la requete /noms|taxons/#id/#champ+#champ son sous la forme de l'api.
298
	 * Les noms de l'api ne st pas les meme que ceux des champs de la base de données.
299
	 * Cette fct permet de récupérer le nom du champs de la base de données */
300
	public function trouverChampBddCorrespondant($champ) {
301
		$radical_champ = $champ;
302
		if ($this->estUnPoint($champ) && strrpos($champ, '.notes') === false) {
303
			preg_match('/^(?:([^.]+\.parent_0[12]|[^.]+))(?:\.(.+))?$/', $champ, $match);
304
			$radical_champ = $match[1];
305
		}
306
		// - Soit un champ de l'api est recherché (pour les champs du référentiel : les noms des champs ont été modifiés),
307
		// - Soit un champ complementaire de la bdnff (les noms de ces champs complementaire sont les memes que ds la base)
308
		if ($this->estChampApi($radical_champ)) {
309
			$champ_bdd = array_search($radical_champ, $this->champs_api);
310
		} elseif ($this->estDansBdnff($radical_champ)) {
311
			$champ_bdd = $radical_champ;
312
		} else {
313
			$this->renvoyerErreur( RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
314
			'Fct trouverChampBddCorrespondant : Le parametre "'.$radical_champ.'" n\'existe pas. <br/><br/>');
315
		}
316
		return $champ_bdd;
317
	}
318
 
319
 
320
	/** Permet d'afficher des informations précisées des données liées. Utilisé par le service id/champ
321
	 * lors de l'appel d'un champ tel que : champ.id, champ.code, champ.*, champ.href. */
322
	public function afficherChamps($champ, $valeur) {
323
		$reponse = $this->table_retour;
324
		$this->table_retour = array();
325
		if ($valeur == '') {
326
			$this->table_retour[$champ] = null;
327
		} else {
328
			preg_match('/^(?:([^.]+\.parent_0[12]|[^.]+))(?:\.(.+))?$/', $champ, $match);
329
			//si on a un point etoile
330
			if (isset($match[2]) && $match[2] == '*') {
331
				$this->afficherPointEtoile($match[1], $valeur);
332
			//si le champ comprend plusieurs identifiants : pour le champ proparte (liste ou .details recherché, pas de .href)
333
			} elseif ($this->presentePlusieursId($match[1], $valeur)) {
334
				if (isset($match[2]) && $match[2] != 'id') {
335
					$this->afficherInfosPrecises($match[1], $match[2], $valeur);
336
				} else {
337
					$this->table_retour[str_replace('.id', '', $champ)] = $valeur;
338
				}
339
			//si on est en présence d'une donnée liée (la donnée représente un identifiant ou un code)
340
			} elseif ($this->correspondAUnId($match[1]) || $champ == 'id' || $this->correspondAUnCode($match[1])) {
341
				if (isset($match[2])) { //si un .id, un .code ou un .href est demandé :
342
					$this->afficherInfosPrecises($match[1], $match[2], $valeur);
343
				} else {
344
					$this->afficherInfosPrecises($match[1], 'signification', $valeur);
345
				}
346
			//sinon on affiche tel quel
347
			} else {
348
				$this->table_retour[$champ] = $valeur;
349
			}
350
		}
351
		$this->table_retour = array_merge($reponse, $this->table_retour);
352
	}
353
 
354
 
355
	/**Vérifie la validité d'un champ passé dans la requete /#id/#champ+#champ */
356
	public function verifierValiditeChamp($champ) {
357
		preg_match('/^(?:([^.]+\.parent_0[12]|[^.]+))(?:\.(.+))?$/', $champ, $match);
358
		$radical_champ = $match[1];
359
		$validite_ressource = true;
360
		//on verifie si le nom du champ existe bien
361
		if (!$this->estChampApi($radical_champ) && !$this->estDansBdnff($radical_champ)) {
362
			$validite_ressource = false;
363
			$this->renvoyerErreur( RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
364
				'Fct verifierValiditeChamp : Le parametre "'.$radical_champ.'" n\'existe pas. <br/><br/>');
365
		} elseif ($this->estUnPoint($champ)) {
366
			$suffixe = $match[2];
367
			//On verifie les suffixes pour les identifiants
368
			if ($this->correspondAUnId($radical_champ) || $radical_champ == 'id') {
369
				$this->verificationSuffixesIdentifiant($suffixe, $radical_champ, $validite_ressource);
370
			//On verifie les suffixes pour les codes
371
			} elseif ($this->correspondAUnCode($radical_champ)) {
372
				$this->verficationSuffixesCodes($suffixe, $radical_champ, $validite_ressource);
373
			} elseif ($radical_champ == 'nom_sci' && $suffixe != '*') {
374
				$this->renvoyerErreur( RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
375
				'Erreur : Le suffixe demand&eacute; n\'existe pas pour le champ "'.$radical_champ.'".<br/>
376
				Les suffixes possibles sont les suivants : <li> * </li>');
377
			} else {
378
				$validite_ressource = false;
379
				$this->renvoyerErreur( RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
380
					'Erreur : Le parametre "'.$radical_champ.'" ne peut pas pr&eacute;senter de suffixe. <br/><br/>');
381
			}
382
		}
383
		return $validite_ressource;
384
	}
385
 
386
 
387
	public function verficationSuffixesCodes(&$suffixe, &$radical_champ, &$validite_ressource ) {
388
		if (!in_array($suffixe, array('*', 'code', 'href', 'details'))) {
389
			$validite_ressource = false;
390
			$this->renvoyerErreur( RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
391
				'Erreur : Le suffixe demand&eacute; n\'existe pas pour le champ "'.$radical_champ.'.<br/>
392
				Les suffixes possibles sont les suivants :
393
				<li> .* </li><li> .code </li><li> .href </li><li> .details </li>');
394
		}
395
	}
396
 
397
 
398
	public function verificationSuffixesIdentifiant(&$suffixe, &$radical_champ, &$validite_ressource) {
399
		if ((strrpos($radical_champ, 'parent') !== false && !in_array($suffixe, array('*', 'id', 'href', 'details', 'notes')))
400
			|| !in_array($suffixe, array('*', 'id', 'href', 'details')) && strrpos($radical_champ, 'parent') === false) {
401
			$validite_ressource = false;
402
			$this->renvoyerErreur( RestServeur::HTTP_CODE_MAUVAISE_REQUETE,
403
				'Erreur : Le suffixe demand&eacute; n\'existe pas pour le champ "'.$radical_champ.'".<br/>
404
				Les suffixes possibles sont les suivants :
405
				<li> .* </li><li> .id </li><li> .href </li><li> .details </li><li> .notes (seulement pour les hybride.parent)');
406
		}
407
	}
408
 
409
 
410
//------------------------------fonction de formatage pour les services /stats/-----------------------------------------
411
 
412
	public function formaterStatsAnnee($resultat) {
413
		$res = array();
414
		foreach ($resultat as $version => $res_version) {
415
			foreach ($res_version as $cle_annee) {
416
				foreach ($cle_annee as $key => $val) {
417
					 switch($key) {
418
					 	case 'annee' : $annee = ($val != '') ? $val : 'N.D.'; 	break;
419
					 	case 'nombre': $nb = $val;	  							break;
420
					 	default : break;
421
					 }
422
				}
423
				$retour_stats_annee[$annee] = $nb;
424
			}
425
			//Si les infos de plrs versions sont renvoyés, on ajoute au tableau de resultat le numéro de la version
426
			$res = $this->afficherVersionOuPas($version, $retour_stats_annee, $res);
427
		}
428
		return $res;
429
	}
430
 
431
 
432
	public function formaterStatsRang($resultat) {
433
		$res = array();
434
		foreach ($resultat as $version => $res_version) {
435
			foreach ($res_version as $rangs) {
436
				if ($rangs['rang'] != 0) {
437
					foreach ($rangs as $key => $val) {
438
						switch ($key) {
439
							case 'rang' 	: $rang 	= $val; 	break;
440
							case 'nombre' 	: $nombre 	= $val; 	break;
441
							default : break;
442
						}
443
					}
444
					$retour_rang[$rang] = array(
445
						'rang'   => $this->ajouterSignificationCode('rang', $rang),
446
						'nombre' => $nombre
447
					);
448
				}
449
			}
450
			//Si les infos de plrs versions sont renvoyés, on ajoute au tableau de resultat le numéro de la version
451
			$res = $this->afficherVersionOuPas($version, $retour_rang, $res);
452
		}
453
		return $res;
454
	}
455
 
456
 
457
	public function formaterStatsInitiales($resultat) {
458
		$res = array();
459
		$table_rang = array();
460
		foreach ($resultat as $version => $res_version) {
461
			foreach ($res_version as $tuple) {
462
				if ($tuple['rang'] != 0) {
463
					if (!isset($table_rang[$tuple['rang']])) {
464
						$rang = $this->ajouterSignificationCode('rang', $tuple['rang']);
465
						$table_rang[$tuple['rang']] = $rang;
466
					} else {
467
						$rang = $table_rang[$tuple['rang']];
468
					}
469
					if ($tuple['lettre'] == 'x ') {
470
						if (isset($this->table_retour[$rang]['hyb'])) {
471
							$this->table_retour[$rang]['hybride'] += floatval($tuple['nb']);
472
						} else {
473
							$this->table_retour[$rang]['hybride'] = floatval($tuple['nb']);
474
						}
475
					} elseif ($tuple['lettre'] == '+ ') {
476
						if (isset($this->table_retour[$rang]['chimère'])) {
477
							$this->table_retour[$rang]['chimère'] += floatval($tuple['nb']);
478
						} else {
479
							$this->table_retour[$rang]['chimère'] = floatval($tuple['nb']);
480
						}
481
					} else {
482
						$l = substr($tuple['lettre'], 0, 1);
483
						if (isset($this->table_retour[$rang][$l])) {
484
							$this->table_retour[$rang][substr($tuple['lettre'], 0, 1)] += floatval($tuple['nb']);
485
						} else {
486
							$this->table_retour[$rang][substr($tuple['lettre'], 0, 1)] = floatval($tuple['nb']);
487
						}
488
					}
489
				}
490
			}
491
			//Si les infos de plrs versions sont renvoyés, on ajoute au tableau de resultat le numéro de la version
492
			$res = $this->afficherVersionOuPas($version, $this->table_retour, $res);
493
		}
494
		return $res;
495
	}
496
 
497
 
498
	//-----------------------------Fonctions d'affichage utiliser dans les fonctions de formatage---------------------------
499
 
500
	/** Affiche les résultats en fonction du paramètre retour_format. */
501
	public function afficherDonnees($key, $valeur) {
502
		//on souhaite afficher le nom au format de l'api
503
		if ($this->retour_format == 'min') {
504
			if ($this->correspondAChampApi($key)) { //on affiche l'intitulé selon decrit dans l'api
505
				if ($key == 'nom_sci') $valeur = $valeur.$this->ajouterCompositionNom($this->resultat_req);
506
				$this->table_retour[$this->correspondance_champs[$key]] = $valeur;
507
			} else {
508
				$this->table_retour[$key] = $valeur;
509
			}
510
		} else {
511
			if ($this->correspondAChampApi($key)) {
512
				$nom_champ_api = $this->correspondance_champs[$key]; //on récupere le nom comme définit ds l'api
513
				$this->afficherToutesLesInfos($nom_champ_api, $valeur);
514
			} elseif ($this->estDansBdnff($key)) {
515
				$this->table_retour[$key] = $valeur;
516
			}
517
		}
518
	}
519
 
520
 
521
	public function afficherToutesLesInfos($nom_champ_api, $valeur) {
522
		if ($this->presentePlusieursId($nom_champ_api, $valeur)) {
523
			preg_match('/^([^.]+\.parent_0[12]|[^.]+)(?:\.id)?$/', $nom_champ_api, $match);
524
			$this->afficherInfosPrecises($match[1], 'details', $valeur);
525
			$this->table_retour[$nom_champ_api] = $valeur;
526
		} elseif (strrpos($nom_champ_api, 'parent') !== false && strrpos($nom_champ_api, 'notes') !== false) {
527
			$this->table_retour[$nom_champ_api] = $valeur;
528
		} elseif (($this->correspondAUnId($nom_champ_api) || $nom_champ_api == 'id') && $valeur != '0') {
529
			preg_match('/^([^.]+\.parent_0[12]|[^.]+)(?:\.id)?$/', $nom_champ_api, $match);
530
			$this->afficherInfosPrecises($match[1], 'id,signification,href', $valeur);
531
		} elseif ($this->correspondAUnCode($nom_champ_api)) {
532
			preg_match('/^([^.]+)(?:\.code)?$/', $nom_champ_api, $match);
533
			$this->afficherInfosPrecises($match[1], 'code,signification,href', $valeur);
534
		}
535
	}
536
 
537
 
538
	public function presentePlusieursId($ressource, $valeur = null) {
539
		if ($valeur) {
540
			$presente = strrpos($ressource, 'proparte') !== false && strrpos($valeur, ',') !== false;
541
		} else { //pour la vérification du champ, on ignore alors la valeur de la ressource
542
			$presente = strrpos($ressource, 'proparte') !== false;
543
		}
544
		return $presente;
545
	}
546
 
547
 
548
	public function afficherTableDetails($nom_champ_api, $valeur) {
549
		$tab_id = explode(',',$valeur);
550
		$tab_res = $this->table_retour;
551
		$this->table_retour = array();
552
		foreach ($tab_id as $id) {
553
			$this->afficherInfosPrecises($nom_champ_api, 'id,signification,href', $id);
554
			$tab_res[$nom_champ_api.'.details'][] = $this->table_retour;
555
			$this->table_retour = array();
556
		}
557
		$this->table_retour = $tab_res;
558
	}
559
 
560
 
561
	public function afficherPointEtoile($champ, $valeur) {
562
		if ($this->presentePlusieursId($champ, $valeur)) {
563
			$this->afficherInfosPrecises($champ, 'details', $valeur);
564
			$this->table_retour[$champ] = $valeur;
565
		} elseif (strrpos($champ, 'parent') !== false) {
566
			$this->afficherInfosPrecises($champ, 'id,href,notes', $valeur);
567
		} elseif ($this->correspondAUnId($champ) || $champ == 'id') {
568
			$this->afficherInfosPrecises($champ, 'id,href', $valeur);
569
		} elseif ($this->correspondAUnCode($champ)) {
570
			$this->afficherInfosPrecises($champ, 'code,href', $valeur);
571
		}
572
	}
573
 
574
 
575
	public function afficherInfosPrecises($champ, $suffixe, $valeur) {
576
		$suffixes = explode(',', $suffixe);
577
		//on initialise au service appelé. Sera potentiellement modifié dans la fonction afficherSignification()
578
		$this->service_href = $this->service;
579
		foreach ($suffixes  as $suff) {
580
			switch ($suff) {
581
				case 'id' 			 :
582
					$this->table_retour[str_replace('id.id', 'id', $champ.'.id')] = $valeur;
583
					break;
584
				case 'details' 		 :
585
					$this->afficherTableDetails($champ, $valeur);
586
					break;
587
				case 'signification' :
588
					$this->afficherSignification($champ, $valeur);
589
					break;
590
				case 'href' 		 :
591
					if ($this->correspondAUnId($champ) || $champ == 'id') {
592
						$service = $this->service_href;
593
						$url = $this->ajouterHref($service, $valeur);
594
					} else {
595
						$service = 'ontologies';
596
						$champ_url = $champ;
597
						$url = $this->ajouterHrefAutreProjet($service, $val, $champ_url);
598
					}
599
					$this->table_retour[str_replace('id.href', 'href', $champ.'.href')] = $url;
600
					break;
601
				case 'code' 		 :
602
					$val = ( $champ == 'rang' ) ? 'bdnt.rangTaxo:'.$valeur : 'bdnt.'.rtrim($champ, '_Ga,_Co').':'.$valeur;
603
					$this->table_retour[$champ.'.code'] = $val;
604
					break;
605
				case 'notes' 		 :
606
					$this->table_retour[$champ.'.notes'] = $this->resultat_req[str_replace('.', '_', $champ).'_notes'];
607
					break;
608
				default 			 :
609
					break;
610
			}
611
		}
612
	}
613
 
614
 
615
	public function afficherSignification($champ, $valeur) {
616
		if ($champ == 'id' && isset($this->resultat_req['nom_sci']) && $this->resultat_req['num_nom'] == $valeur) {
617
			//si le nom_sci du num_nom que l'on veut afficher est déjà dans la table de résultat :
618
			$this->table_retour['nom_sci'] = $this->resultat_req['nom_sci'].$this->ajouterCompositionNom($this->resultat_req);
619
		} elseif ($this->correspondAUnId($champ) || $champ == 'id') {
620
			$nom = $this->recupererNomSci($valeur);
621
			$champ = ($champ == 'id') ? 'nom_sci' : $champ;
622
			if ($nom != array()) {
623
				$this->table_retour[$champ] = $nom['nom_sci'];
624
				$this->service_href = $nom['service'];
625
			}
626
		} elseif ($this->correspondAUnCode($champ)) {
627
			$this->table_retour[$champ] = $this->ajouterSignificationCode($champ, $valeur);
628
		}
629
	}
630
 
631
 
632
	/** Permet d'afficher les élements nomenclatural du nom_sci lors de l'appel dans le service noms/id/champ du champ^nom_sci.*/
633
	public function afficherNomSciPointEpithete($resultat) {
634
		foreach ($this->tab_nom_sci as $compo_nom) {
635
			if (isset($resultat[$compo_nom]) && !empty($resultat[$compo_nom])) {
636
				$this->table_retour['nom_sci.'.$compo_nom] = $resultat[$compo_nom];
637
			}
638
		}
639
	}
640
 
641
	/** utilisé dans le formatage de /noms/id et de /noms/id/champ seulement */
642
	public function afficherNomSci($resultat) {
643
		if ($this->html == 'htm') {
644
			$this->table_retour['nom_sci'] = $resultat['nom_sci_html'].$this->ajouterCompositionNom($resultat);
645
		} else {
646
			$this->table_retour['nom_sci'] = $resultat['nom_sci'].$this->ajouterCompositionNom($resultat);
647
		}
648
	}
649
 
650
 
651
	/** Permet d'afficher la signification d'un code pour le rang, la présence, et les differents statuts */
652
	public function ajouterSignificationCode($champ, $valeur) {
653
		$champ = ($champ == 'rang') ? 'rangTaxo' : rtrim($champ, '_Co,_Ga');
654
		if (preg_match('/^([^_-]+)(?:_|-)([^_-]+)$/', $champ, $match)) {
655
			$champ = $match[1].ucfirst($match[2]);
656
		}
657
		$url = Config::get('url_ontologie').$champ.':'.$valeur.'/nom';
658
		$res = $this->consulterHref($url); //dans commun.php
659
		$nom_code = $res->nom;
660
		return $nom_code;
661
	}
662
 
663
 
664
	/** Recupere le nom_scientifique (formaté ou non en fonction du parametre ns.format) à partir du num_nom */
665
	public function recupererNomSci($id) {
666
		$nom = array();
667
		if ($id != 0) {
668
			if ($this->compo_nom == null) {
669
				$req = 'SELECT nom_sci, num_nom_retenu FROM '.$this->table.' WHERE num_nom = '.$id;
670
			} else { //on ajoute à la requete sql, les champs de ns.structure
671
				$req = 'SELECT nom_sci, num_nom_retenu, '.implode(', ', $this->compo_nom)
672
						.' FROM '.$this->table
673
						.' WHERE num_nom = '.$id;
674
			}
675
			if ($this->html == 'htm') {
676
				$req = str_replace('nom_sci', 'nom_sci_html as nom_sci', $req);
677
			}
678
			$res = $this->getBdd()->recuperer($req);
679
			if ($res) {
680
				$nom['nom_sci']	= $res['nom_sci'].$this->ajouterCompositionNom($res);
681
				$nom['service'] = ($res['num_nom_retenu'] == $id && $this->service == 'taxons') ? 'taxons' : 'noms';
682
			} else {
683
				$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,
684
					'Fct recupererNomSci() : Donnees introuvables dans la base pour l\'id '.$id);
685
			}
686
		}
687
		return $nom;
688
	}
689
 
690
	/** Permet de retourner une chaine de caractère composée des parametres du nom (ns.structure : annnée, auteur,
691
	 * bibilio et addendum). A ajouter au nom scientifique */
692
	public function ajouterCompositionNom($tab_res) {
693
		$nom_complet = ' ';
694
		$this->ajouterAuteur($tab_res, $nom_complet);
695
		$this->ajouterAnneeEtBiblio($tab_res, $nom_complet);
696
		$this->ajouterAnneeSansBilio($tab_res, $nom_complet);
697
		$this->ajouterBiblioSansAnnee($tab_res, $nom_complet);
698
		$this->ajouterAddendum($tab_res, $nom_complet);
699
		return rtrim($nom_complet);
700
	}
701
 
702
 
703
	public function ajouterAuteur($tab_res, &$nom_complet) {
704
		if (isset($this->compo_nom['au']) && isset($tab_res['auteur']) && $tab_res['auteur'] != '') {
705
			if ($this->html == 'htm') {
706
				$nom_complet .= '<span class="auteur">'.$tab_res['auteur'].'</span> ';
707
			} else {
708
				$nom_complet .= $tab_res['auteur'].' ';
709
			}
710
		}
711
	}
712
 
713
	public function ajouterAnneeEtBiblio($tab_res, &$nom_complet) {
714
		if (isset($this->compo_nom['an']) && isset($this->compo_nom['bib'])
715
						&& isset($tab_res['annee']) && ($tab_res['annee'] != '')
716
						&& isset($tab_res['biblio_origine']) && ($tab_res['biblio_origine'] != '')) {
717
			if ($this->html == 'htm') {
718
				$nom_complet .= '[<span class="annee">'.$tab_res['annee'].'</span>, <span class="biblio">'
719
					.$tab_res['biblio_origine'].'</span>]';
720
			} else {
721
				$nom_complet .= '['.$tab_res['annee'].', '.$tab_res['biblio_origine'].']';
722
			}
723
		}
724
	}
725
 
726
	public function ajouterAnneeSansBilio($tab_res, &$nom_complet) {
727
		if (isset($this->compo_nom['an']) && !isset($this->compo_nom['bib'])
728
						&& isset($tab_res['annee']) && ($tab_res['annee'] != '')) {
729
			if ($this->html == 'htm') {
730
				$nom_complet .= '[<span class="annee">'.$tab_res['annee'].'</span>]';
731
			} else {
732
				$nom_complet .= '['.$tab_res['annee'].']';
733
			}
734
		}
735
	}
736
 
737
	public function ajouterBiblioSansAnnee($tab_res, &$nom_complet) {
738
		if (!isset($this->compo_nom['an']) && isset($this->compo_nom['bib']) && ($tab_res['biblio_origine'] != '')) {
739
			if ($this->html == 'htm') {
740
				$nom_complet .= '[<span class="biblio">'.$tab_res['biblio_origine'].'</span>]';
741
			} else {
742
				$nom_complet .= '['.$tab_res['biblio_origine'].']';
743
			}
744
		}
745
	}
746
 
747
	public function ajouterAddendum($tab_res, &$nom_complet) {
748
		if (isset($this->compo_nom['ad']) && ($tab_res['nom_addendum'] != '')) {
749
			if ($this->html == 'htm') {
750
				$nom_complet .= '[<span class="adendum">'.$tab_res['nom_addendum'].'</span>]';
751
			} else {
752
				$nom_complet .= '['.$tab_res['nom_addendum'].']';
753
			}
754
		}
755
	}
756
 
757
	public function correspondAUnCode($key) {
758
		return (strrpos($key, '.code') !== false) || (in_array($key.'.code', $this->correspondance_champs));
759
	}
760
 
761
	public function correspondAUnId($key) {
762
		return (strrpos($key, '.id') !== false) || (in_array($key.'.id', $this->correspondance_champs));
763
	}
764
 
765
	public function estChampApi($champ) {
766
		return (in_array($champ, $this->champs_api) || in_array($champ, $this->correspondance_champs));
767
	}
768
 
769
	public function correspondAChampApi($champ_bdd) {
770
		return (array_key_exists($champ_bdd, $this->champs_api) || array_key_exists($champ_bdd, $this->correspondance_champs));
771
	}
772
 
773
	public function estDansBdnff($champ) {
774
		return (in_array($champ, $this->champs_comp));
775
	}
776
 
777
	public function estUnPoint($key) {
778
		if (strrpos($key, 'hybride.parent') !== false) {
779
			$key = str_replace('hybride.parent', 'hybride_parent', $key);
780
		}
781
		return (strrpos($key, '.') !== false);
782
	}
783
}
784
 
785
?>