source: spip-zone/_plugins_/taxonomie/trunk/formulaires/creer_espece.php @ 109246

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

Finalisation des 3 étapes du formulaire de création d'une espèce.
Il reste le traitement final à coder.
Mise au point des css pour gérer les nom scientifiques dans une balise inline ou pas.

  • Property svn:eol-style set to native
File size: 12.4 KB
Line 
1<?php
2/**
3 * Gestion du formulaire de création d'une espèce.
4 *
5 * @package    SPIP\TAXONOMIE\ESPECE
6 */
7if (!defined('_ECRIRE_INC_VERSION')) {
8        return;
9};
10
11
12/**
13 * Chargement des données :
14 *
15 * @uses taxonomie_regne_existe()
16 *
17 * @return array
18 *              Tableau des données à charger par le formulaire dans l'étape 1.
19 *      - `type_recherche`         : (saisie) type de la recherche par nom scientifique (`scientificname`)
20 *                                   ou nom commun (`commonname`).
21 *              - `recherche`              : (saisie) texte de la recherche.
22 *              - `correspondance`         : (saisie) indique si on doit rechercher le texte exact ou pas.
23 *              - `regne`                  : (saisie) règne d'appartenance de l'espèce pour limiter le scope de recherche.
24 *              - `_types_recherche`       : (affichage) recherche par nom scientifique ou par nom commun.
25 *              - `_type_recherche_defaut` : (affichage) le type de recherche par défaut est toujours `nom_scientifique`.
26 *              - `_regnes`                : (affichage) liste des règnes déjà chargés dans la base de taxonomie.
27 *              - `_regne_defaut`          : (affichage) le règne par défaut qui est toujours le premier de la liste.
28 *              - `_etapes`                : (affichage) nombre d'étapes du formulaire, à savoir, 3.
29 */
30function formulaires_creer_espece_charger() {
31
32        // Initialisation du chargement.
33        $valeurs = array();
34
35        // Paramètres de saisie de l'étape 1
36        // Type et nature de la recherche, texte de la recherche (qui peut-être non vide si on affiche une erreur
37        // dans la vérification 1) et règne.
38        $valeurs['type_recherche'] = _request('type_recherche');
39        $valeurs['recherche'] = _request('recherche');
40        $valeurs['correspondance'] = _request('correspondance');
41        $valeurs['regne'] = _request('regne');
42
43        // Types de recherche et défaut.
44        $types = array(
45                'scientificname' => 'nom_scientifique',
46                'commonname'     => 'nom_commun'
47        );
48        foreach ($types as $_type_en => $_type_fr) {
49                $valeurs['_types_recherche'][$_type_en] = _T("taxon:champ_${_type_fr}_label");
50        }
51        $valeurs['_type_recherche_defaut'] = 'scientificname';
52
53        // Types de correspondance et défaut.
54        $correspondances = array('exact', 'contenu', 'debut', 'fin');
55        foreach ($correspondances as $_correspondance) {
56                $valeurs['_correspondances'][$_correspondance] = _T("taxonomie:label_recherche_correspondance_${_correspondance}");
57        }
58        $valeurs['_correspondance_defaut'] = 'exact';
59
60        // Acquérir la liste des règnes déjà chargés. Si un règne n'est pas chargé il n'apparait pas dans la liste
61        // car il ne sera alors pas possible de créer correctement l'espèce avec sa hiérarchie de taxons.
62        include_spip('inc/taxonomer');
63        include_spip('taxonomie_fonctions');
64        $regnes = explode(':', _TAXONOMIE_REGNES);
65        foreach ($regnes as $_regne) {
66                if (taxonomie_regne_existe($_regne, $meta_regne)) {
67                        $valeurs['_regnes'][$_regne] = ucfirst(_T("taxonomie:regne_${_regne}"));
68                }
69        }
70        // On force toujours un règne, le premier de la liste.
71        reset($valeurs['_regnes']);
72        $valeurs['_regne_defaut'] = key($valeurs['_regnes']);
73
74        // Initialisation des paramètres du formulaire utilisés en étape 2 et 3 et mis à jour dans la vérification
75        // de l'étape 1.
76        // -- Etape 2
77        $valeurs['_taxons'] = _request('_taxons');
78        $valeurs['_taxon_defaut'] = _request('_taxon_defaut');
79        $valeurs['_resume'] = _request('_resume');
80        // -- Etape 3
81        $valeurs['tsn'] = _request('tsn');
82        $valeurs['_espece'] = _request('_espece');
83        $valeurs['_parent'] = _request('_parent');
84
85        // Préciser le nombre d'étapes du formulaire
86        $valeurs['_etapes'] = 3;
87
88        return $valeurs;
89}
90
91/**
92 * Vérification de l'étape 1 du formulaire :
93 *
94 * @uses itis_search_tsn()
95 * @uses itis_get_information()
96 * @uses itis_get_record()
97 *
98 * @return array
99 *        Message d'erreur si aucun taxon disponible ou si il existe une erreur dans les saisies ou
100 *        chargement (set_request) des champs utiles à l'étape 2 sinon. Ces champs sont :
101 *            - `_taxons`       : (affichage) liste des taxons correspondant à la recherche (tsn, nom scientifique et rang).
102 *            - `_taxon_defaut` : (affichage) tsn du taxon choisi par défaut.
103  */
104function formulaires_creer_espece_verifier_1() {
105
106        // Initialisation des erreurs de vérification.
107        $erreurs = array();
108
109        // Si on a déjà choisi une langue, on peut accéder à Wikipedia avec le nom scientifique et retourner
110        // les pages trouvées (étape 2).
111        if ($recherche = trim(_request('recherche'))) {
112                // On récupère le type de recherche.
113                $type_recherche = _request('type_recherche');
114
115                // Si la recherche est de type nom common on ne peut rien vérifier sur le texte.
116                // Si la recherche est de type nom scientifique, on vérifie que le texte de recherche :
117                // - contient au moins deux mots
118                // - que le deuxième mot n'est pas un 'x' (désigne uniquement un taxon de rang supérieur hybride)
119                // - et que le deuxième mot n'est pas entre parenthèses (sous-genre).
120                $recherche_conforme = true;
121                if ($type_recherche == 'scientificname') {
122                        $nombre_mots = preg_match_all('#\w+#', $recherche, $mots);
123                        if ($nombre_mots < 2) {
124                                $recherche_conforme = false;
125                        } elseif ($nombre_mots == 2) {
126                                if ((strtolower($mots[0][1]) == 'x')
127                                or ((substr($mots[0][1], 0, 1) == '(') and (substr($mots[0][1], -1) == ')'))) {
128                                        $recherche_conforme = false;
129                                }
130                        }
131                }
132
133                if ($recherche_conforme) {
134                        // On recherche le ou les taxons correspondant au texte saisi.
135                        // -- récupération des autres variables
136                        $correspondance = _request('correspondance');
137                        $recherche_exacte = ($correspondance == 'exact');
138                        $regne =  _request('regne');
139                        // -- suppression des espaces en trop dans la chaîne de recherche pour permettre la comparaison
140                        //    avec le combinedName ou le commonName d'ITIS.
141                        $recherche = preg_replace('#\s{2,}#', ' ', $recherche);
142
143                        // Appel de l'API de recherche d'ITIS en fonction du type et de la correspondance de recherche
144                        include_spip('services/itis/itis_api');
145                        $action = $type_recherche;
146                        if (($type_recherche == 'commonname') and ($correspondance == 'debut')) {
147                                $action = 'commonnamebegin';
148                        } elseif (($type_recherche == 'commonname') and ($correspondance == 'fin')) {
149                                $action = 'commonnameend';
150                        }
151                        $taxons = itis_search_tsn($action, $recherche, $recherche_exacte);
152
153                        if ($taxons) {
154                        // Construire le tableau des taxons trouvés en supprimant les taxons qui n'appartiennent pas
155                                // au règne concerné ou qui n'ont pas un rang compatible (uniquement pour la recherche par nom commun).
156                                $valeurs['_taxon_defaut'] = 0;
157                                foreach ($taxons as $_taxon) {
158                                        if ($type_recherche == 'scientificname') {
159                                                if (strcasecmp($_taxon['regne'], $regne) === 0) {
160                                                        // On recherche le rang de chaque taxon pour l'afficher avec le nom scientifique mais
161                                                        // aussi pour vérifier que ce rang est compatible avec une espèce si on cherche par nom commun.
162                                                        $rang = itis_get_information('rankname', $_taxon['tsn']);
163                                                        $valeurs['_taxons'][$_taxon['tsn']] = '<span class="nom_scientifique_inline">'
164                                                                . $_taxon['nom_scientifique']
165                                                                . '</span>'
166                                                                . ' - '
167                                                                . _T('taxonomie:rang_' . $rang);
168                                                        if (strcasecmp($recherche, $_taxon['nom_scientifique']) === 0) {
169                                                                $valeurs['_taxon_defaut'] = $_taxon['tsn'];
170                                                        }
171                                                }
172                                        } else {
173                                                $record = itis_get_record($_taxon['tsn']);
174                                                if (strcasecmp($record['regne'], $regne) === 0) {
175                                                        $valeurs['_taxons'][$_taxon['tsn']] = $_taxon['nom_commun']
176                                                                . " [{$_taxon['langage']}]"
177                                                                . ' - '
178                                                                . _T('taxonomie:rang_' . $record['rang']);
179                                                        if (strcasecmp($recherche, $_taxon['nom_commun']) === 0) {
180                                                                $valeurs['_taxon_defaut'] = $_taxon['tsn'];
181                                                        }
182                                                }
183                                        }
184                                }
185                                if (!$valeurs['_taxon_defaut']) {
186                                        reset($valeurs['_taxons']);
187                                        $valeurs['_taxon_defaut'] = key($valeurs['_taxons']);
188                                }
189
190                                // On fournit ces informations au formulaire pour l'étape 2.
191                                foreach ($valeurs as $_champ => $_valeur) {
192                                        set_request($_champ, $_valeur);
193                                }
194                        } else {
195                                $erreurs['message_erreur'] = _T('taxonomie:erreur_recherche_aucun_taxon');
196                        }
197                } else {
198                        $erreurs['recherche'] = _T('taxonomie:erreur_recherche_nom_scientifique');
199                }
200        } else {
201                $erreurs['recherche'] = _T('info_obligatoire');
202        }
203
204        return $erreurs;
205}
206
207
208/**
209 * Vérification de l'étape 2 du formulaire : on présente les informations principales du taxon choisi avant
210 * que l'utilisateur ne valide définitivement son choix.
211 *
212 * @uses itis_get_record()
213 *
214 * @return array
215 *        Message d'erreur si le service ITIS ne renvoie pas les informations demandées (a priori jamais) ou
216 *        chargement (set_request) des champs utiles à l'étape 3 sinon. Ces champs sont :
217 *              - `_espece` : (affichage) toutes les informations ITIS sur l'espèce.
218 *              - `_parent` : (affichage) toutes les informations ITIS sur le parent direct de l'espèce.
219 */
220function formulaires_creer_espece_verifier_2() {
221
222        // Initialisation des erreurs de vérification.
223        $erreurs = array();
224
225        if ($tsn = intval(_request('tsn'))) {
226                // On récupère les informations de base du taxon afin de les présenter à l'utilisateur pour validation
227                // finale.
228                include_spip('services/itis/itis_api');
229                $espece = itis_get_record($tsn);
230                if ($espece) {
231                        // On passe la description de l'espèce après avoir construit la liste des noms communs utiles.
232                        $nom_commun = '';
233                        if ($espece['nom_commun']) {
234                                include_spip('inc/config');
235                                $langues_utilisees = lire_config('taxonomie/langues_utilisees');
236                                foreach ($espece['nom_commun'] as $_langue => $_nom) {
237                                        if (in_array($_langue, $langues_utilisees)) {
238                                                $nom_commun .= ($nom_commun ? '<br />': '') . '[' . $_langue .'] ' . $_nom;
239                                        }
240                                }
241                        }
242                        $espece['nom_commun_utilise'] = $nom_commun;
243                        set_request('_espece', $espece);
244
245                        // Détermination du parent : on récupère son record complet
246                        $parent = itis_get_record($espece['tsn_parent']);
247                        if ($parent) {
248                                set_request('_parent', $parent);
249                        } else {
250                                $erreurs['message_erreur'] = _T('taxonomie:erreur_acces_taxon');
251                        }
252                } else {
253                        $erreurs['message_erreur'] = _T('taxonomie:erreur_acces_taxon');
254                }
255        } else {
256                $erreurs['message_erreur'] = _T('taxonomie:erreur_acces_taxon');
257        }
258
259        return $erreurs;
260}
261
262
263/**
264 * Vérification de l'étape 3 du formulaire : on vérifie que l'espèce n'existe pas déjà dans la base de données
265 * taxonomique.
266 *
267 * @uses wikipedia_get_page()
268 * @uses convertisseur_texte_spip()
269 *
270 * @return array
271 *              Message d'erreur si aucune page n'est disponible ou chargement des champs utiles à l'étape 2 sinon.
272 *      Ces champs sont :
273 *              - `_liens`         : liste des liens possibles pour la recherche (étape 2)
274 *              - `_lien_defaut`   : lien par défaut (étape 2)
275 *              - `_descriptif`    : texte de la page trouvée ou choisie par l'utilisateur (étape 2)
276 */
277function formulaires_creer_espece_verifier_3() {
278
279        // Initialisation des erreurs de vérification.
280        $erreurs = array();
281
282        if ($tsn = intval(_request('tsn'))) {
283                // On vérifie que l'espèce n'a pas déjà été créée et possède un statut autre que refusé ou poubelle.
284                if (sql_countsel('spip_especes', array('tsn=' . $tsn))) {
285                        $erreurs['message_erreur'] = _T('taxonomie:erreur_espece_deja_creee');
286                }
287        } else {
288                $erreurs['message_erreur'] = _T('taxonomie:erreur_acces_taxon');
289        }
290
291        return $erreurs;
292}
293
294
295/**
296 * Exécution du formulaire : si une page est choisie et existe le descriptif est inséré dans le taxon concerné
297 * et le formulaire renvoie sur la page d'édition du taxon.
298 *
299 * @uses wikipedia_get_page()
300 * @uses convertisseur_texte_spip()
301 * @uses taxon_merger_traductions()
302 *
303 * @return array
304 *              Tableau retourné par le formulaire contenant toujours un message de bonne exécution ou
305 *              d'erreur. L'indicateur editable est toujours à vrai.
306 */
307function formulaires_creer_espece_traiter() {
308        $retour = array();
309
310        if ($tsn = intval(_request('tsn'))) {
311                // Vérification de l'existence du parent.
312                // Si le parent n'existe pas en base c'est soit une erreur si le rang supérieur ou égal au genre soit
313                // normal si le rang est un sous-genre. En effet, les sous-genres sont uniquement créés au coups par coups
314                // quand on crée les espèces.
315
316                // Ajout de l'espèce en base
317                // Si le rang est bien espèce alors on ajoute que ce taxon. Sinon il faut ajouter toute l'arborecence jusqu'au
318                // taxon d'espèce.
319
320                // Ajout du parent si nécessaire.
321
322                // Redirection vers la page d'édition du taxon
323                $id_espece = 0;
324                $retour['redirect'] = parametre_url(generer_url_ecrire('espece_edit'), 'id_espece', $id_espece);
325        } else {
326                $retour['message_erreur'] = _T('taxonomie:erreur_inconnue');
327        }
328
329        return $retour;
330}
Note: See TracBrowser for help on using the repository browser.