source: spip-zone/_plugins_/taxonomie/trunk/formulaires/decrire_taxon.php @ 109441

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

On charge maintenant le nom scientifique tel qu'il est écrit dans ITIS avec les majuscules qu'il faut. Cela simplifie l'affichage en CSS et aussi le traitement des indicateurs hybride ou autre.

  • Property svn:eol-style set to native
File size: 9.3 KB
Line 
1<?php
2/**
3 * Gestion du formulaire de chargement du descriptif d'un taxon à partir de Wikipedia.
4 *
5 * @package    SPIP\TAXONOMIE\TAXON
6 */
7
8if (!defined("_ECRIRE_INC_VERSION")) return;
9
10/**
11 * Chargement des données : le formulaire récupère une page wikipedia pour le descriptif du taxon.
12 * Le formulaire propose ce descriptif mais aussi une liste d'autres pages qui matchent avec le taxon.
13 *
14 * @uses wikipedia_get_page()
15 * @uses convertisseur_texte_spip()
16 *
17 * @return array
18 *              Tableau des données à charger par le formulaire (affichage). Aucune donnée chargée n'est un
19 *              champ de saisie, celle-ci sont systématiquement remises à zéro.
20 *              - `_langues`        : tableau des noms de langue utilisables indexé par le code de langue SPIP (étape 1).
21 *              - `_langue_defaut` : code de langue SPIP par défaut (étape 1).
22 *              - `langue`         : code de langue SPIP choisi lors de l'étape 1
23 *              - `_liens`         : liste des liens possibles pour la recherche (étape 2)
24 *              - `_lien_defaut`   : lien par défaut (étape 2)
25 *              - `_descriptif`    : texte de la page trouvée ou choisie par l'utilisateur (étape 2)
26 *              - `_etapes`        : nombre d'étapes du formaulaire, à savoir, 2.
27 */
28function formulaires_decrire_taxon_charger($id_taxon) {
29
30        // Initialisation du chargement.
31        $valeurs = array();
32
33        // Langue choisie pour la page wikipedia.
34        $valeurs['langue'] = _request('langue');
35
36        // Déterminer si un descriptif existe pour une langue donnée.
37        include_spip('inc/filtres');
38        $traductions = array();
39        if ($descriptif = sql_getfetsel('descriptif', 'spip_taxons', array('id_taxon=' . sql_quote($id_taxon)))) {
40                $descriptif = trim($descriptif);
41                if (preg_match(_EXTRAIRE_MULTI, $descriptif, $match)) {
42                        $descriptif = trim($match[1]);
43                }
44                $traductions = extraire_trads($descriptif);
45        }
46
47        // Liste des langues utilisées par le plugin.
48        include_spip('inc/config');
49        $langues_utilisees = lire_config('taxonomie/langues_utilisees');
50        foreach ($langues_utilisees as $_code_langue) {
51                $valeurs['_langues'][$_code_langue] = traduire_nom_langue($_code_langue);
52                if ($traductions and array_key_exists($_code_langue, $traductions)) {
53                        $valeurs['_langues'][$_code_langue] .= ' (' . _T('taxonomie:info_descriptif_existe') .')';
54                }
55        }
56
57        // Langue par défaut: soit la langue en cours si elle existe dans la liste des langues utilisées, soit la
58        // première de cette même liste.
59        $langue_spip = !empty($GLOBALS['lang']) ? $GLOBALS['lang'] : $GLOBALS['spip_lang'];
60        if (array_key_exists($langue_spip, $valeurs['_langues'])) {
61                $valeurs['_langue_defaut'] = $langue_spip;
62        } else {
63                reset($valeurs['_langues']);
64                $valeurs['_langue_defaut'] = key($valeurs['_langues']);
65        }
66
67        // Initialisation des paramètres du formulaire utilisés en étape 2 et mis à jour dans la vérification
68        // de l'étape 1.
69        $valeurs['_descriptif'] = _request('_descriptif');
70        $valeurs['_liens'] = _request('_liens');
71        $valeurs['_lien_defaut'] = _request('_lien_defaut');
72
73        // Préciser le nombre d'étapes du formulaire
74        $valeurs['_etapes'] = 2;
75
76        return $valeurs;
77}
78
79/**
80 * Vérification de l'étape 1 du formulaire : si une langue est choisie, on charge la page recherchée et les liens
81 * vers les autres pages éventuelles. Si aucun page n'est disponible on renvoie un message d'erreur.
82 *
83 * @uses wikipedia_get_page()
84 * @uses convertisseur_texte_spip()
85 *
86 * @return array
87 *              Message d'erreur si aucune page n'est disponible ou chargement des champs utiles à l'étape 2 sinon.
88 *      Ces champs sont :
89 *              - `_liens`         : liste des liens possibles pour la recherche (étape 2)
90 *              - `_lien_defaut`   : lien par défaut (étape 2)
91 *              - `_descriptif`    : texte de la page trouvée ou choisie par l'utilisateur (étape 2)
92 */
93function formulaires_decrire_taxon_verifier_1($id_taxon) {
94
95        // Initialisation des erreurs de vérification.
96        $erreurs = array();
97
98        // Si on a déjà choisi une langue, on peut accéder à Wikipedia avec le nom scientifique et retourner
99        // les pages trouvées (étape 2).
100        if ($langue = _request('langue')) {
101                $valeurs = array();
102
103                // Récupération des informations de base du taxon
104                $select = array('tsn', 'nom_scientifique');
105                $where = array('id_taxon=' . sql_quote($id_taxon));
106                $taxon = sql_fetsel($select, 'spip_taxons', $where);
107
108                // Récupération d'une page wikipedia matchant avec le nom scientifique du taxon.
109                // L'API renvoie aussi d'autres pages qui peuvent potentiellement être plus pertinentes.
110                include_spip('services/wikipedia/wikipedia_api');
111                $recherche = array('name' => $taxon['nom_scientifique'], 'tsn' => $taxon['tsn']);
112                $information = wikipedia_get_page($recherche, $langue);
113
114                // On convertit le descriptif afin de visualiser un texte plus clair.
115                $valeurs['_descriptif'] = '';
116                if (!empty($information['text'])) {
117                        // Si le plugin Convertisseur est actif, conversion du texte mediawiki vers SPIP.
118                        // Mise en format multi systématique.
119                        include_spip('inc/filtres');
120                        $convertir = chercher_filtre('convertisseur_texte_spip');
121                        $valeurs['_descriptif'] = $convertir ? $convertir($information['text'], 'MediaWiki_SPIP') : $information['text'];
122
123                        // On prépare la liste des choix possibles si le texte récupéré n'est pas le bon.
124                        $valeurs['_liens'] = array();
125                        $valeurs['_liens'][$taxon['nom_scientifique']] = _T('taxonomie:label_wikipedia_alternative_defaut');
126                        if (!empty($information['links'])) {
127                                foreach ($information['links'] as $_liens) {
128                                        $valeurs['_liens'][$_liens['title']] = _T('taxonomie:label_wikipedia_alternative', array('alternative' => $_liens['title']));
129                                }
130                        }
131                        $valeurs['_lien_defaut'] = $taxon['nom_scientifique'];
132
133                        // On fournit ces informations au formulaire pour l'étape 2.
134                        foreach ($valeurs as $_champ => $_valeur) {
135                                set_request($_champ, $_valeur);
136                        }
137                } else {
138                        $erreurs['message_erreur'] = _T('taxonomie:erreur_wikipedia_descriptif');
139                }
140        }
141
142        return $erreurs;
143}
144
145
146/**
147 * Exécution du formulaire : si une page est choisie et existe le descriptif est inséré dans le taxon concerné
148 * et le formulaire renvoie sur la page d'édition du taxon.
149 *
150 * @uses wikipedia_get_page()
151 * @uses convertisseur_texte_spip()
152 * @uses taxon_merger_traductions()
153 *
154 * @return array
155 *              Tableau retourné par le formulaire contenant toujours un message de bonne exécution ou
156 *              d'erreur. L'indicateur editable est toujours à vrai.
157 */
158function formulaires_decrire_taxon_traiter($id_taxon) {
159        $retour = array();
160
161        // Initialisation des saisies.
162        $langue = _request('langue');
163        $choix_descriptif = _request('choix_descriptif');
164
165        // Récupération des informations de base du taxon
166        $select = array('tsn', 'nom_scientifique', 'edite', 'descriptif', 'sources');
167        $where = array('id_taxon=' . sql_quote($id_taxon));
168        $taxon = sql_fetsel($select, 'spip_taxons', $where);
169
170        // Récupération de la page wikipedia choisie:
171        include_spip('services/wikipedia/wikipedia_api');
172        if (strtolower($choix_descriptif) == strtolower($taxon['nom_scientifique'])) {
173                // Le descriptif déjà fourni par défaut est le bon. On ne met pas à jour le cache.
174                $recherche = array('name' => $taxon['nom_scientifique'], 'tsn' => $taxon['tsn']);
175                $information = wikipedia_get_page($recherche, $langue);
176        } else {
177                // On a choisit une autre page que celle par défaut : on recharge le cache avec la nouvelle recherche.
178                $recherche = array('name' => $choix_descriptif, 'tsn' => $taxon['tsn']);
179                $information = wikipedia_get_page($recherche, $langue, null, array('reload' => true));
180        }
181
182        // On convertit le descriptif afin de proposer un texte plus clair.
183        if (!empty($information['text'])) {
184                // Si le plugin Convertisseur est actif, conversion du texte mediawiki vers SPIP.
185                include_spip('inc/filtres');
186                $convertir = chercher_filtre('convertisseur_texte_spip');
187                $texte_converti = $convertir ? $convertir($information['text'], 'MediaWiki_SPIP') : $information['text'];
188
189                // Mise en format multi systématique et limitation de la chaîne en fonction du nombre de langues utilisées.
190                include_spip('inc/config');
191                $langues_utilisees = lire_config('taxonomie/langues_utilisees');
192                $limite_texte = floor(65535 / (count($langues_utilisees) + 1));
193                $texte_converti = '<multi>'
194                                                  . '[' . $langue . ']'
195                                                  . substr($texte_converti, 0, $limite_texte)
196                                                  . '</multi>';
197                // Mise à jour pour le taxon du descriptif et des champs connexes en base de données
198                $maj = array();
199                // - le texte du descriptif est inséré dans la langue choisie en mergeant avec l'existant
200                //   si besoin. On limite la taille du descriptif pour éviter un problème lors de l'update
201                include_spip('inc/taxonomie');
202                $maj['descriptif'] = taxon_merger_traductions($texte_converti, $taxon['descriptif']);
203                // - l'indicateur d'édition est positionné à oui
204                $maj['edite'] = 'oui';
205                // - la source wikipedia est ajoutée (ou écrasée si elle existe déjà)
206                $maj['sources'] = array('wikipedia' => array('champs' => array('descriptif')));
207                if ($sources = unserialize($taxon['sources'])) {
208                        $maj['sources'] = array_merge($maj['sources'], $sources);
209                }
210                $maj['sources'] = serialize($maj['sources']);
211                // - Mise à jour
212                sql_updateq('spip_taxons', $maj, 'id_taxon=' . sql_quote($id_taxon));
213
214                // Redirection vers la page d'édition du taxon
215                $retour['redirect'] = parametre_url(generer_url_ecrire('taxon_edit'), 'id_taxon', $id_taxon);
216        } else {
217                $retour['message_erreur'] = _T('taxonomie:erreur_wikipedia_descriptif');
218        }
219
220        return $retour;
221}
Note: See TracBrowser for help on using the repository browser.