Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

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