Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

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