Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev 832 Rev 848
1
<?php
1
<?php
2
/**
2
/**
3
* Description :
3
* Description :
4
* Classe NomsVernaculaires.php fournit une liste de noms vernaculaires et leur liaison à la bdtfx
4
* Classe NomsVernaculaires.php fournit une liste de noms vernaculaires et leur liaison à la bdtfx
5
* Le but étant de fournir un ensemble minimal d'information comprenant :
5
* Le but étant de fournir un ensemble minimal d'information comprenant :
6
* un identifiant (numérique ou alphanumérique sous forme de ChatMot si possible), un nom, une langue et
6
* un identifiant (numérique ou alphanumérique sous forme de ChatMot si possible), un nom, une langue et
7
* une relation avec un taxon de la bdtfx.
7
* une relation avec un taxon de la bdtfx.
8
* Si l'url finit par /noms-vernaculaires on retourne une liste de noms (seulement les 100 premières par défaut).
8
* Si l'url finit par /noms-vernaculaires on retourne une liste de noms (seulement les 100 premières par défaut).
9
* L'url peut contenir des paramètres optionnels passés après le ? : /observations?param1=val1&param2=val2&...
9
* L'url peut contenir des paramètres optionnels passés après le ? : /observations?param1=val1&param2=val2&...
10
*
10
*
11
* Les paramètres de requête disponibles sont : masque, masque.code, masque.nom, masque.region , recherche,
11
* Les paramètres de requête disponibles sont : masque, masque.code, masque.nom, masque.region , recherche,
12
* distinct, retour.format, navigation.depart et navigation.limite.
12
* distinct, retour.format, 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 Delphine Cauquil <delphine@tela-botanica.org>
17
* @author Delphine Cauquil <delphine@tela-botanica.org>
18
* @author Jennifer Dhé <jennifer.dhe@tela-botanica.org>
18
* @author Jennifer Dhé <jennifer.dhe@tela-botanica.org>
19
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
19
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
20
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
20
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
21
* @version 1.0
21
* @version 1.0
22
* @copyright 1999-${year} Tela Botanica (accueil@tela-botanica.org)
22
* @copyright 1999-${year} Tela Botanica (accueil@tela-botanica.org)
23
*/
23
*/
24
 
24
 
25
// Un caractère de concaténation entre le projet et le service.
25
// Un caractère de concaténation entre le projet et le service.
26
// Ce caractère ne doit pas faire partie d'aucun des noms de service ou projet
26
// Ce caractère ne doit pas faire partie d'aucun des noms de service ou projet
27
define('RES_VAL_SEP', '@');
27
define('RES_VAL_SEP', '@');
28
define('SPE_INDEX_NVJFL', '_result_ontologies' . RES_VAL_SEP . 'nvjfl');
28
define('SPE_INDEX_NVJFL', '_result_ontologies' . RES_VAL_SEP . 'nvjfl');
29
 
29
 
30
class NomsVernaculaires extends Commun {
30
class NomsVernaculaires extends Commun {
31
 
31
 
32
	static $onto_multi_support = array('conseil_emploi', 'genre');
32
	static $onto_multi_support = array('conseil_emploi', 'genre');
33
	static $champ_infos = array(
33
	static $champ_infos = array(
34
		'taxon' => array('service' => 'taxons', 'ressource' => 'nt:', 'projet' => 'bdtfx', 'nom' => 'nom_sci',
34
		'taxon' => array('service' => 'taxons', 'ressource' => 'nt:', 'projet' => 'bdtfx', 'nom' => 'nom_sci',
35
						 // utilisés par ajouterChampsOntologieLigneResultat()
35
						 // utilisés par ajouterChampsOntologieLigneResultat()
36
						 'intitule' => 'taxon.code', // intitulé du champ tel qu'il sera renvoyé en JSON
36
						 'intitule' => 'taxon.code', // intitulé du champ tel qu'il sera renvoyé en JSON
37
						 'bdd_champ' => 'num_taxon'), // intitulé du champ tel qu'il est présent dans l'enregistrement MySQL
37
						 'bdd_champ' => 'num_taxon'), // intitulé du champ tel qu'il est présent dans l'enregistrement MySQL
38
		'conseil_emploi' => array('service' => 'ontologies', 'ressource' => 'numStatut:', 'projet' => 'nvjfl', 'nom' => 'nom',
38
		'conseil_emploi' => array('service' => 'ontologies', 'ressource' => 'numStatut:', 'projet' => 'nvjfl', 'nom' => 'nom',
39
								  'intitule' => 'conseil_emploi', 'bdd_champ' => 'num_statut'),
39
								  'intitule' => 'conseil_emploi', 'bdd_champ' => 'num_statut'),
40
		'genre' => array('service' => 'ontologies', 'ressource' => 'genreNombre:', 'projet' => 'nvjfl', 'nom' => 'nom',
40
		'genre' => array('service' => 'ontologies', 'ressource' => 'genreNombre:', 'projet' => 'nvjfl', 'nom' => 'nom',
41
						 'intitule' => 'genre', 'bdd_champ' => 'num_genre'));
41
						 'intitule' => 'genre', 'bdd_champ' => 'num_genre'));
42
 
42
 
43
	protected $service = 'noms-vernaculaires';
43
	protected $service = 'noms-vernaculaires';
44
 
44
 
45
	/**
45
	/**
46
	 * Permet de stocker la requete formulée : /noms-vernaculaires | /noms-vernaculaires/#id |
46
	 * Permet de stocker la requete formulée : /noms-vernaculaires | /noms-vernaculaires/#id |
47
	 *  /noms-vernaculaires/#id/champ | /noms-vernaculaires/#id/relations
47
	 *  /noms-vernaculaires/#id/champ | /noms-vernaculaires/#id/relations
48
	 * Est remplit au cours de l'analyse des ressources (traiterRessources()), par défaut, a la valeur du service.
48
	 * Est remplit au cours de l'analyse des ressources (traiterRessources()), par défaut, a la valeur du service.
49
	 * Est utilisée principalement pr déterminer le format du tableau à retourner.	 */
49
	 * Est utilisée principalement pr déterminer le format du tableau à retourner.	 */
50
	protected $format_reponse = 'noms-vernaculaires';
50
	protected $format_reponse = 'noms-vernaculaires';
51
 
51
 
52
	/** Variables constituant les parametres de la requete SQL (champ, condition, limit) remplie
52
	/** Variables constituant les parametres de la requete SQL (champ, condition, limit) remplie
53
	 * selon ressources et paramètres */
53
	 * selon ressources et paramètres */
54
	protected $requete_champ = array(' * ');
54
	protected $requete_champ = array(' * ');
55
	protected $requete_condition = '';
55
	protected $requete_condition = '';
56
	protected $limite_requete = array(
56
	protected $limite_requete = array(
57
		'depart' => 0,
57
		'depart' => 0,
58
		'limite' => 100
58
		'limite' => 100
59
	);
59
	);
60
	
60
	
61
	protected $champ_tri = 'code_langue';
61
	protected $champ_tri = 'code_langue';
62
	protected $direction_tri = 'asc';
62
	protected $direction_tri = 'asc';
63
	
63
	
64
	/**
64
	/**
65
	 * Indique les champs supplémentaires à retourner
65
	 * Indique les champs supplémentaires à retourner
66
	 *  - conseil_emploi = conseil d'emploi du nom vernaculaire
66
	 *  - conseil_emploi = conseil d'emploi du nom vernaculaire
67
	 *  - genre = genre et nombre du nom
67
	 *  - genre = genre et nombre du nom
68
	 *  - taxon = nom retenu associé à ce nom
68
	 *  - taxon = nom retenu associé à ce nom
69
	 */
69
	 */
70
	protected $champs_supp = array();
70
	protected $champs_supp = array();
71
 
71
 
72
	/**
72
	/**
73
	 * Precise la contenance plus ou moins précise du tableau à retourner :
73
	 * Precise la contenance plus ou moins précise du tableau à retourner :
74
	 *  - min = les données présentes dans la table
74
	 *  - min = les données présentes dans la table
75
	 *  - max = les données de la table + les informations complémentaires (pour les identifiants et les codes)
75
	 *  - max = les données de la table + les informations complémentaires (pour les identifiants et les codes)
76
	 *  - oss = la liste des nom_sci (uniquement pour noms et taxons) */
76
	 *  - oss = la liste des nom_sci (uniquement pour noms et taxons) */
77
	protected $retour_format = 'max';
77
	protected $retour_format = 'max';
78
	/** Valeur du paramètre de requete recherche :
78
	/** Valeur du paramètre de requete recherche :
79
	 *  - stricte : le masque est passé tel quel à l'opérateur LIKE.
79
	 *  - stricte : le masque est passé tel quel à l'opérateur LIKE.
80
	 *  - etendue : ajout automatique du signe % à la place des espaces et en fin de masque avec utilisation de LIKE.
80
	 *  - etendue : ajout automatique du signe % à la place des espaces et en fin de masque avec utilisation de LIKE.
81
	 *  - floue : recherche tolérante vis-à-vis d'approximations ou d'erreurs (fautes d'orthographe par exemple) */
81
	 *  - floue : recherche tolérante vis-à-vis d'approximations ou d'erreurs (fautes d'orthographe par exemple) */
82
	protected $recherche;
82
	protected $recherche;
83
	
83
	
84
	/** Permet de stocker le tableau de résultat (non encodé en json) */
84
	/** Permet de stocker le tableau de résultat (non encodé en json) */
85
	protected $table_retour = array();
85
	protected $table_retour = array();
86
	/** Stocke le nombre total de résultats de la requete principale. Est calculée lors de l'assemblage de la requete */
86
	/** Stocke le nombre total de résultats de la requete principale. Est calculée lors de l'assemblage de la requete */
87
	protected $total_resultat;
87
	protected $total_resultat;
88
	
88
	
89
	private $config;
89
	private $config;
90
	
90
	
91
	public function __construct($config) {
91
	public function __construct($config) {
92
		$this->config = is_null($config) ? Config::get('NomsVernaculaires') : $config;
92
		$this->config = is_null($config) ? Config::get('NomsVernaculaires') : $config;
93
	}
93
	}
94
 
94
 
95
	//+------------------------------------------------------------------------------------------------------+
95
	//+------------------------------------------------------------------------------------------------------+
96
	// créer une condition en fonction du paramétre
96
	// créer une condition en fonction du paramétre
97
	public function traiterParametres() {
97
	public function traiterParametres() {
98
		if (isset($this->parametres) && !empty($this->parametres)) {
98
		if (isset($this->parametres) && !empty($this->parametres)) {
99
 
99
 
100
			if (isset($this->parametres['recherche']) && $this->parametres['recherche'] != '') {
100
			if (isset($this->parametres['recherche']) && $this->parametres['recherche'] != '') {
101
				$this->recherche = $this->parametres['recherche'];
101
				$this->recherche = $this->parametres['recherche'];
102
			}
102
			}
103
			foreach ($this->parametres as $param => $valeur) {
103
			foreach ($this->parametres as $param => $valeur) {
104
				switch ($param) {
104
				switch ($param) {
105
					case 'masque' :
105
					case 'masque' :
106
						$this->ajouterFiltreMasque('nom_vernaculaire', $valeur);
106
						$this->ajouterFiltreMasque('nom_vernaculaire', $valeur);
107
						break;
107
						break;
108
					case 'masque.nt' :
108
					case 'masque.nt' :
109
						$this->ajouterFiltreMasque('num_taxon', $valeur);
109
						$this->ajouterFiltreMasque('num_taxon', $valeur);
110
						break;
110
						break;
111
					case 'masque.nv' :
111
					case 'masque.nv' :
112
						$this->ajouterFiltreMasque('nom_vernaculaire', $valeur);
112
						$this->ajouterFiltreMasque('nom_vernaculaire', $valeur);
113
						break;
113
						break;
114
					case 'masque.lg' :
114
					case 'masque.lg' :
115
						$this->ajouterFiltreMasque('code_langue', $valeur);
115
						$this->ajouterFiltreMasque('code_langue', $valeur);
116
						break;
116
						break;
117
					case 'masque.cce' :
117
					case 'masque.cce' :
118
						$this->ajouterFiltreMasque('num_statut', $valeur);
118
						$this->ajouterFiltreMasque('num_statut', $valeur);
119
						break;
119
						break;
120
					case 'retour.format' :
120
					case 'retour.format' :
121
						$this->retour_format = $valeur;
121
						$this->retour_format = $valeur;
122
						break;
122
						break;
123
					case 'navigation.depart' :
123
					case 'navigation.depart' :
124
						$this->limite_requete['depart'] = $valeur;
124
						$this->limite_requete['depart'] = $valeur;
125
						break;
125
						break;
126
					case 'navigation.limite' :
126
					case 'navigation.limite' :
127
						$this->limite_requete['limite'] = $valeur;
127
						$this->limite_requete['limite'] = $valeur;
128
						break;
128
						break;
129
					case 'retour.champs' :
129
					case 'retour.champs' :
130
						$this->champs_supp = explode(',',$valeur);
130
						$this->champs_supp = explode(',',$valeur);
131
					break;
131
					break;
132
					case 'recherche' :
132
					case 'recherche' :
133
						break;
133
						break;
134
					case 'version.projet' :
134
					case 'version.projet' :
135
						break;
135
						break;
136
					default :
136
					default :
137
						$p = 'Erreur dans les paramètres de recherche de votre requête : '.
137
						$p = 'Erreur dans les paramètres de recherche de votre requête : '.
138
							'</br> Le paramètre " '.$param.' " n\'existe pas.';
138
							'</br> Le paramètre " '.$param.' " n\'existe pas.';
139
							$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $p);
139
							$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $p);
140
				}
140
				}
141
			}
141
			}
142
		}
142
		}
143
	}
143
	}
144
 
144
 
145
	public function ajouterFiltreMasque($nom_champ, $valeur) {
145
	public function ajouterFiltreMasque($nom_champ, $valeur) {
146
		if ($nom_champ == 'num_taxon') { // si il s'agit d'un chiffre
146
		if ($nom_champ == 'num_taxon') { // si il s'agit d'un chiffre
147
			$this->requete_condition[] = $nom_champ.' = '.$this->getBdd()->proteger($valeur);
147
			$this->requete_condition[] = $nom_champ.' = '.$this->getBdd()->proteger($valeur);
148
		} else {
148
		} else {
149
			if ($this->recherche == 'floue') {
149
			if ($this->recherche == 'floue') {
150
				$this->requete_condition[] = '(SOUNDEX('.$nom_champ.') = SOUNDEX(\''.$valeur.'\')'
150
				$this->requete_condition[] = '(SOUNDEX('.$nom_champ.') = SOUNDEX(\''.$valeur.'\')'
151
					.' OR SOUNDEX(REVERSE('.$nom_champ.')) = SOUNDEX(REVERSE(\''.$valeur.'\'))) ';
151
					.' OR SOUNDEX(REVERSE('.$nom_champ.')) = SOUNDEX(REVERSE(\''.$valeur.'\'))) ';
152
			} else {
152
			} else {
153
				if ($this->recherche == 'etendue') {
153
				if ($this->recherche == 'etendue') {
154
					$valeur = '%'.str_replace(' ','% ', $valeur);
154
					$valeur = '%'.str_replace(' ','% ', $valeur);
155
					$valeur .= '%';
155
					$valeur .= '%';
156
				}
156
				}
157
				$this->requete_condition[] = $nom_champ.' LIKE '.$this->getBdd()->proteger($valeur);
157
				$this->requete_condition[] = $nom_champ.' LIKE '.$this->getBdd()->proteger($valeur);
158
			}
158
			}
159
		}
159
		}
160
	}
160
	}
161
 
161
 
162
	//+------------------------------------------------------------------------------------------------------+
162
	//+------------------------------------------------------------------------------------------------------+
163
	// en fonction de la présence des ressources modifie requete_champ et requete_condition
163
	// en fonction de la présence des ressources modifie requete_champ et requete_condition
164
	public function traiterRessources() {
164
	public function traiterRessources() {
165
		if (isset($this->ressources) && !empty($this->ressources)) {
165
		if (isset($this->ressources) && !empty($this->ressources)) {
166
			if (isset($this->ressources[0]) && !empty($this->ressources[0])) {
166
			if (isset($this->ressources[0]) && !empty($this->ressources[0])) {
167
				$this->traiterRessourceId(); // ajoute condition id=#valeur
167
				$this->traiterRessourceId(); // ajoute condition id=#valeur
168
				if (isset($this->ressources[1]) && !empty($this->ressources[1])) {
168
				if (isset($this->ressources[1]) && !empty($this->ressources[1])) {
169
					$this->traiterRessourceChamp(); //modifie requete_champ ou requete_condition
169
					$this->traiterRessourceChamp(); //modifie requete_champ ou requete_condition
170
				}
170
				}
171
			}
171
			}
172
		} else { //rajoute distinct pour ne pas avoir plusieurs fois le même nom
172
		} else { //rajoute distinct pour ne pas avoir plusieurs fois le même nom
173
			$this->requete_champ = array('distinct(id)', 'nom_vernaculaire ');
173
			$this->requete_champ = array('distinct(id)', 'nom_vernaculaire ');
174
		}
174
		}
175
	}
175
	}
176
 
176
 
177
	//requete : /noms-vernaculaires/#id (ex : /noms-vernaculaires/7)
177
	//requete : /noms-vernaculaires/#id (ex : /noms-vernaculaires/7)
178
	public function traiterRessourceId() {
178
	public function traiterRessourceId() {
179
		if (is_numeric($this->ressources[0])) {
179
		if (is_numeric($this->ressources[0])) {
180
			$this->requete_condition[] = ' id = '.$this->getBdd()->proteger($this->ressources[0]);
180
			$this->requete_condition[] = ' id = '.$this->getBdd()->proteger($this->ressources[0]);
181
			$this->format_reponse .= '/id';
181
			$this->format_reponse .= '/id';
182
		} elseif ($this->ressources[0] == 'attributions') {
182
		} elseif ($this->ressources[0] == 'attributions') {
183
			$this->format_reponse .= '/attributions';
183
			$this->format_reponse .= '/attributions';
184
		} else {
184
		} else {
185
			$r = 'Erreur dans les ressources de votre requête : </br> La ressource " '.$this->ressources[0].
185
			$r = 'Erreur dans les ressources de votre requête : </br> La ressource " '.$this->ressources[0].
186
				' " n\'existe pas.';
186
				' " n\'existe pas.';
187
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $r);
187
			$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $r);
188
		}
188
		}
189
	}
189
	}
190
 
190
 
191
 
191
 
192
	public function traiterRessourceChamp() {
192
	public function traiterRessourceChamp() {
193
		$this->format_reponse .= '/champ';
193
		$this->format_reponse .= '/champ';
194
		$this->analyserChamp();
194
		$this->analyserChamp();
195
	}
195
	}
196
 
196
 
197
	public function analyserChamp() {
197
	public function analyserChamp() {
198
		$this->requete_champ = array();
198
		$this->requete_champ = array();
199
		$this->recupererTableConfig('champs_possibles');// s'il y a plusieurs champs correspondant au champ demandé ils sont séparé par des |
199
		$this->recupererTableConfig('champs_possibles');// s'il y a plusieurs champs correspondant au champ demandé ils sont séparé par des |
200
		$champs = explode(' ', $this->ressources[1]);
200
		$champs = explode(' ', $this->ressources[1]);
201
		foreach ($champs as $champ) {
201
		foreach ($champs as $champ) {
202
			preg_match('/^([^.]+)(\.([^.]+))?$/', $champ, $match);
202
			preg_match('/^([^.]+)(\.([^.]+))?$/', $champ, $match);
203
			if (isset($this->champs_possibles[$match[1]])) {
203
			if (isset($this->champs_possibles[$match[1]])) {
204
				$this->requete_champ[] = str_replace('|', ', ', $this->champs_possibles[$match[1]]);
204
				$this->requete_champ[] = str_replace('|', ', ', $this->champs_possibles[$match[1]]);
205
			} elseif (isset($this->champs_possibles[$match[0]])) {
205
			} elseif (isset($this->champs_possibles[$match[0]])) {
206
				$this->requete_champ[] = str_replace('|', ', ', $this->champs_possibles[$match[0]]);
206
				$this->requete_champ[] = str_replace('|', ', ', $this->champs_possibles[$match[0]]);
207
			} else {
207
			} else {
208
				$champs_possibles = implode('</li><li>', array_keys($this->champs_possibles));
208
				$champs_possibles = implode('</li><li>', array_keys($this->champs_possibles));
209
				$c = 'Erreur dans votre requête : </br> Le champ "'.$champ_possibles.'" n\'existe pas. '.
209
				$c = 'Erreur dans votre requête : </br> Le champ "'.$champ_possibles.'" n\'existe pas. '.
210
					'Les champs disponibles sont : <li>'.$champs_possibles.'</li> et leurs déclinaisons (ex. ".code").';
210
					'Les champs disponibles sont : <li>'.$champs_possibles.'</li> et leurs déclinaisons (ex. ".code").';
211
				$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $c);
211
				$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $c);
212
			}
212
			}
213
		}
213
		}
214
	}
214
	}
215
 
215
 
216
	//+------------------------------------------------------------------------------------------------------+
216
	//+------------------------------------------------------------------------------------------------------+
217
	public function assemblerLaRequete() {
217
	public function assemblerLaRequete() {
218
		$requete = ' SELECT '.$this->formerRequeteChamp().
218
		$requete = ' SELECT '.$this->formerRequeteChamp().
219
					', CASE num_statut WHEN "" THEN 1 ELSE 0 END AS is_null '.
219
					', CASE num_statut WHEN "" THEN 1 ELSE 0 END AS is_null '.
220
					' FROM '.$this->table
220
					' FROM '.$this->table
221
					.$this->formerRequeteCondition().
221
					.$this->formerRequeteCondition().
222
					' ORDER BY is_null ASC, num_statut ASC '
222
					' ORDER BY is_null ASC, num_statut ASC '
223
					.$this->formerRequeteLimite();
223
					.$this->formerRequeteLimite();
224
		return $requete;
224
		return $requete;
225
	}
225
	}
226
 
226
 
227
	public  function formerRequeteChamp() {
227
	public  function formerRequeteChamp() {
228
		if (in_array('*', $this->requete_champ)) {
228
		if (in_array('*', $this->requete_champ)) {
229
			$champ = ' * ';
229
			$champ = ' * ';
230
		} else {
230
		} else {
231
			$champ = implode(', ', $this->requete_champ);
231
			$champ = implode(', ', $this->requete_champ);
232
		}
232
		}
233
		return $champ;
233
		return $champ;
234
	}
234
	}
235
 
235
 
236
	public  function formerRequeteCondition() {
236
	public  function formerRequeteCondition() {
237
		$condition = '';
237
		$condition = '';
238
		if ($this->requete_condition != null) {
238
		if ($this->requete_condition != null) {
239
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
239
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
240
		}
240
		}
241
		return $condition;
241
		return $condition;
242
	}
242
	}
243
 
243
 
244
	//ajout d'une limite seulement pour les listes (pas plus de 100 resultats retournés pr les requetes
244
	//ajout d'une limite seulement pour les listes (pas plus de 100 resultats retournés pr les requetes
245
	// suivantes : /noms-vernaculaires et /noms-vernaculaires/#id/relations)
245
	// suivantes : /noms-vernaculaires et /noms-vernaculaires/#id/relations)
246
	public function formerRequeteLimite() {
246
	public function formerRequeteLimite() {
247
		if (in_array($this->format_reponse , array($this->service.'/id', $this->service.'/id/champs'))) {
247
		if (in_array($this->format_reponse , array($this->service.'/id', $this->service.'/id/champs'))) {
248
			$this->requete_limite = '';
248
			$this->requete_limite = '';
249
		} elseif (($depart = $this->limite_requete['depart']) > ($this->total_resultat = $this->recupererTotalResultat())) {
249
		} elseif (($depart = $this->limite_requete['depart']) > ($this->total_resultat = $this->recupererTotalResultat())) {
250
			$this->limite_requete['depart'] =
250
			$this->limite_requete['depart'] =
251
				(($this->total_resultat - $this->limite_requete['limite']) < 0) ? 0 : ($this->total_resultat - $this->limite_requete['limite']);
251
				(($this->total_resultat - $this->limite_requete['limite']) < 0) ? 0 : ($this->total_resultat - $this->limite_requete['limite']);
252
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
252
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
253
		} else {
253
		} else {
254
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
254
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
255
		}
255
		}
256
		return $this->requete_limite;
256
		return $this->requete_limite;
257
	}
257
	}
258
 
258
 
259
	//on récupère le nombre total de résultats de la requete (ex : le nombre d'id contenu dans la liste /noms-vernaculaires)
259
	//on récupère le nombre total de résultats de la requete (ex : le nombre d'id contenu dans la liste /noms-vernaculaires)
260
	public function recupererTotalResultat() {
260
	public function recupererTotalResultat() {
261
		$distinct = ($this->format_reponse == 'noms-vernaculaires/attributions') ? 'id' : 'distinct(id)';
261
		$distinct = ($this->format_reponse == 'noms-vernaculaires/attributions') ? 'id' : 'distinct(id)';
262
		$requete = 'SELECT count('.$distinct.') as nombre FROM '
262
		$requete = 'SELECT count('.$distinct.') as nombre FROM '
263
			.$this->table
263
			.$this->table
264
			.$this->formerRequeteCondition();
264
			.$this->formerRequeteCondition();
265
		$res = $this->getBdd()->recuperer($requete);
265
		$res = $this->getBdd()->recuperer($requete);
266
 
266
 
267
		if ($res) {
267
		if ($res) {
268
			$total = $res['nombre'];
268
			$total = $res['nombre'];
269
		} else {
269
		} else {
270
			$t = 'Fonction recupererTotalResultat() : <br/>Données introuvables dans la base '.$requete;
270
			$t = 'Fonction recupererTotalResultat() : <br/>Données introuvables dans la base '.$requete;
271
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $t);
271
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $t);
272
		}
272
		}
273
		return $total;
273
		return $total;
274
	}
274
	}
275
 
275
 
276
	//+------------------------------------------------------------------------------------------------------+
276
	//+------------------------------------------------------------------------------------------------------+
277
	// determine en fct du service appelé (/noms-vernaculaires | /noms-vernaculaires/#id | /noms-vernaculaires/#id/champ |
277
	// determine en fct du service appelé (/noms-vernaculaires | /noms-vernaculaires/#id | /noms-vernaculaires/#id/champ |
278
	// /noms-vernaculaires/#id/relations) le format du tableau à retourner.
278
	// /noms-vernaculaires/#id/relations) le format du tableau à retourner.
279
	public function retournerResultatFormate($resultat) {
279
	public function retournerResultatFormate($resultat) {
280
		$this->recupererTableConfig('correspondance_champs');
280
		$this->recupererTableConfig('correspondance_champs');
281
		switch ($this->format_reponse) {
281
		switch ($this->format_reponse) {
282
			case 'noms-vernaculaires'				: 
282
			case 'noms-vernaculaires'				: 
283
				$reponse = ($this->retour_format == 'oss') ? $this->formaterEnOss($resultat) : $this->formaterNomsVernaculaires($resultat);			break;
283
				$reponse = ($this->retour_format == 'oss') ? $this->formaterEnOss($resultat) : $this->formaterNomsVernaculaires($resultat);			break;
284
			case 'noms-vernaculaires/attributions'	: $reponse = $this->formaterNomsVernaculairesAttributions($resultat);	break;
284
			case 'noms-vernaculaires/attributions'	: $reponse = $this->formaterNomsVernaculairesAttributions($resultat);	break;
285
			case 'noms-vernaculaires/id'			: $reponse = $this->formaterNomsVernaculairesId($resultat);			break;
285
			case 'noms-vernaculaires/id'			: $reponse = $this->formaterNomsVernaculairesId($resultat);			break;
286
			case 'noms-vernaculaires/id/champ'		: $reponse = $this->formaterNomsVernaculairesIdChamp($resultat);	break;
286
			case 'noms-vernaculaires/id/champ'		: $reponse = $this->formaterNomsVernaculairesIdChamp($resultat);	break;
287
			default									:																	break;
287
			default									:																	break;
288
		}
288
		}
289
		return $reponse;
289
		return $reponse;
290
	}
290
	}
291
	
291
	
292
	public function ajouterJsonEnTeteNV() {
292
	public function ajouterJsonEnTeteNV() {
293
		$table_retour_json['masque'] = $this->recupererMasque();
293
		$table_retour_json['masque'] = $this->recupererMasque();
294
		$table_retour_json['depart'] = $this->limite_requete['depart'];
294
		$table_retour_json['depart'] = $this->limite_requete['depart'];
295
		$table_retour_json['limite'] = $this->limite_requete['limite'];
295
		$table_retour_json['limite'] = $this->limite_requete['limite'];
296
		$table_retour_json['total']  = $this->total_resultat;
296
		$table_retour_json['total']  = $this->total_resultat;
297
		$url = $this->formulerUrl($this->total_resultat, '/noms-vernaculaires');
297
		$url = $this->formulerUrl($this->total_resultat, '/noms-vernaculaires');
298
		if (isset($url['precedent']) && $url['precedent'] != '') {
298
		if (isset($url['precedent']) && $url['precedent'] != '') {
299
			$table_retour_json['href.precedent'] = $url['precedent'];
299
			$table_retour_json['href.precedent'] = $url['precedent'];
300
		}
300
		}
301
		if (isset($url['suivant']) && $url['suivant']   != '') {
301
		if (isset($url['suivant']) && $url['suivant']   != '') {
302
			$table_retour_json['href.suivant']   = $url['suivant'];
302
			$table_retour_json['href.suivant']   = $url['suivant'];
303
		}
303
		}
304
		return $table_retour_json;
304
		return $table_retour_json;
305
	}
305
	}
306
	
306
	
307
	public function ajouterJsonResultatNV($resultat) {
307
	public function ajouterJsonResultatNV($resultat) {
308
		foreach ($resultat as $tab) {
308
		foreach ($resultat as $tab) {
309
			foreach ($tab as $key => $valeur) {
309
			foreach ($tab as $key => $valeur) {
310
				if ($valeur != '') {
310
				if ($valeur != '') {
311
					switch ($key) {
311
					switch ($key) {
312
						case 'id'				: $num = $valeur;								break;
312
						case 'id'				: $num = $valeur;								break;
313
						case 'nom_vernaculaire'	: $this->table_retour['nom'] = $valeur;			break;
313
						case 'nom_vernaculaire'	: $this->table_retour['nom'] = $valeur;			break;
314
						default					:												break;
314
						default					:												break;
315
					}
315
					}
316
				}
316
				}
317
			}
317
			}
318
		    if ($this->retour_format == 'max') $this->table_retour['href'] = $this->ajouterHref('noms-vernaculaires', $num);
318
		    if ($this->retour_format == 'max') $this->table_retour['href'] = $this->ajouterHref('noms-vernaculaires', $num);
319
			$resultat_json[$num] = $this->table_retour;
319
			$resultat_json[$num] = $this->table_retour;
320
			$this->table_retour = array();
320
			$this->table_retour = array();
321
		}
321
		}
322
		return  $resultat_json;
322
		return  $resultat_json;
323
	}
323
	}
324
 
324
 
325
	
325
	
326
	public function formaterNomsVernaculaires($resultat) {
326
	public function formaterNomsVernaculaires($resultat) {
327
		$table_retour_json['entete'] = $this->ajouterJsonEnTeteNV();
327
		$table_retour_json['entete'] = $this->ajouterJsonEnTeteNV();
328
		$resultat = $this->hierarchiserResultat($resultat);
328
		$resultat = $this->hierarchiserResultat($resultat);
329
		$table_retour_json['resultat'] = $this->ajouterJsonResultatNV($resultat);
329
		$table_retour_json['resultat'] = $this->ajouterJsonResultatNV($resultat);
330
		return $table_retour_json;
330
		return $table_retour_json;
331
	}
331
	}
332
	
332
	
333
	public function hierarchiserResultat($resultat) {
333
	public function hierarchiserResultat($resultat) {
334
		//tri recherche floue
334
		//tri recherche floue
335
		if (isset($this->parametres['masque.nv'])) {
335
		if (isset($this->parametres['masque.nv'])) {
336
			$resultat = $this->trierRechercheFloue($this->parametres['masque.nv'], $resultat, 'nom_vernaculaire');
336
			$resultat = $this->trierRechercheFloue($this->parametres['masque.nv'], $resultat, 'nom_vernaculaire');
337
		}
337
		}
338
		if (isset($this->parametres['masque'])) {
338
		if (isset($this->parametres['masque'])) {
339
			$resultat = $this->trierRechercheFloue($this->parametres['masque'], $resultat, 'nom_vernaculaire');
339
			$resultat = $this->trierRechercheFloue($this->parametres['masque'], $resultat, 'nom_vernaculaire');
340
		}
340
		}
341
		return $resultat;
341
		return $resultat;
342
	}
342
	}
343
	
343
	
344
	public function recupererMasque() {
344
	public function recupererMasque() {
345
		$tab_masque = array();
345
		$tab_masque = array();
346
		foreach ($this->parametres as $param=>$valeur) {
346
		foreach ($this->parametres as $param=>$valeur) {
347
			if (strstr($param, 'masque') != false) {
347
			if (strstr($param, 'masque') != false) {
348
				$tab_masque[] = $param.'='.$valeur;
348
				$tab_masque[] = $param.'='.$valeur;
349
			}
349
			}
350
		}
350
		}
351
		$masque = implode('&', $tab_masque);
351
		$masque = implode('&', $tab_masque);
352
		return $masque;
352
		return $masque;
353
	}
353
	}
354
	
354
	
355
	public function formaterEnOss($resultat) {
355
	public function formaterEnOss($resultat) {
356
		$table_nom = array();
356
		$table_nom = array();
357
		$oss = '';
357
		$oss = '';
358
		foreach ($resultat as $tab) {
358
		foreach ($resultat as $tab) {
359
			if (isset($tab['nom_vernaculaire']) ) {
359
			if (isset($tab['nom_vernaculaire']) ) {
360
				if (!in_array($tab['nom_vernaculaire'], $table_nom)) {
360
				if (!in_array($tab['nom_vernaculaire'], $table_nom)) {
361
					$table_nom[] = $tab['nom_vernaculaire'];
361
					$table_nom[] = $tab['nom_vernaculaire'];
362
					$oss [] = $tab['nom_vernaculaire'];
362
					$oss [] = $tab['nom_vernaculaire'];
363
				}
363
				}
364
			}
364
			}
365
		}
365
		}
366
		if (isset($this->masque)) $masque = implode('&', $this->masque);
366
		if (isset($this->masque)) $masque = implode('&', $this->masque);
367
		else $masque = 'Pas de masque';
367
		else $masque = 'Pas de masque';
368
		$table_retour_oss = array($masque, $oss);
368
		$table_retour_oss = array($masque, $oss);
369
		return $table_retour_oss;
369
		return $table_retour_oss;
370
	}
370
	}
371
	
371
	
372
	public function formaterNomsVernaculairesAttributions($resultat) {
372
	public function formaterNomsVernaculairesAttributions($resultat) {
373
		//on remplie la table $table_retour_json['entete']
373
		//on remplie la table $table_retour_json['entete']
374
		$table_retour_json['entete']['masque'] = $this->recupererMasque();
374
		$table_retour_json['entete']['masque'] = $this->recupererMasque();
375
		$table_retour_json['entete']['depart'] = $this->limite_requete['depart'];
375
		$table_retour_json['entete']['depart'] = $this->limite_requete['depart'];
376
		$table_retour_json['entete']['limite'] = $this->limite_requete['limite'];
376
		$table_retour_json['entete']['limite'] = $this->limite_requete['limite'];
377
		$table_retour_json['entete']['total']  = $this->total_resultat;
377
		$table_retour_json['entete']['total']  = $this->total_resultat;
378
		$url = $this->formulerUrl($this->total_resultat, '/noms-vernaculaires/attributions');
378
		$url = $this->formulerUrl($this->total_resultat, '/noms-vernaculaires/attributions');
379
		if (!empty($url['precedent'])) {
379
		if (!empty($url['precedent'])) {
380
			$table_retour_json['entete']['href.precedent'] = $url['precedent'];
380
			$table_retour_json['entete']['href.precedent'] = $url['precedent'];
381
		}
381
		}
382
		if (!empty($url['suivant'])) {
382
		if (!empty($url['suivant'])) {
383
			$table_retour_json['entete']['href.suivant']   = $url['suivant'];
383
			$table_retour_json['entete']['href.suivant']   = $url['suivant'];
384
		}
384
		}
385
		foreach ($resultat as &$tab) {			
385
		foreach ($resultat as &$tab) {			
386
			$nnv = $tab['num_nom_vernaculaire'];
386
			$nnv = $tab['num_nom_vernaculaire'];
387
			$resultat_json[$nnv]['id'] = $tab['id'];
387
			$resultat_json[$nnv]['id'] = $tab['id'];
388
			$resultat_json[$nnv]['nom_vernaculaire'] = $tab['nom_vernaculaire'];
388
			$resultat_json[$nnv]['nom_vernaculaire'] = $tab['nom_vernaculaire'];
389
			$resultat_json[$nnv]['langue.code'] = $tab['code_langue'];
389
			$resultat_json[$nnv]['langue.code'] = $tab['code_langue'];
390
			$resultat_json[$nnv]['taxon.code'] = 'bdtfx.nt:'.$tab['num_taxon'];
390
			$resultat_json[$nnv]['taxon.code'] = 'bdtfx.nt:'.$tab['num_taxon'];
391
			if ($this->retour_format == 'max') {
391
			if ($this->retour_format == 'max') {
392
				$this->taxons[] = $tab['num_taxon']; // utilisé pour chercher les noms latins plus bas
392
				$this->taxons[] = $tab['num_taxon']; // utilisé pour chercher les noms latins plus bas
393
				if($this->champs_supp) {
393
				if($this->champs_supp) {
394
					//$resultat_json[$nnv] = $this->ajouterChampsOntologieLigneResultat($tab);
394
					//$resultat_json[$nnv] = $this->ajouterChampsOntologieLigneResultat($tab);
395
					// simple initialisation par copie de la référence de l'original
395
					// simple initialisation par copie de la référence de l'original
396
					$resultat_json[$nnv] = &$tab;
396
					$resultat_json[$nnv] = &$tab;
397
				}
397
				}
398
				else {
398
				else {
399
					$resultat_json[$nnv]['num_taxon'] = $tab['num_taxon'];
399
					$resultat_json[$nnv]['num_taxon'] = $tab['num_taxon'];
400
					$resultat_json[$nnv]['nom_retenu.code'] = $tab['num_taxon'];
400
					$resultat_json[$nnv]['nom_retenu.code'] = $tab['num_taxon'];
401
					$resultat_json[$nnv]['taxon'] = $tab['num_taxon'];
401
					$resultat_json[$nnv]['taxon'] = $tab['num_taxon'];
402
					$resultat_json[$nnv]['href'] = $this->ajouterHref('noms-vernaculaires', $tab['id']);
402
					$resultat_json[$nnv]['href'] = $this->ajouterHref('noms-vernaculaires', $tab['id']);
403
				}
403
				}
404
			}
404
			}
405
		}
405
		}
406
 
406
 
407
		// dans ce cas (particulier?) nous n'avons pour l'heure initialisé qu'une référence
407
		// dans ce cas (particulier?) nous n'avons pour l'heure initialisé qu'une référence
408
		// vers le tableau de valeurs original
408
		// vers le tableau de valeurs original
409
		if ($this->retour_format == 'max' && $this->champs_supp) {
409
		if ($this->retour_format == 'max' && $this->champs_supp) {
410
			// récupérons désormais les ontologies
410
			// récupérons désormais les ontologies
411
			$this->ajouterChampsOntologieLigneTousResultats($resultat_json);
411
			$this->ajouterChampsOntologieLigneTousResultats($resultat_json);
412
		}
412
		}
413
 
413
 
414
		if ($this->retour_format == 'max') {
414
		if ($this->retour_format == 'max') {
415
			// On est obligé de faire un deuxième boucle pour demander tous les taxons présents en une 
415
			// On est obligé de faire un deuxième boucle pour demander tous les taxons présents en une 
416
			// fois et les attribuer aux noms car c'est beaucoup plus rapide
416
			// fois et les attribuer aux noms car c'est beaucoup plus rapide
417
			$noms_sci = $this->recupererNomTaxons();
417
			$noms_sci = $this->recupererNomTaxons();
418
			foreach ($resultat_json as $num_nom => &$tab) {
418
			foreach ($resultat_json as $num_nom => &$tab) {
419
				$tab = $this->ajouterTaxonsAttributionsLigneResultat($tab, $noms_sci);
419
				$tab = $this->ajouterTaxonsAttributionsLigneResultat($tab, $noms_sci);
420
				if($tab == null) {
420
				if($tab == null) {
421
					unset($resultat_json[$num_nom]);
421
					unset($resultat_json[$num_nom]);
422
				}
422
				}
423
			}
423
			}
424
		}
424
		}
425
		
425
		
426
		$table_retour_json['resultat'] = $resultat_json;
426
		$table_retour_json['resultat'] = $resultat_json;
427
		return $table_retour_json;
427
		return $table_retour_json;
428
	}
428
	}
429
	
429
	
430
	/**
430
	/**
431
	 * Ajoute les champs d'ontologie supplémentaires si necéssaire
431
	 * Ajoute les champs d'ontologie supplémentaires si necéssaire
432
	 * en faisant appels aux web services associés.
432
	 * en faisant appels aux web services associés.
433
	 * Les appels peuvent être fait individuellement (pour un couple <ontologie:valeur>) ou bien
433
	 * Les appels peuvent être fait individuellement (pour un couple <ontologie:valeur>) ou bien
434
	 * regroupés, **si le webservice correspondant le supporte**.
434
	 * regroupés, **si le webservice correspondant le supporte**.
435
	 *
435
	 *
436
	 * Nous disposons à ce jour de 3 (trois) webservices d'ontologies correspondant aux noms vernaculaires (cf $champ_infos)
436
	 * Nous disposons à ce jour de 3 (trois) webservices d'ontologies correspondant aux noms vernaculaires (cf $champ_infos)
437
	 * Mais 2 d'entre eux sont identiques, il s'agit de /nvjfl/ontologies/. Or ce webservice supporte le multi-critère.
437
	 * Mais 2 d'entre eux sont identiques, il s'agit de /nvjfl/ontologies/. Or ce webservice supporte le multi-critère.
438
	 * Nous pouvons donc factorisé l'appel pour "conseil_emploi" et "genre", mais pas pour "taxon".
438
	 * Nous pouvons donc factorisé l'appel pour "conseil_emploi" et "genre", mais pas pour "taxon".
439
	 *
439
	 *
440
	 * @param array in/out $resultats: tous les résultats
440
	 * @param array in/out $resultats: tous les résultats
441
	 */
441
	 */
442
	public function ajouterChampsOntologieLigneTousResultats(&$resultats) {
442
	public function ajouterChampsOntologieLigneTousResultats(&$resultats) {
443
		$champs_sup = array_intersect($this->champs_supp, array_keys(self::$champ_infos));
443
		$champs_sup = array_intersect($this->champs_supp, array_keys(self::$champ_infos));
444
 
444
 
445
		// La regroupement des toutes les valeurs recherchées (pour tous les
445
		// La regroupement des toutes les valeurs recherchées (pour tous les
446
		// résultats), pour "les" onotologies supportant le multi-critère est effectué ci-dessous.
446
		// résultats), pour "les" onotologies supportant le multi-critère est effectué ci-dessous.
447
		// Dans les faits ce n'est le cas que pour nvjfl.
447
		// Dans les faits ce n'est le cas que pour nvjfl.
448
		$ontologieParamPending = self::NvjflOntologieIndex($resultats, $champs_sup);
448
		$ontologieParamPending = self::NvjflOntologieIndex($resultats, $champs_sup);
449
		$this->NvjflOntologieExpand($ontologieParamPending);
449
		$this->NvjflOntologieExpand($ontologieParamPending);
450
		self::NvjflOntologieCombine($resultats);
450
		self::NvjflOntologieCombine($resultats);
451
 
451
 
452
		// pour les ontologies multi-critères, on vient de le régler ci-dessus
452
		// pour les ontologies multi-critères, on vient de le régler ci-dessus
453
		$champs_sup = array_diff($champs_sup, self::$onto_multi_support);
453
		$champs_sup = array_diff($champs_sup, self::$onto_multi_support);
454
 
454
 
455
 
455
 
456
		// ici, $champs_sup ne peut contenir, au plus, que "taxon".
456
		// ici, $champs_sup ne peut contenir, au plus, que "taxon".
457
		// code historique:
457
		// code historique:
458
		foreach($champs_sup as $cle) {
458
		foreach($champs_sup as $cle) {
459
			$champs_supplementaires = self::$champ_infos[$cle];
459
			$champs_supplementaires = self::$champ_infos[$cle];
460
			// extrait, depuis un élément de $champ_infos:
460
			// extrait, depuis un élément de $champ_infos:
461
			// $service, $ressource, $projet, $nom, $intitule, $bdd_champ
461
			// $service, $ressource, $projet, $nom, $intitule, $bdd_champ
462
			extract($champs_supplementaires);
462
			extract($champs_supplementaires);
463
 
463
 
464
			foreach ($resultats as &$tab) {
464
			foreach ($resultats as &$tab) {
465
				$valeur_recherche = $tab[$bdd_champ];
465
				$valeur_recherche = $tab[$bdd_champ];
466
				if(!trim($valeur_recherche)) continue;
466
				if(!trim($valeur_recherche)) continue;
467
 
467
 
468
				$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur_recherche, $projet);
468
				$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur_recherche, $projet);
469
				$tab[$intitule] = $this->chercherSignificationCode($url, $nom);
469
				$tab[$intitule] = $this->chercherSignificationCode($url, $nom);
470
			}
470
			}
471
		}
471
		}
472
	}
472
	}
473
 
473
 
474
	/* Récupère les valeurs recherchées pour une liste de résultats, (plus ou moins)
474
	/* Récupère les valeurs recherchées pour une liste de résultats, (plus ou moins)
475
	   spécifiquement au service d'Ontologies de NVJFL.
475
	   spécifiquement au service d'Ontologies de NVJFL.
476
	   Aggrège les valeurs dans le tableau retourné.
476
	   Aggrège les valeurs dans le tableau retourné.
477
	   Une référence vers l'index du tableau (NULL pour l'instant) est laissée dans
477
	   Une référence vers l'index du tableau (NULL pour l'instant) est laissée dans
478
	   un élément du résultat. */
478
	   un élément du résultat. */
479
	static function NvjflOntologieIndex(&$resultats, $champs_sup) {
479
	static function NvjflOntologieIndex(&$resultats, $champs_sup) {
480
		// nous ne supportons le multi-critère que sur les ontologies nvjfl, et nous
480
		// nous ne supportons le multi-critère que sur les ontologies nvjfl, et nous
481
		// avons précisé celles qui sont concernées dans self::$onto_multi_support
481
		// avons précisé celles qui sont concernées dans self::$onto_multi_support
482
		$champs_sup = array_intersect($champs_sup, self::$onto_multi_support);
482
		$champs_sup = array_intersect($champs_sup, self::$onto_multi_support);
483
		$ontologieParamPending = Array();
483
		$ontologieParamPending = Array();
484
		foreach($resultats as &$resultat) {
484
		foreach($resultats as &$resultat) {
485
			foreach($champs_sup as $v) {
485
			foreach($champs_sup as $v) {
486
				// de cet extract() nous n'utilisons que $bdd_champ et $ressource
486
				// de cet extract() nous n'utilisons que $bdd_champ et $ressource
487
				extract(self::$champ_infos[$v]);
487
				extract(self::$champ_infos[$v]);
488
				if(!isset($resultat[$bdd_champ])) continue;
488
				if(!isset($resultat[$bdd_champ])) continue;
489
 
489
 
490
				$valeur_recherche = $resultat[$bdd_champ];
490
				$valeur_recherche = $resultat[$bdd_champ];
491
				if(!trim($valeur_recherche)) continue;
491
				if(!trim($valeur_recherche)) continue;
492
 
492
 
493
				// XXX: $ressource contient déjà ':' comme suffixe
493
				// XXX: $ressource contient déjà ':' comme suffixe
494
				$critere = $ressource . $valeur_recherche;
494
				$critere = $ressource . $valeur_recherche;
495
				$ontologieParamPending[$critere] = NULL;
495
				$ontologieParamPending[$critere] = NULL;
496
				// placeholder pour le résultat
496
				// placeholder pour le résultat
497
				$resultat[SPE_INDEX_NVJFL][$v][$critere] =
497
				$resultat[SPE_INDEX_NVJFL][$v][$critere] =
498
					&$ontologieParamPending[$critere];
498
					&$ontologieParamPending[$critere];
499
			}
499
			}
500
		}
500
		}
501
		return $ontologieParamPending;
501
		return $ontologieParamPending;
502
	}
502
	}
503
 
503
 
504
	// TODO: switch to static si il peut en être de même pour ajouterHrefAutreProjet()
504
	// TODO: switch to static si il peut en être de même pour ajouterHrefAutreProjet()
505
	/* À partir d'un aggrégat des critère de requêtes d'ontologies, spécifiques à NVJFL,
505
	/* À partir d'un aggrégat des critère de requêtes d'ontologies, spécifiques à NVJFL,
506
	   créé une URL multi-critère.
506
	   créé une URL multi-critère.
507
	   Celle-ci, dans ce cas précis, n'est que la concaténation, par des virgules,
507
	   Celle-ci, dans ce cas précis, n'est que la concaténation, par des virgules,
508
	   des couples <ressource:ValeurRecherchée>.
508
	   des couples <ressource:ValeurRecherchée>.
509
	   L'URL est appelée et la valeur correspondante est remplacée dans $criteres_requete.
509
	   L'URL est appelée et la valeur correspondante est remplacée dans $criteres_requete.
510
 
510
 
511
	   Note: dans le cadre du tryptique index/expand/combine pour lequel cette fonction existe,
511
	   Note: dans le cadre du tryptique index/expand/combine pour lequel cette fonction existe,
512
	   la valeur est référencée par un élément d'une ou plusieurs lignes de $resultat correspondantes.
512
	   la valeur est référencée par un élément d'une ou plusieurs lignes de $resultat correspondantes.
513
	   Celle(s)-ci sera[ont] donc changée(s) dans la foulée. */
513
	   Celle(s)-ci sera[ont] donc changée(s) dans la foulée. */
514
	public function NvjflOntologieExpand(&$criteres_requete) {
514
	public function NvjflOntologieExpand(&$criteres_requete) {
515
		// équivalent spécifique de ajouterHrefAutreProjet()
515
		// équivalent spécifique de ajouterHrefAutreProjet()
516
		$valeurs_requises = implode(',', array_keys($criteres_requete));
516
		$valeurs_requises = implode(',', array_keys($criteres_requete));
517
		// en vérité, nous ne supportons ceci ici que pour nvjfl et non n'importe quel url_service
517
		// en vérité, nous ne supportons ceci ici que pour nvjfl et non n'importe quel url_service
518
		$url = Config::get('url_service').'/ontologies/'.$valeurs_requises;
518
		$url = Config::get('url_service').'/ontologies/'.$valeurs_requises;
519
		$val = $this->consulterHref($url);
519
		$val = $this->consulterHref($url);
520
 
520
 
521
		// TODO, le webservice d'ontologies devrait être modifié pour retourner un tableau
521
		// TODO, le webservice d'ontologies devrait être modifié pour retourner un tableau
522
		// indexé par critère requesté à *CHAQUE* fois, y compris lorsque 1 seul critère est
522
		// indexé par critère requesté à *CHAQUE* fois, y compris lorsque 1 seul critère est
523
		// demandé.
523
		// demandé.
524
		if(array_key_exists('id', $val) && count($criteres_requete) == 1) {
524
		if(array_key_exists('id', $val) && count($criteres_requete) == 1) {
525
			$k = key($criteres_requete);
525
			$k = key($criteres_requete);
526
			$criteres_requete[$k] = $val;
526
			$criteres_requete[$k] = $val;
527
			return;
527
			return;
528
		}
528
		}
529
 
529
 
530
		// subtilité, cette affectation modifie par conséquent les valeurs dans
530
		// subtilité, cette affectation modifie par conséquent les valeurs dans
531
		// $resultats[X][SPE_INDEX_NVJFL]
531
		// $resultats[X][SPE_INDEX_NVJFL]
532
		// dont la référence pointe toujours sur $v
532
		// dont la référence pointe toujours sur $v
533
		foreach($val as $k => $v) $criteres_requete[$k] = $val->$k;
533
		foreach($val as $k => $v) $criteres_requete[$k] = $val->$k;
534
	}
534
	}
535
 
535
 
536
	/* Fonction finale du tryptique: réordonne les valeurs obtenues auprès du web-service
536
	/* Fonction finale du tryptique: réordonne les valeurs obtenues auprès du web-service
537
	   NVJFL en adéquation avec les champs attendus en sortie.
537
	   NVJFL en adéquation avec les champs attendus en sortie.
538
	   Dès l'indexation des critères, nous avons associé une (ou plusieurs) référence(s) du
538
	   Dès l'indexation des critères, nous avons associé une (ou plusieurs) référence(s) du
539
	   tableau de résultats vers le tableau de retour des ontologies à l'aide d'un index
539
	   tableau de résultats vers le tableau de retour des ontologies à l'aide d'un index
540
	   particulier l'index SPE_INDEX_NVJFL qui contient comme élément(s)
540
	   particulier l'index SPE_INDEX_NVJFL qui contient comme élément(s)
541
	   un ou plusieurs ontologies (les indexes de self::$champ_infos) qui elles-mêmes contiennent
541
	   un ou plusieurs ontologies (les indexes de self::$champ_infos) qui elles-mêmes contiennent
542
	   une ou plusieurs valeurs représentant les valeurs recherchées appartement à cette ontologies.
542
	   une ou plusieurs valeurs représentant les valeurs recherchées appartement à cette ontologies.
543
	   Celui-ci est supprimé après avoir été correctement copié. */
543
	   Celui-ci est supprimé après avoir été correctement copié. */
544
	/**
544
	/**
545
	 * @param array in/out $resultats: tous les résultats
545
	 * @param array in/out $resultats: tous les résultats
546
	 * @param array in $critere: tableau des ontologies:valeur demandées, de la forme [ numStatut:1, genreNombre:11, ... ]
546
	 * @param array in $critere: tableau des ontologies:valeur demandées, de la forme [ numStatut:1, genreNombre:11, ... ]
547
	 */
547
	 */
548
	static function NvjflOntologieCombine(&$resultats, $criteres) {
548
	static function NvjflOntologieCombine(&$resultats) {
549
		foreach($resultats as &$resultat) {
549
		foreach($resultats as &$resultat) {
550
			if(!array_key_exists(SPE_INDEX_NVJFL, $resultat)) continue;
550
			if(!array_key_exists(SPE_INDEX_NVJFL, $resultat)) continue;
551
 
551
 
552
			/* Note: la complétude d'un résultat peut dépendre de plusieurs ontologies différentes,
552
			/* Note: la complétude d'un résultat peut dépendre de plusieurs ontologies différentes,
553
			   d'où cette boucle. Cependant une seule valeur sera demandé pour cette ontologie, c'est pourquoi
553
			   d'où cette boucle. Cependant une seule valeur sera demandé pour cette ontologie, c'est pourquoi
554
			   $resultat[SPE_INDEX_NVJFL][$onto_name], s'il existe, ne contiendra toujours qu'un seul élément.
554
			   $resultat[SPE_INDEX_NVJFL][$onto_name], s'il existe, ne contiendra toujours qu'un seul élément.
555
			   Puisque par définition un résultat contenant des valeurs d'ontologie n'aura jamais qu'un seul et unique
555
			   Puisque par définition un résultat contenant des valeurs d'ontologie n'aura jamais qu'un seul et unique
556
			   attribut num_genre (ou num_statut, ou autre) */
556
			   attribut num_genre (ou num_statut, ou autre) */
557
			foreach(self::$onto_multi_support as $onto_name) {
557
			foreach(self::$onto_multi_support as $onto_name) {
-
 
558
				if(!array_key_exists($onto_name, $resultat[SPE_INDEX_NVJFL])) continue;
-
 
559
 
558
				/* $onto_name est un nom d'ontologie (l'une des clefs, parmi conseil_emploi et genre,
560
				/* $onto_name est un nom d'ontologie (l'une des clefs, parmi conseil_emploi et genre,
559
				   cf la boucle sur $champs_sup dans  NvjflOntologieIndex()
561
				   cf la boucle sur $champs_sup dans  NvjflOntologieIndex()
560
				   de cet extract() nous n'utilisons que $intitule et $nom */
562
				   de cet extract() nous n'utilisons que $intitule et $nom */
561
				extract(self::$champ_infos[$onto_name]);
563
				extract(self::$champ_infos[$onto_name]);
562
 
564
 
563
				// equivalent de l'affectation finale de chercherSignificationCode()
565
				// equivalent de l'affectation finale de chercherSignificationCode()
564
				// (utilisé lors de recherches d'ontologies en mono-critère)
566
				// (utilisé lors de recherches d'ontologies en mono-critère)
565
				// XXX: PHP-5.3 pas de récupération d'attribut sur fonction
567
				// XXX: PHP-5.3 pas de récupération d'attribut sur fonction
566
				$r = current($resultat[SPE_INDEX_NVJFL][$onto_name]);
568
				$r = current($resultat[SPE_INDEX_NVJFL][$onto_name]);
567
				$resultat[$intitule] = $r->$nom;
569
				$resultat[$intitule] = $r->$nom;
568
 
570
 
569
				// XXX: certes nous pourrions nous contenter du unset() final
571
				// XXX: certes nous pourrions nous contenter du unset() final
570
				unset($resultat[SPE_INDEX_NVJFL][$onto_name]);
572
				unset($resultat[SPE_INDEX_NVJFL][$onto_name]);
571
			}
573
			}
572
			unset($resultat[SPE_INDEX_NVJFL]);
574
			unset($resultat[SPE_INDEX_NVJFL]);
573
		}
575
		}
574
	}
576
	}
575
 
577
 
576
	/**
578
	/**
577
	 * Ajoute les champs d'ontologie supplémentaires si necéssaire
579
	 * Ajoute les champs d'ontologie supplémentaires si necéssaire
578
	 * en faisant appels aux web services associés
580
	 * en faisant appels aux web services associés
579
	 * @param array $ligne_resultat
581
	 * @param array $ligne_resultat
580
	 * 
582
	 * 
581
	 * @return array la ligne modifiée
583
	 * @return array la ligne modifiée
582
	 */
584
	 */
583
	public function ajouterChampsOntologieLigneResultat($ligne_resultat) {
585
	public function ajouterChampsOntologieLigneResultat($ligne_resultat) {
584
		foreach(self::$champ_infos as $cle => $champs_supplementaires) {
586
		foreach(self::$champ_infos as $cle => $champs_supplementaires) {
585
			if(!in_array($cle, $this->champs_supp)) continue;
587
			if(!in_array($cle, $this->champs_supp)) continue;
586
			// extrait, depuis un élément de $champ_infos:
588
			// extrait, depuis un élément de $champ_infos:
587
			// $service, $ressource, $projet, $nom, $intitule, $bdd_champ
589
			// $service, $ressource, $projet, $nom, $intitule, $bdd_champ
588
			extract($champs_supplementaires);
590
			extract($champs_supplementaires);
589
			$valeur_recherche = $ligne_resultat[$bdd_champ];
591
			$valeur_recherche = $ligne_resultat[$bdd_champ];
590
			if(!trim($valeur_recherche)) continue;
592
			if(!trim($valeur_recherche)) continue;
591
			$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur_recherche, $projet);
593
			$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur_recherche, $projet);
592
			$ligne_resultat[$intitule] = $this->chercherSignificationCode($url, $nom);
594
			$ligne_resultat[$intitule] = $this->chercherSignificationCode($url, $nom);
593
		}
595
		}
594
		return $ligne_resultat;
596
		return $ligne_resultat;
595
	}
597
	}
596
	
598
	
597
	/**
599
	/**
598
	 * Fonction qui ajoute les attributions à une ligne de résultats
600
	 * Fonction qui ajoute les attributions à une ligne de résultats
599
	 *
601
	 *
600
	 * @param array $ligne_tableau_resultat
602
	 * @param array $ligne_tableau_resultat
601
	 * @param array $nom_sci
603
	 * @param array $nom_sci
602
	 */
604
	 */
603
	public function ajouterTaxonsAttributionsLigneResultat(&$ligne_tableau_resultat, &$noms_sci) {
605
	public function ajouterTaxonsAttributionsLigneResultat(&$ligne_tableau_resultat, &$noms_sci) {
604
		if (isset($noms_sci[$ligne_tableau_resultat['num_taxon']])) {
606
		if (isset($noms_sci[$ligne_tableau_resultat['num_taxon']])) {
605
			$ligne_tableau_resultat['nom_retenu.code'] = $noms_sci[$ligne_tableau_resultat['num_taxon']]['id'];
607
			$ligne_tableau_resultat['nom_retenu.code'] = $noms_sci[$ligne_tableau_resultat['num_taxon']]['id'];
606
			$ligne_tableau_resultat['taxon'] = $noms_sci[$ligne_tableau_resultat['num_taxon']]['nom_sci'];
608
			$ligne_tableau_resultat['taxon'] = $noms_sci[$ligne_tableau_resultat['num_taxon']]['nom_sci'];
607
		} else {
609
		} else {
608
			$ligne_tableau_resultat = null;
610
			$ligne_tableau_resultat = null;
609
		}
611
		}
610
		return $ligne_tableau_resultat;
612
		return $ligne_tableau_resultat;
611
	}
613
	}
612
	
614
	
613
	private function trierLigneTableau($a, $b) {
615
	private function trierLigneTableau($a, $b) {
614
		$retour = 0;
616
		$retour = 0;
615
		
617
		
616
		if ($a[$this->champ_tri] == $b[$this->champ_tri]) {
618
		if ($a[$this->champ_tri] == $b[$this->champ_tri]) {
617
			$retour = 0;
619
			$retour = 0;
618
		}
620
		}
619
				
621
				
620
		if($this->champ_tri == 'code_langue') {
622
		if($this->champ_tri == 'code_langue') {
621
			if ($a[$this->champ_tri] == 'fra' && $b[$this->champ_tri] != 'fra') {
623
			if ($a[$this->champ_tri] == 'fra' && $b[$this->champ_tri] != 'fra') {
622
				$retour = ($this->direction_tri == 'asc') ? -1 : 1;
624
				$retour = ($this->direction_tri == 'asc') ? -1 : 1;
623
			} else if ($a[$this->champ_tri] != 'fra' && $b[$this->champ_tri] == 'fra') {
625
			} else if ($a[$this->champ_tri] != 'fra' && $b[$this->champ_tri] == 'fra') {
624
				$retour = ($this->direction_tri == 'asc') ? 1 : -1;
626
				$retour = ($this->direction_tri == 'asc') ? 1 : -1;
625
			} else {
627
			} else {
626
				$retour = $this->comparerChaineSelonDirectionTri($a[$this->champ_tri], $b[$this->champ_tri]);
628
				$retour = $this->comparerChaineSelonDirectionTri($a[$this->champ_tri], $b[$this->champ_tri]);
627
			}
629
			}
628
		} else {
630
		} else {
629
			$retour = $this->comparerChaineSelonDirectionTri($a[$this->champ_tri], $b[$this->champ_tri]);
631
			$retour = $this->comparerChaineSelonDirectionTri($a[$this->champ_tri], $b[$this->champ_tri]);
630
		}
632
		}
631
		return $retour;
633
		return $retour;
632
	}
634
	}
633
	
635
	
634
	private function comparerChaineSelonDirectionTri($a, $b) {
636
	private function comparerChaineSelonDirectionTri($a, $b) {
635
		if($this->direction_tri == 'asc') {
637
		if($this->direction_tri == 'asc') {
636
			return ($a < $b) ? -1 : 1;
638
			return ($a < $b) ? -1 : 1;
637
		} else {
639
		} else {
638
			return ($a > $b) ? -1 : 1;
640
			return ($a > $b) ? -1 : 1;
639
		}
641
		}
640
	}
642
	}
641
	
643
	
642
	// formatage de la reponse /id ss la forme
644
	// formatage de la reponse /id ss la forme
643
	// id, nom_vernaculaire, attributions
645
	// id, nom_vernaculaire, attributions
644
	// langue
646
	// langue
645
	// num_nom (correspond à un taxon bdtfx)
647
	// num_nom (correspond à un taxon bdtfx)
646
	public function formaterNomsVernaculairesId($resultat) {
648
	public function formaterNomsVernaculairesId($resultat) {
647
		foreach ($resultat as $taxon) { // pour chaque attribution à un taxon bdtfx
649
		foreach ($resultat as $taxon) { // pour chaque attribution à un taxon bdtfx
648
			// on crée les variables qui serviront de clés et on les enléves du tableau
650
			// on crée les variables qui serviront de clés et on les enléves du tableau
649
			$num_nom = $taxon['num_nom_vernaculaire']; // unique pour un trinôme id, langue, taxon
651
			$num_nom = $taxon['num_nom_vernaculaire']; // unique pour un trinôme id, langue, taxon
650
			unset($taxon['num_nom_vernaculaire']);
652
			unset($taxon['num_nom_vernaculaire']);
651
			$langue = $taxon['code_langue'];
653
			$langue = $taxon['code_langue'];
652
			unset($taxon['code_langue']);
654
			unset($taxon['code_langue']);
653
 
655
 
654
			foreach ($this->correspondance_champs as $key => $correspondance) { // ordonne les infos pour affichage
656
			foreach ($this->correspondance_champs as $key => $correspondance) { // ordonne les infos pour affichage
655
				if (isset($taxon[$key]) && $taxon[$key] != "") {
657
				if (isset($taxon[$key]) && $taxon[$key] != "") {
656
					$this->afficherDonnees($correspondance, $taxon[$key], $langue, $num_nom);
658
					$this->afficherDonnees($correspondance, $taxon[$key], $langue, $num_nom);
657
				}
659
				}
658
			}
660
			}
659
			foreach ($taxon as $key => $valeur) { // rajoute les champs non prévus dans l'api
661
			foreach ($taxon as $key => $valeur) { // rajoute les champs non prévus dans l'api
660
				if (!isset($this->correspondance_champs[$key]) && $valeur != "") {
662
				if (!isset($this->correspondance_champs[$key]) && $valeur != "") {
661
					$this->afficherDonnees($key, $valeur, $langue, $num_nom);
663
					$this->afficherDonnees($key, $valeur, $langue, $num_nom);
662
				}
664
				}
663
			}
665
			}
664
			if ($this->retour_format == 'max') $this->chargerBiblio($num_nom, $langue);
666
			if ($this->retour_format == 'max') $this->chargerBiblio($num_nom, $langue);
665
		}
667
		}
666
		if ($this->retour_format == 'max') $this->afficherTaxons(); // va chercher les noms de tous les taxons
668
		if ($this->retour_format == 'max') $this->afficherTaxons(); // va chercher les noms de tous les taxons
667
		unset($this->table_retour['href']);
669
		unset($this->table_retour['href']);
668
		return $this->table_retour;
670
		return $this->table_retour;
669
	}
671
	}
670
 
672
 
671
	public function afficherDonnees($champ, $valeur, $langue = '', $num_nom = '') {
673
	public function afficherDonnees($champ, $valeur, $langue = '', $num_nom = '') {
672
		if ($champ == 'id' || $champ == 'nom_vernaculaire') {
674
		if ($champ == 'id' || $champ == 'nom_vernaculaire') {
673
			$this->table_retour[$champ] = $valeur;
675
			$this->table_retour[$champ] = $valeur;
674
		} elseif (preg_match('/^(.*)\.code$/', $champ, $match)) {
676
		} elseif (preg_match('/^(.*)\.code$/', $champ, $match)) {
675
				switch ($match[1]) {
677
				switch ($match[1]) {
676
					case 'taxon'	: if ($this->retour_format == 'max') {$this->taxons[$num_nom] = $valeur;}
678
					case 'taxon'	: if ($this->retour_format == 'max') {$this->taxons[$num_nom] = $valeur;}
677
						$this->afficherPointCode($match[1], $langue, $num_nom, $valeur);	break;
679
						$this->afficherPointCode($match[1], $langue, $num_nom, $valeur);	break;
678
					case 'langue'	: //$this->afficherPointCode($match[1], 'iso-639-3', 'langues', $valeur);
680
					case 'langue'	: //$this->afficherPointCode($match[1], 'iso-639-3', 'langues', $valeur);
679
						break;
681
						break;
680
					case 'genre'	: $this->afficherPointCode($match[1], $langue, $num_nom, $valeur);	break;
682
					case 'genre'	: $this->afficherPointCode($match[1], $langue, $num_nom, $valeur);	break;
681
					case 'conseil_emploi'	: $this->afficherPointCode($match[1], $langue, $num_nom, $valeur);	break;
683
					case 'conseil_emploi'	: $this->afficherPointCode($match[1], $langue, $num_nom, $valeur);	break;
682
					default : break;
684
					default : break;
683
				}
685
				}
684
 
686
 
685
		} elseif ($langue != '') {
687
		} elseif ($langue != '') {
686
			$this->table_retour['attributions'][$langue][$num_nom][$champ] = $valeur;
688
			$this->table_retour['attributions'][$langue][$num_nom][$champ] = $valeur;
687
		} else {
689
		} else {
688
			$this->table_retour[$champ] = $valeur;
690
			$this->table_retour[$champ] = $valeur;
689
		}
691
		}
690
	}
692
	}
691
 
693
 
692
	public function afficherPointCode($nomChamp, $langue, $num_nom, $valeur) {
694
	public function afficherPointCode($nomChamp, $langue, $num_nom, $valeur) {
693
		if (isset(self::$champ_infos[$nomChamp])) {
695
		if (isset(self::$champ_infos[$nomChamp])) {
694
			extract(self::$champ_infos[$nomChamp]);
696
			extract(self::$champ_infos[$nomChamp]);
695
		}
697
		}
696
 
698
 
697
		if ($this->retour_format == 'max') {
699
		if ($this->retour_format == 'max') {
698
			$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur, $projet);
700
			$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur, $projet);
699
			if ($service == 'taxons') {
701
			if ($service == 'taxons') {
700
				$code_valeur = '';
702
				$code_valeur = '';
701
				$this->table_retour['attributions'][$langue][$num_nom]['nom_retenu.code'] = $code_valeur;
703
				$this->table_retour['attributions'][$langue][$num_nom]['nom_retenu.code'] = $code_valeur;
702
			} else {
704
			} else {
703
				$code_valeur = $this->chercherSignificationCode($url, $nom);
705
				$code_valeur = $this->chercherSignificationCode($url, $nom);
704
			}
706
			}
705
			if ($projet != '') $projet .= '.';
707
			if ($projet != '') $projet .= '.';
706
			$this->table_retour['attributions'][$langue][$num_nom][$nomChamp] = $code_valeur;
708
			$this->table_retour['attributions'][$langue][$num_nom][$nomChamp] = $code_valeur;
707
			$this->table_retour['attributions'][$langue][$num_nom][$nomChamp.'.code'] = $projet.$ressource.$valeur;
709
			$this->table_retour['attributions'][$langue][$num_nom][$nomChamp.'.code'] = $projet.$ressource.$valeur;
708
			$this->table_retour['attributions'][$langue][$num_nom][$nomChamp.'.href'] = $url;
710
			$this->table_retour['attributions'][$langue][$num_nom][$nomChamp.'.href'] = $url;
709
		} else {
711
		} else {
710
			if ($projet != '') $projet .= '.';
712
			if ($projet != '') $projet .= '.';
711
			$this->table_retour['attributions'][$langue][$num_nom][$nomChamp.'.code'] = $projet.$ressource.$valeur;
713
			$this->table_retour['attributions'][$langue][$num_nom][$nomChamp.'.code'] = $projet.$ressource.$valeur;
712
		}
714
		}
713
	}
715
	}
714
 
716
 
715
	public function chercherSignificationCode($url, $nom) {
717
	public function chercherSignificationCode($url, $nom) {
716
		if (isset($this->signification_code[$url])) {
718
		if (isset($this->signification_code[$url])) {
717
			$valeur = $this->signification_code[$url];
719
			$valeur = $this->signification_code[$url];
718
		} else {
720
		} else {
719
			$res = $this->consulterHref($url);
721
			$res = $this->consulterHref($url);
720
			$valeur = $res->$nom;
722
			$valeur = $res->$nom;
721
			$this->signification_code[$url] = $valeur;
723
			$this->signification_code[$url] = $valeur;
722
		}
724
		}
723
		return $valeur;
725
		return $valeur;
724
	}
726
	}
725
 
727
 
726
	public function afficherTaxons() {
728
	public function afficherTaxons() {
727
		$resultat = $this->recupererNomTaxons();
729
		$resultat = $this->recupererNomTaxons();
728
		foreach ($this->table_retour['attributions'] as $code_langue=>$langue) {
730
		foreach ($this->table_retour['attributions'] as $code_langue=>$langue) {
729
			foreach ($langue as $num_nom=>$taxon) {
731
			foreach ($langue as $num_nom=>$taxon) {
730
				$num_tax = ltrim($taxon['taxon.code'], 'bdtfx.nt:');
732
				$num_tax = ltrim($taxon['taxon.code'], 'bdtfx.nt:');
731
				if (isset($resultat[$num_tax])) {
733
				if (isset($resultat[$num_tax])) {
732
					$this->table_retour['attributions'][$code_langue][$num_nom]['nom_retenu.code'] = $resultat[$num_tax]['id'];
734
					$this->table_retour['attributions'][$code_langue][$num_nom]['nom_retenu.code'] = $resultat[$num_tax]['id'];
733
					$this->table_retour['attributions'][$code_langue][$num_nom]['taxon'] = $resultat[$num_tax]['nom_sci'];
735
					$this->table_retour['attributions'][$code_langue][$num_nom]['taxon'] = $resultat[$num_tax]['nom_sci'];
734
				}
736
				}
735
			}
737
			}
736
		}
738
		}
737
	}
739
	}
738
	
740
	
739
	public function recupererNomTaxons() {
741
	public function recupererNomTaxons() {
740
		$taxons = array_unique($this->taxons);
742
		$taxons = array_unique($this->taxons);
741
		$url = Config::get('url_service_base').'bdtfx/taxons?navigation.limite=500&ns.structure=au&masque.nt='.implode(',', $taxons);
743
		$url = Config::get('url_service_base').'bdtfx/taxons?navigation.limite=500&ns.structure=au&masque.nt='.implode(',', $taxons);
742
		$res = $this->consulterHref($url);
744
		$res = $this->consulterHref($url);
743
		foreach ($res->resultat as $id=>$taxon) {
745
		foreach ($res->resultat as $id=>$taxon) {
744
			$resultat[$taxon->num_taxonomique]['id'] = 'bdtfx.nn:'.$id;
746
			$resultat[$taxon->num_taxonomique]['id'] = 'bdtfx.nn:'.$id;
745
			$resultat[$taxon->num_taxonomique]['nom_sci'] = $taxon->nom_sci_complet;
747
			$resultat[$taxon->num_taxonomique]['nom_sci'] = $taxon->nom_sci_complet;
746
		}
748
		}
747
		return $resultat;
749
		return $resultat;
748
	}
750
	}
749
 
751
 
750
	public function formaterNomsVernaculairesIdChamp($resultat) {
752
	public function formaterNomsVernaculairesIdChamp($resultat) {
751
		$this->table_retour['id'] = $this->ressources[0];
753
		$this->table_retour['id'] = $this->ressources[0];
752
		$champs = explode(' ', $this->ressources[1]);
754
		$champs = explode(' ', $this->ressources[1]);
753
		if (in_array('attributions', $champs) != false) {
755
		if (in_array('attributions', $champs) != false) {
754
			$this->formaterNomsVernaculairesId($resultat);
756
			$this->formaterNomsVernaculairesId($resultat);
755
			unset($this->table_retour['nom_vernaculaire']);
757
			unset($this->table_retour['nom_vernaculaire']);
756
		} else {
758
		} else {
757
			$champ_attributions = array('num_taxon', 'zone_usage', 'num_statut', 'num_genre', 'notes');
759
			$champ_attributions = array('num_taxon', 'zone_usage', 'num_statut', 'num_genre', 'notes');
758
			foreach ($resultat as $taxon) {
760
			foreach ($resultat as $taxon) {
759
				foreach ($taxon as $key=>$valeur) {
761
				foreach ($taxon as $key=>$valeur) {
760
					if ($key == 'code_langue' && in_array('langue', $champs) != false) {
762
					if ($key == 'code_langue' && in_array('langue', $champs) != false) {
761
						$this->table_retour['attributions']['langue'][] = $valeur;
763
						$this->table_retour['attributions']['langue'][] = $valeur;
762
					} elseif (in_array($key, $champ_attributions) != false) {
764
					} elseif (in_array($key, $champ_attributions) != false) {
763
						$this->afficherPoint($this->correspondance_champs[$key] , $valeur, $taxon['code_langue'], $taxon['num_nom_vernaculaire']);
765
						$this->afficherPoint($this->correspondance_champs[$key] , $valeur, $taxon['code_langue'], $taxon['num_nom_vernaculaire']);
764
					} elseif (in_array($key, $champs) != false) {
766
					} elseif (in_array($key, $champs) != false) {
765
						$this->table_retour[$key] = $valeur;
767
						$this->table_retour[$key] = $valeur;
766
					}
768
					}
767
				}
769
				}
768
				if (in_array('biblio', $champs) != false) $this->chargerBiblio($taxon['num_nom_vernaculaire'], $taxon['code_langue']);
770
				if (in_array('biblio', $champs) != false) $this->chargerBiblio($taxon['num_nom_vernaculaire'], $taxon['code_langue']);
769
			}
771
			}
770
			if (in_array('biblio', $champs) != false && array_search('biblio.num_ref', $this->table_retour) != false) $this->table_retour['biblio'] = null;
772
			if (in_array('biblio', $champs) != false && array_search('biblio.num_ref', $this->table_retour) != false) $this->table_retour['biblio'] = null;
771
		}
773
		}
772
		return $this->table_retour;
774
		return $this->table_retour;
773
	}
775
	}
774
 
776
 
775
	public function afficherPoint($champ, $valeur, $langue, $num_nom) {
777
	public function afficherPoint($champ, $valeur, $langue, $num_nom) {
776
		preg_match('/^(.*)\.code$/', $champ, $match);
778
		preg_match('/^(.*)\.code$/', $champ, $match);
777
		$champ = $match[1];
779
		$champ = $match[1];
778
		if (isset(self::$champ_infos[$champ])) {
780
		if (isset(self::$champ_infos[$champ])) {
779
			extract(self::$champ_infos[$champ]);
781
			extract(self::$champ_infos[$champ]);
780
			$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur, $projet);
782
			$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur, $projet);
781
			$projet .= '.';
783
			$projet .= '.';
782
		}
784
		}
783
 
785
 
784
		$champs = explode(' ', $this->ressources[1]);
786
		$champs = explode(' ', $this->ressources[1]);
785
		if (in_array($champ.'.*', $champs) !== false && isset($projet)) {
787
		if (in_array($champ.'.*', $champs) !== false && isset($projet)) {
786
			$this->table_retour['attributions'][$langue][$num_nom][$champ.'.code'] = $projet.$ressource.$valeur;
788
			$this->table_retour['attributions'][$langue][$num_nom][$champ.'.code'] = $projet.$ressource.$valeur;
787
			$this->table_retour['attributions'][$langue][$num_nom][$champ.'.href'] = $url;
789
			$this->table_retour['attributions'][$langue][$num_nom][$champ.'.href'] = $url;
788
		}
790
		}
789
		if (in_array($champ.'.code', $champs) !== false && isset($projet)) {
791
		if (in_array($champ.'.code', $champs) !== false && isset($projet)) {
790
			$this->table_retour['attributions'][$langue][$num_nom][$champ.'.code'] = $projet.$ressource.$valeur;
792
			$this->table_retour['attributions'][$langue][$num_nom][$champ.'.code'] = $projet.$ressource.$valeur;
791
		}
793
		}
792
		if (in_array($champ.'.href', $champs) !== false && isset($projet)) {
794
		if (in_array($champ.'.href', $champs) !== false && isset($projet)) {
793
			$this->table_retour['attributions'][$langue][$num_nom][$champ.'.href'] = $url;
795
			$this->table_retour['attributions'][$langue][$num_nom][$champ.'.href'] = $url;
794
		}
796
		}
795
		if (in_array($champ, $champs) !== false) {
797
		if (in_array($champ, $champs) !== false) {
796
			if (isset($url)) {
798
			if (isset($url)) {
797
				$this->table_retour['attributions'][$langue][$num_nom][$champ] = $this->chercherSignificationCode($url, $nom);
799
				$this->table_retour['attributions'][$langue][$num_nom][$champ] = $this->chercherSignificationCode($url, $nom);
798
			} else {
800
			} else {
799
				$this->table_retour['attributions'][$langue][$champ] = $valeur;
801
				$this->table_retour['attributions'][$langue][$champ] = $valeur;
800
			}
802
			}
801
		}
803
		}
802
	}
804
	}
803
 
805
 
804
	public function afficherLangue($nomChamp, $projet, $service, $valeur, $ressource = '', $nom = 'nom') {
806
	public function afficherLangue($nomChamp, $projet, $service, $valeur, $ressource = '', $nom = 'nom') {
805
		if ($this->retour_format == 'max') {
807
		if ($this->retour_format == 'max') {
806
				$this->table_retour['attributions'][$nomChamp] = $nom;
808
				$this->table_retour['attributions'][$nomChamp] = $nom;
807
				$this->table_retour['attributions'][$nomChamp.'.code'] = $projet.$ressource.$valeur;
809
				$this->table_retour['attributions'][$nomChamp.'.code'] = $projet.$ressource.$valeur;
808
				$this->table_retour['attributions'][$nomChamp.'.href'] = $url;
810
				$this->table_retour['attributions'][$nomChamp.'.href'] = $url;
809
		} else {
811
		} else {
810
			$this->table_retour['attributions'][$nomChamp.'.code'] = $projet.$ressource.$valeur;
812
			$this->table_retour['attributions'][$nomChamp.'.code'] = $projet.$ressource.$valeur;
811
		}
813
		}
812
	}
814
	}
813
 
815
 
814
	public function chargerBiblio($num_nom, $langue) {
816
	public function chargerBiblio($num_nom, $langue) {
815
		list($table, $version) = explode('_v',$this->table);
817
		list($table, $version) = explode('_v',$this->table);
816
		$requete = "SELECT b.*, lb.notes FROM nvjfl_lien_biblio_v$version lb, nvjfl_biblio_v$version b ".
818
		$requete = "SELECT b.*, lb.notes FROM nvjfl_lien_biblio_v$version lb, nvjfl_biblio_v$version b ".
817
					"WHERE b.num_ref = lb.num_ref AND lb.num_nom = '$num_nom' ;";
819
					"WHERE b.num_ref = lb.num_ref AND lb.num_nom = '$num_nom' ;";
818
		$resultat = $this->getBdd()->recupererTous($requete);
820
		$resultat = $this->getBdd()->recupererTous($requete);
819
 
821
 
820
		 if ($resultat == '') { //cas ou la requete comporte des erreurs
822
		 if ($resultat == '') { //cas ou la requete comporte des erreurs
821
		 	$r = 'La requête SQL formée comporte une erreur !!';
823
		 	$r = 'La requête SQL formée comporte une erreur !!';
822
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $r);
824
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $r);
823
			Debug::printr($requete);
825
			Debug::printr($requete);
824
		 } elseif ($resultat) {
826
		 } elseif ($resultat) {
825
			foreach ($resultat as $res) {
827
			foreach ($resultat as $res) {
826
			   	foreach ($res as $cle => $valeur) {
828
			   	foreach ($res as $cle => $valeur) {
827
			   		if ($valeur !== "") {
829
			   		if ($valeur !== "") {
828
			   			$this->table_retour['attributions'][$langue][$num_nom]['biblio.'.$cle] = $valeur;
830
			   			$this->table_retour['attributions'][$langue][$num_nom]['biblio.'.$cle] = $valeur;
829
			   		}
831
			   		}
830
			    }
832
			    }
831
			}
833
			}
832
		}
834
		}
833
	}
835
	}
834
 
836
 
835
}
837
}
836
?>
838
?>