Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

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