source: spip-zone/_plugins_/taxonomie/trunk/taxonomie_fonctions.php @ 113719

Last change on this file since 113719 was 113719, checked in by eric@…, 4 months ago

Mise en cohérence du nom des caches Wikipédia.
Ajout d'une fonction et d'un formulaire de vidage des caches.

  • Property svn:eol-style set to native
File size: 11.7 KB
Line 
1<?php
2/**
3 * Ce fichier contient l'ensemble des fonctions implémentant l'API du plugin Taxonomie accessible depuis
4 * les squelettes.
5 *
6 */
7if (!defined('_ECRIRE_INC_VERSION')) {
8        return;
9}
10
11
12/**
13 * Charge tous les taxons d'un règne donné fourni dans le fichier ITIS, du règne lui-même jusqu'aux taxons de genre.
14 * Les nom communs anglais, français, espagnols, etc, peuvent aussi être chargés en complément mais
15 * ne couvrent pas l'ensemble des taxons.
16 * Le modifications effectuées manuellement sur ces taxons sont conservées.
17 *
18 * @package SPIP\TAXONOMIE\REGNE
19 *
20 * @api
21 * @filtre
22 *
23 * @uses regne_existe()
24 * @uses taxon_preserver()
25 * @uses regne_vider()
26 * @uses itis_read_hierarchy()
27 * @uses itis_find_language()
28 * @uses itis_read_vernaculars()
29 *
30 * @param string $regne
31 *        Nom scientifique du règne en lettres minuscules : `animalia`, `plantae`, `fungi`.
32 * @param array  $codes_langue
33 *        Tableau des codes des langues (au sens SPIP) à charger pour les noms communs des taxons.
34 *
35 * @return bool
36 *        `true` si le chargement a réussi, `false` sinon
37 */
38function regne_charger($regne, $codes_langue = array()) {
39
40        $retour = false;
41        $taxons_preserves = array();
42
43        // Vérifie si le règne existe bien dans la table spip_taxons
44        $regne_existe = regne_existe($regne, $meta_regne);
45        include_spip('inc/taxonomie');
46        if ($regne_existe) {
47                // Sauvegarde des taxons ayant été modifiés manuellement suite à leur création automatique.
48                $taxons_preserves = taxon_preserver($regne);
49
50                // Vider le règne avant de le recharger
51                regne_vider($regne);
52        }
53
54        // Lire le fichier json fournissant la hiérarchie des rangs du règne en cours de chargement.
55        $meta_regne = array();
56        include_spip('services/itis/itis_api');
57        $meta_regne['rangs']['hierarchie'] = itis_read_ranks($regne, $meta_regne['rangs']['sha']);
58
59        // Lecture de la hiérarchie des taxons à partir du fichier texte extrait de la base ITIS
60        $taxons = itis_read_hierarchy($regne, $meta_regne['rangs']['hierarchie'], $meta_regne['sha']);
61
62        // Ajout des noms communs extraits de la base ITIS dans la langue demandée
63        if ($taxons) {
64                $meta_regne['compteur'] = count($taxons);
65                $traductions = array();
66                foreach ($codes_langue as $_code_langue) {
67                        $langue = itis_find_language($_code_langue);
68                        if ($langue) {
69                                $noms = itis_read_vernaculars($langue, $sha_langue);
70                                if ($noms) {
71                                        $meta_regne['traductions']['itis'][$_code_langue]['sha'] = $sha_langue;
72                                        $nb_traductions_langue = 0;
73                                        foreach ($noms as $_tsn => $_nom) {
74                                                if (array_key_exists($_tsn, $taxons)) {
75                                                        // On ajoute les traductions qui sont de la forme [xx]texte
76                                                        // On sauvegarde le tsn concerné afin de clore les traductions
77                                                        // avec les balises multi et d'optimiser ainsi les traitements
78                                                        // sachant qu'il y a très peu de traductions comparées aux taxons
79                                                        $taxons[$_tsn]['nom_commun'] .= $_nom;
80                                                        $nb_traductions_langue += 1;
81                                                        $traductions[$_tsn] = $_tsn;
82                                                }
83                                        }
84                                        $meta_regne['traductions']['itis'][$_code_langue]['compteur'] = $nb_traductions_langue;
85                                }
86                        }
87                }
88
89                // Clore les traductions avec les balises multi
90                if ($traductions) {
91                        foreach ($traductions as $_tsn) {
92                                $taxons[$_tsn]['nom_commun'] = '<multi>' . $taxons[$_tsn]['nom_commun'] . '</multi>';
93                        }
94                }
95
96                // Ré-injection des modifications manuelles effectuées sur les taxons importés via le fichier ITIS du règne.
97                // -- descriptif, texte, sources: remplacement
98                // -- nom commun: merge en considérant que la mise à jour manuelle est prioritaire
99                // -- edite: positionné à 1, on conserve bien sur l'indicateur d'édition
100                if (!empty($taxons_preserves['edites'])) {
101                        foreach ($taxons_preserves['edites'] as $_taxon_edite) {
102                                if (($tsn = $_taxon_edite['tsn']) and (array_key_exists($tsn, $taxons))) {
103                                        $taxons[$tsn]['descriptif'] = $_taxon_edite['descriptif'];
104                                        $taxons[$tsn]['texte'] = $_taxon_edite['texte'];
105                                        $taxons[$tsn]['sources'] = $_taxon_edite['sources'];
106                                        $taxons[$tsn]['nom_commun'] = taxon_merger_traductions(
107                                                $_taxon_edite['nom_commun'],
108                                                $taxons[$tsn]['nom_commun']);
109                                        $taxons[$tsn]['edite'] = 'oui';
110                                }
111                        }
112                }
113
114                // On formate le taxon pour l'insertion en BD.
115                $taxons = array_values($taxons);
116
117                // Insertion dans la base de données
118                $retour = sql_insertq_multi('spip_taxons', $taxons);
119                if ($retour) {
120                        // Insérer les informations de chargement dans une meta propre au règne.
121                        // Ca permettra de tester l'utilité ou pas d'un rechargement du règne
122                        $meta_regne['maj'] = date('Y-m-d H:i:s');
123                        $meta_regne['fichier'] = "${regne}_genus.txt";
124
125                        // Mise à jour de la meta du règne.
126                        include_spip('inc/config');
127                        ecrire_config("taxonomie_$regne", $meta_regne);
128                }
129        }
130
131        return $retour;
132}
133
134
135/**
136 * Supprime de la base de données tous les taxons importés à partir du rapport hiérarchique d'un règne donné.
137 * La meta concernant les informations de chargement du règne est aussi effacée.
138 * Les modifications manuelles effectuées sur ces taxons sont effacées : elles doivent donc être préservées au préalable.
139 *
140 * @package SPIP\TAXONOMIE\REGNE
141 *
142 * @api
143 * @filtre
144 *
145 * @param string $regne
146 *        Nom scientifique du règne en lettres minuscules : `animalia`, `plantae`, `fungi`.
147 *
148 * @return bool
149 *        `true` si le vidage a réussi, `false` sinon
150 */
151function regne_vider($regne) {
152
153        $where = array('regne=' . sql_quote($regne), 'importe=' . sql_quote('oui'));
154        $retour = sql_delete('spip_taxons', $where);
155        if ($retour !== false) {
156                // Supprimer la meta propre au règne.
157                effacer_meta("taxonomie_$regne");
158                $retour = true;
159        }
160
161        return $retour;
162}
163
164
165/**
166 * Retourne l'existence ou pas d'un règne en base de données.
167 * La fonction scrute les taxons importés de la table `spip_taxons` et non la meta propre au règne.
168 *
169 * @package SPIP\TAXONOMIE\REGNE
170 *
171 * @api
172 * @filtre
173 *
174 * @param string $regne
175 *        Nom scientifique du règne en lettres minuscules : `animalia`, `plantae`, `fungi`.
176 * @param array  $meta_regne
177 *        Meta propre au règne, créée lors du chargement de celui-ci et retournée si le règne
178 *        existe.
179 *
180 * @return bool
181 *        `true` si le règne existe, `false` sinon.
182 */
183function regne_existe($regne, &$meta_regne) {
184
185        $meta_regne = array();
186        $existe = false;
187
188        $where = array('regne=' . sql_quote($regne), 'importe=' . sql_quote('oui'));
189        $retour = sql_countsel('spip_taxons', $where);
190        if ($retour) {
191                // Récupérer la meta propre au règne afin de la retourner.
192                include_spip('inc/config');
193                $meta_regne = lire_config("taxonomie_$regne");
194                $existe = true;
195        }
196
197        return $existe;
198}
199
200
201/**
202 * Fournit l'ascendance taxonomique d'un taxon donné, par consultation dans la base de données.
203 *
204 * @package SPIP\TAXONOMIE\TAXON
205 *
206 * @api
207 * @filtre
208 *
209 * @param int    $id_taxon
210 *        Id du taxon pour lequel il faut fournir l'ascendance.
211 * @param int    $tsn_parent
212 *        TSN du parent correspondant au taxon id_taxon. Ce paramètre permet d'optimiser le traitement
213 *        mais n'est pas obligatoire. Si il n'est pas connu lors de l'appel il faut passer `null`.
214 * @param string $ordre
215 *        Classement de la liste des taxons : `descendant`(défaut) ou `ascendant`.
216 *
217 * @return array
218 *        Liste des taxons ascendants. Chaque taxon est un tableau associatif contenant les informations
219 *        suivantes : `id_taxon`, `tsn_parent`, `nom_scientifique`, `nom_commun`, `rang`, `statut` et l'indicateur
220 *        d'espèce `espèce`.
221 */
222function taxon_informer_ascendance($id_taxon, $tsn_parent = null, $ordre = 'descendant') {
223
224        $ascendance = array();
225
226        // Si on ne passe pas le tsn du parent correspondant au taxon pour lequel on cherche l'ascendance
227        // alors on le cherche en base de données.
228        // Le fait de passer ce tsn parent est uniquement une optimisation.
229        if (is_null($tsn_parent)) {
230                $tsn_parent = sql_getfetsel('tsn_parent', 'spip_taxons', 'id_taxon=' . intval($id_taxon));
231        }
232
233        while ($tsn_parent > 0) {
234                $select = array('id_taxon', 'tsn_parent', 'nom_scientifique', 'nom_commun', 'rang_taxon', 'statut', 'espece');
235                $where = array('tsn=' . intval($tsn_parent));
236                $taxon = sql_fetsel($select, 'spip_taxons', $where);
237                if ($taxon) {
238                        $ascendance[] = $taxon;
239                        $tsn_parent = $taxon['tsn_parent'];
240                }
241        }
242
243        if ($ascendance and ($ordre == 'descendant')) {
244                $ascendance = array_reverse($ascendance);
245        }
246
247        return $ascendance;
248}
249
250
251/**
252 * Fournit les phrases de crédit des sources d'information ayant permis de compléter le taxon.
253 * La référence ITIS n'est pas répétée dans le champ `sources` de chaque taxon car elle est
254 * à la base de chaque règne. Elle est donc insérée par la fonction.
255 *
256 * @package SPIP\TAXONOMIE\TAXON
257 *
258 * @api
259 * @filtre
260 *
261 * @param int    $id_taxon
262 *        Id du taxon pour lequel il faut fournir les crédits
263 * @param string $sources_specifiques
264 *        Tableau sérialisé des sources possibles autres qu'ITIS (CINFO, WIKIPEDIA...) telles qu'enregistrées
265 *        en base de données dans le champ `sources`.
266 *        Ce paramètre permet d'optimiser le traitement mais n'est pas obligatoire.
267 *
268 * @return array
269 *        Tableau des phrases de crédits indexées par source.
270 */
271function taxon_crediter($id_taxon, $sources_specifiques = null) {
272
273        $sources = array();
274
275        // Si on ne passe pas les sources du taxon concerné alors on le cherche en base de données.
276        // Le fait de passer ce champ sources est uniquement une optimisation.
277        if (is_null($sources_specifiques)) {
278                $sources_specifiques = sql_getfetsel('sources', 'spip_taxons', 'id_taxon=' . intval($id_taxon));
279        }
280
281        // On merge ITIS et les autres sources
282        $liste_sources = array('itis' => array());
283        if ($sources_specifiques) {
284                $liste_sources = array_merge($liste_sources, unserialize($sources_specifiques));
285        }
286
287        // Puis on construit la liste des sources pour l'affichage
288        foreach ($liste_sources as $_service => $_infos_source) {
289                include_spip("services/${_service}/${_service}_api");
290                if (function_exists($citer = "${_service}_credit")) {
291                        $sources[$_service] = $citer($id_taxon, $_infos_source);
292                }
293        }
294
295        return $sources;
296}
297
298
299/**
300 * Affiche la puce de statut d'un taxon sans proposer le formulaire de changement de statut.
301 *
302 * @package SPIP\TAXONOMIE\TAXON
303 *
304 * @api
305 * @filtre
306 *
307 * @param string $statut
308 *        Statut du taxon, `prop`, `publie`ou `poubelle`.
309 * @param int    $id_taxon
310 *        Id du taxon.
311 *
312 * @return array
313 *        Image de la puce.
314 */
315function taxon_afficher_statut($statut, $id_taxon = 0) {
316
317        // On évite de charger la fonction n fois.
318        static $afficher_puce = null;
319
320        if (!$afficher_puce) {
321                // Chargement de la fonction d'affichage
322                $afficher_puce = charger_fonction('puce_statut', 'inc');
323        }
324
325        // On affiche la puce sans proposer le formulaire rapide de changement de statut qui pose un problème avec
326        // l'ajax sachant qu'un changement peut en provoquer d'autres, la liste n'est plus à jour.
327        $puce = $afficher_puce($id_taxon, $statut, 0, 'taxon', false, false);
328
329        return $puce;
330}
331
332
333/**
334 * Renvoie la liste des services de taxonomie utilisés par le plugin en tenant compte de la configuration
335 * choisi par le webmestre.
336 *
337 * @package SPIP\TAXONOMIE\TAXON
338 *
339 * @api
340 * @filtre
341 *
342 * @return array
343 *        Tableau des services utilisés sous la forme [alias] = titre du service.
344 */
345function taxon_lister_services() {
346
347        // On initialise la liste avec le service ITOS qui est toujours utilisé.
348        $services = array('itis');
349
350        // On lit la configuration pour voir quels autres services sont autorisés à l'utilisation
351        include_spip('inc/config');
352        $services = array_flip(array_merge($services, lire_config('taxonomie/services_utilises')));
353
354        // On met à jour la liste avec le titre de chaque service
355        foreach ($services as $_service => $_index) {
356                $services[$_service] = _T("taxonomie:label_service_${_service}");
357        }
358
359        return $services;
360}
Note: See TracBrowser for help on using the repository browser.