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

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

Préservation des taxons créés lors de l'ajout d'une espèce (taxons non importés).

  • Property svn:eol-style set to native
File size: 9.6 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é, 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 *
17 * @package SPIP\TAXONOMIE\REGNE
18 *
19 * @api
20 * @filtre
21 *
22 * @uses regne_existe()
23 * @uses taxon_preserver()
24 * @uses regne_vider()
25 * @uses itis_read_hierarchy()
26 * @uses itis_find_language()
27 * @uses itis_read_vernaculars()
28 *
29 * @param string $regne
30 *        Nom scientifique du règne en lettres minuscules : `animalia`, `plantae`, `fungi`.
31 * @param array  $codes_langue
32 *        Tableau des codes des langues (au sens SPIP) à charger pour les noms communs des taxons.
33 *
34 * @return bool
35 *        `true` si le chargement a réussi, `false` sinon
36 */
37function regne_charger($regne, $codes_langue = array()) {
38
39        $retour = false;
40        $taxons_preserves = array();
41
42        // Vérifie si le règne existe bien dans la table spip_taxons
43        $regne_existe = regne_existe($regne, $meta_regne);
44        include_spip('inc/taxonomie');
45        if ($regne_existe) {
46                // Sauvegarde des taxons ayant été modifiés manuellement suite à leur création automatique.
47                $taxons_preserves = taxon_preserver($regne);
48
49                // Vider le règne avant de le recharger
50                regne_vider($regne);
51        }
52
53        // Lire le fichier json fournissant la hiérarchie des rangs du règne en cours de chargement.
54        $meta_regne = array();
55        include_spip('services/itis/itis_api');
56        $meta_regne['rangs']['hierarchie'] = itis_read_ranks($regne, $meta_regne['rangs']['sha']);
57
58        // Lecture de la hiérarchie des taxons à partir du fichier texte extrait de la base ITIS
59        $taxons = itis_read_hierarchy($regne, $meta_regne['rangs']['hierarchie'], $meta_regne['sha']);
60
61        // Ajout des noms communs extraits de la base ITIS dans la langue demandée
62        if ($taxons) {
63                $meta_regne['compteur'] = count($taxons);
64                $traductions = array();
65                foreach ($codes_langue as $_code_langue) {
66                        $langue = itis_find_language($_code_langue);
67                        if ($langue) {
68                                $noms = itis_read_vernaculars($langue, $sha_langue);
69                                if ($noms) {
70                                        $meta_regne['traductions']['itis'][$_code_langue]['sha'] = $sha_langue;
71                                        $nb_traductions_langue = 0;
72                                        foreach ($noms as $_tsn => $_nom) {
73                                                if (array_key_exists($_tsn, $taxons)) {
74                                                        // On ajoute les traductions qui sont de la forme [xx]texte
75                                                        // On sauvegarde le tsn concerné afin de clore les traductions
76                                                        // avec les balises multi et d'optimiser ainsi les traitements
77                                                        // sachant qu'il y a très peu de traductions comparées aux taxons
78                                                        $taxons[$_tsn]['nom_commun'] .= $_nom;
79                                                        $nb_traductions_langue += 1;
80                                                        $traductions[$_tsn] = $_tsn;
81                                                }
82                                        }
83                                        $meta_regne['traductions']['itis'][$_code_langue]['compteur'] = $nb_traductions_langue;
84                                }
85                        }
86                }
87
88                // Clore les traductions avec les balises multi
89                if ($traductions) {
90                        foreach ($traductions as $_tsn) {
91                                $taxons[$_tsn]['nom_commun'] = '<multi>' . $taxons[$_tsn]['nom_commun'] . '</multi>';
92                        }
93                }
94
95                // Ré-injection des modifications manuelles effectuées sur les taxons importés via le fichier ITIS du règne.
96                // -- descriptif: remplacement
97                // -- nom commun: merge en considérant que la mise à jour manuelle est prioritaire
98                // -- edite: oui, on conserve bien sur l'indicateur d'édition
99                if ($taxons_preserves['edites']) {
100                        foreach ($taxons_preserves['edites'] as $_taxon_edite) {
101                                if (($tsn = $_taxon_edite['tsn']) and (array_key_exists($tsn, $taxons))) {
102                                        $taxons[$tsn]['descriptif'] = $_taxon_edite['descriptif'];
103                                        $taxons[$tsn]['nom_commun'] = taxon_merger_traductions(
104                                                $_taxon_edite['nom_commun'],
105                                                $taxons[$tsn]['nom_commun']);
106                                        $taxons[$tsn]['edite'] = 'oui';
107                                }
108                        }
109                }
110
111                // On formate le taxon pour l'insertion en BD.
112                $taxons = array_values($taxons);
113
114                // Ré-injection des taxons créés lors de l'ajout d'une espèce et donc jamais importés via le fichier ITIS
115                // du règne.
116                if ($taxons_preserves['crees']) {
117                        $taxons = array_merge($taxons, $taxons_preserves['crees']);
118                }
119
120                // Insertion dans la base de données
121                $retour = sql_insertq_multi('spip_taxons', $taxons);
122                if ($retour) {
123                        // Insérer les informations de chargement dans une meta propre au règne.
124                        // Ca permettra de tester l'utilité ou pas d'un rechargement du règne
125                        $meta_regne['maj'] = date('Y-m-d H:i:s');
126
127                        // Mise à jour de la meta du règne.
128                        include_spip('inc/config');
129                        ecrire_config("taxonomie_$regne", $meta_regne);
130                }
131        }
132
133        return $retour;
134}
135
136
137/**
138 * Supprime tous les taxons d'un règne donné de la base de données.
139 * La meta concernant les informations de chargement du règne est aussi effacée.
140 * Les modifications manuelles effectuées sur les taxons du règne sont perdues, elles
141 * doivent donc être préservées au préalable.
142 *
143 * @package SPIP\TAXONOMIE\REGNE
144 *
145 * @api
146 * @filtre
147 *
148 * @param string $regne
149 *        Nom scientifique du règne en lettres minuscules : `animalia`, `plantae`, `fungi`.
150 *
151 * @return bool
152 *        `true` si le vidage a réussi, `false` sinon
153 */
154function regne_vider($regne) {
155
156        $retour = sql_delete('spip_taxons', 'regne=' . sql_quote($regne));
157        if ($retour !== false) {
158                // Supprimer la meta propre au règne.
159                effacer_meta("taxonomie_$regne");
160                $retour = true;
161        }
162
163        return $retour;
164}
165
166
167/**
168 * Retourne l'existence ou pas d'un règne en base de données.
169 * La fonction scrute la table `spip_taxons` et non la meta propre au règne.
170 *
171 * @package SPIP\TAXONOMIE\REGNE
172 *
173 * @api
174 * @filtre
175 *
176 * @param string $regne
177 *        Nom scientifique du règne en lettres minuscules : `animalia`, `plantae`, `fungi`.
178 * @param array  $meta_regne
179 *        Meta propre au règne, créée lors du chargement de celui-ci et retournée si le règne
180 *        existe.
181 *
182 * @return bool
183 *        `true` si le règne existe, `false` sinon.
184 */
185function regne_existe($regne, &$meta_regne) {
186
187        $meta_regne = array();
188        $existe = false;
189
190        $retour = sql_countsel('spip_taxons', 'regne=' . sql_quote($regne));
191        if ($retour) {
192                // Récupérer la meta propre au règne afin de la retourner.
193                include_spip('inc/config');
194                $meta_regne = lire_config("taxonomie_$regne");
195                $existe = true;
196        }
197
198        return $existe;
199}
200
201
202/**
203 * Fournit l'ascendance taxonomique d'un taxon donné par consultation dans la base de données.
204 *
205 * @package SPIP\TAXONOMIE\TAXON
206 *
207 * @api
208 * @filtre
209 *
210 * @param int    $id_taxon
211 *        Id du taxon pour lequel il faut fournir l'ascendance.
212 * @param int    $tsn_parent
213 *        TSN du parent correspondant au taxon id_taxon. Ce paramètre permet d'optimiser le traitement
214 *        mais n'est pas obligatoire. Si il n'est pas connu lors de l'appel il faut passer `null`.
215 * @param string $ordre
216 *        Classement de la liste des taxons : `descendant`(défaut) ou `ascendant`.
217 *
218 * @return array
219 *        Liste des taxons ascendants. Chaque taxon est un tableau associatif contenant les informations
220 *        suivantes : `id_taxon`, `tsn_parent`, `nom_scientifique`, `nom_commun`, `rang`.
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');
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}
Note: See TracBrowser for help on using the repository browser.