Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

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