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

Last change on this file since 87576 was 87576, checked in by eric@…, 5 years ago

Distinction phylum et division lors de la lecture du fichier des taxons d'un règne.

  • Property svn:eol-style set to native
File size: 6.5 KB
Line 
1<?php
2/**
3 * Ce fichier contient l'ensemble fonctions implémentant l'API du plugin Taxonomie.
4 *
5 * @package SPIP\TAXONOMIE\API
6 */
7
8if (!defined("_ECRIRE_INC_VERSION")) return;
9
10/**
11 * Chargement de tous les taxons d'un règne donné, du règne lui-même aux taxons de genre au maximum.
12 * La fonction permet aussi de choisir un rang taxonomique feuille différent du genre.
13 * Les nom communs anglais et français peuvent aussi être chargés en complément mais
14 * ne couvrent pas l'ensemble des taxons.
15 *
16 * @api
17 * @filtre
18 *
19 * @param string        $regne
20 *              Nom scientifique du règne en lettres minuscules (animalia, plantae, fungi)
21 * @param string        $rang
22 *              Rang taxonomique minimal jusqu'où charger le règne. Ce rang est fourni en anglais et
23 *              correspond à : phylum, class, order, family, genus.
24 * @param array         $langues
25 *              Tableau des codes (au sens SPIP) des langues à charger pour les noms communs des taxons
26 *
27 * @return bool|string
28 *              Retour true/false
29 */
30function taxonomie_charger_regne($regne, $rang, $langues=array('fr')) {
31        $retour = false;
32        $meta_regne = array();
33
34        // Lecture de la hiérarchie des taxons à partir du fichier texte extrait de la base ITIS
35        include_spip('services/itis/itis_api');
36        $taxons = itis_read_hierarchy($regne, $rang, $meta_regne['sha']);
37
38        // Ajout des noms communs extraits de la base ITIS dans la langue demandée
39        if ($taxons) {
40                $meta_regne['compteur'] = count($taxons);
41                foreach ($langues as $_cle => $_langue) {
42                        $prefixe = ($_cle == count($langues)-1) ? '<multi>' : '';
43                        $suffixe = ($_cle == count($langues)-1) ? '</multi>' : '';
44                        $noms = itis_read_vernaculars($_langue, $sha_langue);
45                        if ($noms) {
46                                $meta_regne['langues'][$_langue]['sha'] = $sha_langue;
47                                $nb_traductions = 0;
48                                foreach ($noms as $_tsn => $_nom) {
49                                        if (array_key_exists($_tsn, $taxons)) {
50                                                $taxons[$_tsn]['nom_commun'] = $prefixe . $taxons[$_tsn]['nom_commun'] . $_nom . $suffixe;
51                                                $nb_traductions += 1;
52                                        }
53                                }
54                                $meta_regne['langues'][$_langue]['compteur'] = $nb_traductions;
55                        }
56                }
57
58                // Insertion dans la base de données
59                $retour = sql_insertq_multi('spip_taxons', array_values($taxons));
60                if ($retour) {
61                        // Insérer les sha dans une meta propre au règne.
62                        // Ca permettra de tester l'utilité ou pas d'un rechargement du règne
63                        $meta_regne['rang'] = $rang;
64                        $meta_regne['maj'] = date('Y-m-d H:i:s');
65                        ecrire_meta("taxonomie_$regne", serialize($meta_regne));
66                }
67        }
68
69        return $retour;
70}
71
72
73/**
74 * Suppression de tous les taxons d'un règne donné de la base de données.
75 * La meta concernant les informations de chargement du règne est aussi effacée.
76 *
77 * @api
78 * @filtre
79 *
80 * @param string        $regne
81 *              Nom scientifique du règne en lettres minuscules (animalia, plantae, fungi)
82 *
83 * @return bool
84 *              Retour true/false
85 */
86function taxonomie_vider_regne($regne) {
87        $retour = sql_delete('spip_taxons', 'regne=' . sql_quote($regne));
88        if ($retour !== false) {
89                // Supprimer la meta propre au règne.
90                effacer_meta("taxonomie_$regne");
91                $retour = true;
92        }
93
94        return $retour;
95}
96
97
98/**
99 * Interrogation sur l'existence ou pas d'un règne en base de données.
100 * La fonction scrute la table spip_taxons et non la meta propre au règne.
101 *
102 * @api
103 * @filtre
104 *
105 * @param string        $regne
106 *              Nom scientifique du règne en lettres minuscules (animalia, plantae, fungi)
107 *
108 * @return bool
109 */
110function taxonomie_regne_existe($regne, &$meta_regne) {
111        $meta_regne = array();
112        $existe = false;
113
114        $retour = sql_countsel('spip_taxons', 'regne=' . sql_quote($regne));
115        if ($retour) {
116                // Supprimer la meta propre au règne.
117                include_spip('inc/config');
118                $meta_regne = lire_config("taxonomie_$regne");
119                $existe = true;
120        }
121
122        return $existe;
123}
124
125
126/**
127 * Fourniture de l'ascendance taxonomique d'un taxon donné.
128 *
129 * @api
130 * @filtre
131 *
132 * @param int   $id_taxon
133 *              Id du taxon pour lequel il faut fournir l'ascendance
134 * @param int   $tsn_parent
135 *      TSN du parent correspondant au taxon id_taxon. Ce paramètre permet d'optimiser le traitement
136 *              mais n'est pas obligatoire.
137 *
138 * @return array
139 */
140function taxonomie_informer_ascendance($id_taxon, $tsn_parent=null, $ordre='descendant') {
141        $ascendance = array();
142
143        // Si on ne passe pas le tsn du parent correspondant au taxon pour lequel on cherche l'ascendance
144        // alors on le cherche en base de données.
145        // Le fait de passer ce tsn parent est uniquement une optimisation.
146        if (is_null($tsn_parent)) {
147                $tsn_parent = sql_getfetsel('tsn_parent', 'spip_taxons', 'id_taxon=' . intval($id_taxon));
148        }
149
150        while ($tsn_parent > 0) {
151                $select = array('id_taxon', 'tsn_parent', 'nom_scientifique', 'nom_commun', 'rang');
152                $where = array('tsn=' . intval($tsn_parent));
153                $taxon = sql_fetsel($select, 'spip_taxons', $where);
154                if ($taxon) {
155                        $ascendance[] = $taxon;
156                        $tsn_parent = $taxon['tsn_parent'];
157                }
158        }
159
160        if ($ascendance
161        AND ($ordre == 'descendant'))
162                $ascendance = array_reverse($ascendance);
163
164        return $ascendance;
165}
166
167
168/**
169 * Fourniture des sources d'information ayant permis de compléter le taxon.
170 * La référence ITIS n'est pas répétée dans le champ sources de chaque taxon car elle est
171 * à la base de chaque règne. Elle est donc insérée par la fonction elle-même.
172 *
173 * @api
174 * @filtre
175 *
176 * @param int           $id_taxon
177 *              Id du taxon pour lequel il faut fournir l'ascendance
178 * @param string        $sources_specifiques
179 *              Tableau sérialisé des identifiants des sources possibles autres qu'ITIS (CINFO, WIKIPEDIA...).
180 *              Ce paramètre permet d'optimiser le traitement mais n'est pas obligatoire.
181 *
182 * @return array
183 */
184function taxonomie_informer_sources($id_taxon, $sources_specifiques=null) {
185        $sources = array();
186
187        // Si on ne passe pas les sources du taxon concerné alors on le cherche en base de données.
188        // Le fait de passer ce champ sources est uniquement une optimisation.
189        if (is_null($sources_specifiques)) {
190                $sources_specifiques = sql_getfetsel('sources', 'spip_taxons', 'id_taxon=' . intval($id_taxon));
191        }
192
193        // On merge ITIS et les autres sources
194        $liste_sources = array('itis' => '');
195        if ($sources_specifiques) {
196                $liste_sources = array_merge($liste_sources, unserialize($sources_specifiques));
197        }
198
199        // Puis on construit le fichier
200        foreach ($liste_sources as $_source => $_champs) {
201                include_spip("services/${_source}/${_source}_api");
202                if (function_exists($citer = "${_source}_citation")) {
203                        $sources[$_source] = array(
204                                'texte' => $citer(),
205                                'champs' => $_champs
206                        );
207                }
208        }
209
210        return $sources;
211}
212
213function taxonomie_informer($recherche, $section='') {
214        include_spip('services/wikipedia/wikipedia_api');
215        return wikipedia_get($recherche, $section);
216}
217
218?>
Note: See TracBrowser for help on using the repository browser.