Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 1175 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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