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

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

Refactoring complet du plugin suite au merge des tables spip_taxons et spip_especes. Tout n'est pas encore revenu à) l'état de la version 0.2.0

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