Changeset 109286 in spip-zone


Ignore:
Timestamp:
Mar 4, 2018, 10:32:01 AM (17 months ago)
Author:
eric@…
Message:

Amélioration de la vérification des étapes 1 et 2 de la création d'une espèce.

Location:
_plugins_/taxonomie/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/taxonomie/trunk/demo/taxonomie.html

    r109127 r109286  
    1010    include_spip('inc/taxonomer');
    1111
    12     var_dump(itis_get_record(183803));
     12    var_dump(itis_get_information('scientificname', 183803));
     13    var_dump(itis_get_information('kingdomname', 183803));
     14    var_dump(itis_get_information('parent', 183803));
     15    var_dump(itis_get_information('rankname', 183803));
     16    var_dump(itis_get_information('author', 183803));
     17    var_dump(itis_get_information('commonnames', 183803));
     18    var_dump(itis_get_information('hierarchyfull', 183803));
    1319?>
    1420
  • _plugins_/taxonomie/trunk/formulaires/creer_espece.php

    r109246 r109286  
    7777        $valeurs['_taxons'] = _request('_taxons');
    7878        $valeurs['_taxon_defaut'] = _request('_taxon_defaut');
    79         $valeurs['_resume'] = _request('_resume');
    8079        // -- Etape 3
    8180        $valeurs['tsn'] = _request('tsn');
     
    151150                        $taxons = itis_search_tsn($action, $recherche, $recherche_exacte);
    152151
    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">'
     152                        // Construire le tableau des taxons trouvés en supprimant:
     153                        // - les taxons qui n'appartiennent pas au règne concerné
     154                        // - ou qui n'ont pas un rang compatible (uniquement pour la recherche par nom commun)
     155                        // - ou qui ne sont pas des appellations valides
     156                        // - ou qui sont déjà créés.
     157                        $valeurs['_taxons'] = array();
     158                        $valeurs['_taxon_defaut'] = 0;
     159                        include_spip('inc/taxonomer');
     160                        foreach ($taxons as $_taxon) {
     161                                if (!sql_countsel('spip_especes', array('tsn=' . intval($_taxon['tsn'])))) {
     162                                        $taxon = itis_get_record($_taxon['tsn']);
     163                                        if (($taxon['usage_valide']) and (strcasecmp($taxon['regne'], $regne) === 0)) {
     164                                                if ($type_recherche == 'scientificname') {
     165                                                        $valeurs['_taxons'][$taxon['tsn']] = '<span class="nom_scientifique_inline">'
    164166                                                                . $_taxon['nom_scientifique']
    165167                                                                . '</span>'
    166168                                                                . ' - '
    167                                                                 . _T('taxonomie:rang_' . $rang);
    168                                                         if (strcasecmp($recherche, $_taxon['nom_scientifique']) === 0) {
    169                                                                 $valeurs['_taxon_defaut'] = $_taxon['tsn'];
     169                                                                . _T('taxonomie:rang_' . $taxon['rang']);
     170                                                        if (strcasecmp($recherche, $taxon['nom_scientifique']) === 0) {
     171                                                                $valeurs['_taxon_defaut'] = $taxon['tsn'];
    170172                                                        }
    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'];
     173                                                } else {
     174                                                        // Vérifier que ce rang est compatible avec une espèce ou un rang inférieur.
     175                                                        if (taxon_rang_espece($taxon['rang'])) {
     176                                                                $valeurs['_taxons'][$taxon['tsn']] = $taxon['nom_commun']
     177                                                                        . " [{$taxon['langage']}]"
     178                                                                        . ' - '
     179                                                                        . _T('taxonomie:rang_' . $taxon['rang']);
     180                                                                if (strcasecmp($recherche, $taxon['nom_commun']) === 0) {
     181                                                                        $valeurs['_taxon_defaut'] = $taxon['tsn'];
     182                                                                }
    181183                                                        }
    182184                                                }
    183185                                        }
    184186                                }
     187                        }
     188
     189                        if ($valeurs['_taxons']) {
     190                                // Si aucun taxon par défaut, on prend le premier taxon de la liste.
    185191                                if (!$valeurs['_taxon_defaut']) {
    186192                                        reset($valeurs['_taxons']);
    187193                                        $valeurs['_taxon_defaut'] = key($valeurs['_taxons']);
    188194                                }
    189 
    190195                                // On fournit ces informations au formulaire pour l'étape 2.
    191196                                foreach ($valeurs as $_champ => $_valeur) {
     
    208213/**
    209214 * 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.
     215 * que l'utilisateur ne valide définitivement son choix. En particulier, on affiche la hiérarchie du taxon
     216 * jusqu'au premier taxon de genre et on identifie les taxons qui seront aussi créés dans cette hiérarchie.
    211217 *
    212218 * @uses itis_get_record()
     
    225231        if ($tsn = intval(_request('tsn'))) {
    226232                // On récupère les informations de base du taxon afin de les présenter à l'utilisateur pour validation
    227                 // finale.
     233                // finale. Ces informations existent forcément car elles ont été demandées à l'étape précédentes et son
     234                // donc accessibles directement dans un cache.
    228235                include_spip('services/itis/itis_api');
    229236                $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                         }
     237
     238                // On passe au formulaire la description de l'espèce après avoir construit la liste des noms communs utiles.
     239                $nom_commun = '';
     240                if ($espece['nom_commun']) {
     241                        include_spip('inc/config');
     242                        $langues_utilisees = lire_config('taxonomie/langues_utilisees');
     243                        foreach ($espece['nom_commun'] as $_langue => $_nom) {
     244                                if (in_array($_langue, $langues_utilisees)) {
     245                                        $nom_commun .= ($nom_commun ? '<br />': '') . '[' . $_langue .'] ' . $_nom;
     246                                }
     247                        }
     248                }
     249                $espece['nom_commun_affiche'] = $nom_commun;
     250                set_request('_espece', $espece);
     251
     252                // On passe au formulaire le ou les parents afin de positionner l'espèce dans la hiérarchie et de connaitre
     253                // les taxons à créer.
     254                $hierarchie = itis_get_information('hierarchyup', $espece['tsn']);
     255                $ascendants = $hierarchie['ascendants'];
     256                krsort($ascendants);
     257
     258                // Si l'espèce choisie est de rang espèce, alors on ne renvoie que son parent direct
     259                include_spip('inc/taxonomer');
     260                if ($espece['rang'] = _TAXONOMIE_RANG_ESPECE) {
     261                        // Le parent direct est le premier des ascendants après le tri inverse effectué.
     262                        set_request('_parent', $ascendants[0]);
    252263                } 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  */
    277 function 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');
     264                        // L'espèce est de rang inférieur à espèce. Elle a donc des ascendants de type "espèce" qu'il faut lister
     265                        // avant de trouver le premier taxon du règne déjà en base de données.
     266                        foreach ($ascendants as $_ascendant) {
     267
     268                        }
    286269                }
    287270        } else {
     
    309292
    310293        if ($tsn = intval(_request('tsn'))) {
     294                // Récupération des informations ITIS sur l'espèce choisie et son parent.
     295                $espece = _request('_espece');
     296                $parent = _request('_parent');
     297
    311298                // Vérification de l'existence du parent.
    312299                // Si le parent n'existe pas en base c'est soit une erreur si le rang supérieur ou égal au genre soit
    313300                // 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.
     301                // quand on crée les espèces car il ne sont jamais chargés avec le règne.
     302                if (sql_countsel('spip_taxons', array('tsn=' . $tsn))) {
     303                        $erreurs['message_erreur'] = _T('taxonomie:erreur_espece_deja_creee');
     304                }
     305
    315306
    316307                // Ajout de l'espèce en base
  • _plugins_/taxonomie/trunk/formulaires/creer_espece_3.html

    r109246 r109286  
    2525                                <tr class="">
    2626                                        <td class=""><:espece:champ_nom_commun_label:></td>
    27                                         <td class="">[(#ENV*{_espece/nom_commun_utilise})]</td>
     27                                        <td class="">[(#ENV*{_espece/nom_commun_affiche})]</td>
    2828                                </tr>
    2929                                <tr class="">
  • _plugins_/taxonomie/trunk/inc/taxonomer.php

    r109124 r109286  
    268268 * Traduit un champ de la table `spip_taxons` dans la langue du site.
    269269 *
    270  * @param $champ
     270 * @param string $champ
    271271 *        Nom du champ dans la base de données.
    272272 *
     
    283283        return $traduction;
    284284}
     285
     286
     287/**
     288 * Détermine si un rang est celui d'une espèce ou d'un taxon de rang inférieur ou pas.
     289 *
     290 * @param string $rang
     291 *        Nom anglais du rang en minuscules.
     292 *
     293 * @return bool
     294 *        `true` si le rang est celui d'une espèce ou d'un taxon de rang inférieur, `false` sinon.
     295 */
     296function taxon_rang_espece($rang) {
     297
     298        static $rangs_especes = array(
     299                'species',
     300                'subspecies',
     301                'variety',
     302                'subvariety',
     303                'form',
     304                'subform',
     305                'race',
     306                'stirp',
     307                'morph',
     308        );
     309
     310        $est_espece = false;
     311        if (in_array($rang, $rangs_especes)) {
     312                $est_espece = true;
     313        }
     314
     315        return $est_espece;
     316}
  • _plugins_/taxonomie/trunk/lang/taxonomie_fr.php

    r109246 r109286  
    2121        'erreur_wikipedia_descriptif' => 'Aucun descriptif dans la langue choisie n\'a pu être récupéré de Wikipedia.',
    2222        'erreur_recherche_nom_scientifique' => 'Le nom scientifique d\'une espèce ou d\'un taxon de rang inférieur est toujours constitué d\'au moins deux mots.',
    23         'erreur_recherche_aucun_taxon' => 'Le service ITIS ne trouve aucun taxon correspondant à cette recherche.',
     23        'erreur_recherche_aucun_taxon' => 'Le service ITIS ne trouve aucun taxon de rang espèce ou inférieur correspondant à cette recherche ou tous les taxons trouvés ont déjà été créés.',
    2424        'erreur_acces_taxon' => 'Le service web ITIS renvoie une erreur pour le taxon considéré.',
    2525        'explication_taxon_trouve' => 'Chaque taxon est désigné par son nom, scientifique ou commun, et son rang.',
  • _plugins_/taxonomie/trunk/services/itis/itis_api.php

    r109246 r109286  
    5555         * et code de langue SPIP. La langue du service est l'index, le code SPIP est la valeur.
    5656         */
    57         'french'  => 'fr',
    58         'english' => 'en',
    59         'spanish' => 'es'
     57        'french'     => 'fr',
     58        'english'    => 'en',
     59        'spanish'    => 'es',
     60        'german'     => 'de',
     61        'italian'    => 'it',
     62        'portuguese' => 'pt'
    6063);
    6164$GLOBALS['itis_webservice'] = array(
     
    130133                                'nom_commun'        => 'commonNameList/commonNames',
    131134                                'credibilite'       => 'credibilityRating/credRating',
    132                                 'usage'             => 'usage/taxonUsageRating',
     135                                'usage_valide'      => 'usage/taxonUsageRating',
    133136                                'zone_geographique' => 'geographicDivisionList/geoDivisions'
    134137                        )
     
    140143                        'argument' => 'tsn',
    141144                        'list'     => '',
    142                         'index'    => array('string', 'combinedName'),
     145                        'type'     => 'string',
     146                        'index'    => 'combinedName',
    143147                ),
    144148                'kingdomname'    => array(
     
    146150                        'argument' => 'tsn',
    147151                        'list'     => '',
    148                         'index'    => array('string', 'kingdomName'),
     152                        'type'     => 'string',
     153                        'index'    => 'kingdomName',
    149154                ),
    150155                'parent'         => array(
     
    152157                        'argument' => 'tsn',
    153158                        'list'     => '',
    154                         'index'    => array('string', 'parentTsn'),
     159                        'type'     => 'string',
     160                        'index'    => 'parentTsn',
    155161                ),
    156162                'rankname'       => array(
     
    158164                        'argument' => 'tsn',
    159165                        'list'     => '',
    160                         'index'    => array('string', 'rankName'),
     166                        'type'     => 'string',
     167                        'index'    => 'rankName',
    161168                ),
    162169                'author'         => array(
     
    164171                        'argument' => 'tsn',
    165172                        'list'     => '',
    166                         'index'    => array('string', 'authorship'),
     173                        'type'     => 'string',
     174                        'index'    => 'authorship',
    167175                ),
    168176                'coremetadata'   => array(
     
    170178                        'argument' => 'tsn',
    171179                        'list'     => '',
    172                         'index'    => array('array', ''),
     180                        'type'     => 'array',
     181                        'index'    => array(''),
    173182                ),
    174183                'experts'        => array(
     
    176185                        'argument' => 'tsn',
    177186                        'list'     => 'experts',
    178                         'index'    => array('array', ''),
     187                        'type'     => 'array',
     188                        'index'    => array(''),
    179189                ),
    180190                'commonnames'    => array(
     
    182192                        'argument' => 'tsn',
    183193                        'list'     => 'commonNames',
    184                         'index'    => array('array', array('language' => 'commonName')),
     194                        'type'     => 'array',
     195                        'index'    => array(
     196                                'langue'     => 'language',
     197                                'nom_commun' => 'commonName',
     198                        ),
    185199                ),
    186200                'othersources'   => array(
     
    188202                        'argument' => 'tsn',
    189203                        'list'     => 'otherSources',
    190                         'index'    => array('array', ''),
     204                        'type'     => 'array',
     205                        'index'    => array(''),
    191206                ),
    192207                'hierarchyfull'  => array(
     
    194209                        'argument' => 'tsn',
    195210                        'list'     => 'hierarchyList',
    196                         'index'    => array('array', ''),
     211                        'type'     => 'array',
     212                        'index'    => array(
     213                                'rang'             => 'rankName',
     214                                'tsn'              => 'tsn',
     215                                'nom_scientifique' => 'taxonName',
     216                                'tsn_parent'       => 'parentTsn',
     217                        ),
    197218                ),
    198219                'hierarchydown'  => array(
     
    200221                        'argument' => 'tsn',
    201222                        'list'     => 'hierarchyList',
    202                         'index'    => array('array', ''),
     223                        'type'     => 'array',
     224                        'index'    => array(''),
     225                ),
     226                'hierarchyup'  => array(
     227                        'function' => 'getHierarchyUpFromTSN',
     228                        'argument' => 'tsn',
     229                        'list'     => '',
     230                        'type'     => 'array',
     231                        'index'    => array(''),
    203232                ),
    204233        ),
     
    301330 *                                `spanish`...) fournissant le nom commun dans chacune des langues
    302331 *        - `credibilite`       : Information sur la crédibilité des informations du taxon
    303  *        - `usage`             : Indication dur la validité de l'utilisation du taxon
     332 *        - `usage_valide`      : Indication sur la validité de l'utilisation du taxon
    304333 *        - `zone_geographique` : un tableau indexé par langue unique `english` des zones géographiques où le taxon
    305334 *                                est localisé. Les zones sont libellées en anglais.
     
    345374
    346375                        // On réorganise le sous-tableau des noms communs
    347                         $noms = array();
     376                        $names = array();
    348377                        if (!empty($record['nom_commun']) and is_array($record['nom_commun'])) {
    349                                 foreach ($record['nom_commun'] as $_nom) {
    350                                         $langue_spip = $GLOBALS['itis_language'][strtolower($_nom['language'])];
    351                                         $noms[$langue_spip] = trim($_nom['commonName']);
     378                                foreach ($record['nom_commun'] as $_name) {
     379                                        if (!empty($_name) and isset($GLOBALS['itis_language'][strtolower($_name['language'])])) {
     380                                                $langue_spip = $GLOBALS['itis_language'][strtolower($_name['language'])];
     381                                                $names[$langue_spip] = trim($_name['commonName']);
     382                                        }
    352383                                }
    353384                        }
    354385                        // Et on modifie l'index des noms communs avec le tableau venant d'être construit.
    355                         $record['nom_commun'] = $noms;
     386                        $record['nom_commun'] = $names;
     387
     388                        // L'indicateur d'usage est mis à true/false.
     389                        $record['usage_valide'] = ($record['usage_valide'] == 'valid') or ($record['usage_valide'] == 'accepted');
    356390
    357391                        // On réorganise le sous-tableau des zones géographiques.
     
    398432 *        - `commonnames`    : le ou les noms communs
    399433 *        - `othersources`   : les sources d'information sur le taxon
    400  *        - `hierarchyfull`  : la hiérarchie complète jusqu'au taxon
    401  *        - `hierarchydown`  : la hiérarchie (à vérifier)
     434 *        - `hierarchyfull`  : la hiérarchie complète jusqu'au taxon et ses descendants directs
     435 *        - `hierarchyup`    : la hiérarchie limitée au parent direct
    402436 * @param int    $tsn
    403437 *        Identifiant unique du taxon dans la base ITIS (TSN)
     
    426460                include_spip('inc/filtres');
    427461                $data = $api['list'] ? table_valeur($data, $api['list'], null) : $data;
    428                 list($type, $index) = $api['index'];
     462                $type = $api['type'];
     463                $index = $api['index'];
    429464
    430465                if ($type == 'string') {
     466                        // L'information est limitée à une chaine ou un entier unique.
     467                        // On renvoie la valeur seule.
    431468                        $information = '';
    432469                        if (!empty($data[$index])) {
     
    439476                        }
    440477                } else {
     478                        // L'information demandée est un tableau.
    441479                        $information = array();
    442                         if ($data) {
    443                                 $first_value = reset($data);
    444                                 if ($first_value) {
    445                                         if (!$index) {
    446                                                 $information = $data;
    447                                                 $format = "format_$action";
    448                                                 if (function_exists($format)) {
    449                                                         $information = $format($information);
     480                        if (!empty($data)) {
     481                                $format = "itis_format_$action";
     482                                if (function_exists($format)) {
     483                                        $information = $format($tsn, $data, $index);
     484                                } else {
     485                                        foreach ($data as $_data) {
     486                                                $item = array();
     487                                                foreach ($index as $_key_information => $_key_data) {
     488                                                        $item[$_key_information] = $_data[$_key_data];
    450489                                                }
    451                                         } else {
    452                                                 $destination = reset($index);
    453                                                 $key = key($index);
    454                                                 foreach ($data as $_data) {
    455                                                         $information[strtolower($_data[$destination])][] = $_data[$key];
    456                                                 }
     490                                                $information[] = $item;
    457491                                        }
    458492                                }
     
    881915        return $url;
    882916}
     917
     918function itis_format_hierarchyfull($tsn, $data, $index) {
     919
     920        $information = array(
     921                'ascendants' => array(),
     922                'fils'       => array(),
     923                'taxon'      => array()
     924        );
     925
     926        if (!empty($data)) {
     927                foreach ($data as $_data) {
     928                        // On constitue le bloc du taxon.
     929                        $taxon = array();
     930                        foreach ($index as $_key_information => $_key_data) {
     931                                if ($_key_information == 'rang') {
     932                                        $taxon[$_key_information] = strtolower($_data[$_key_data]);
     933                                } elseif (($_key_information == 'tsn') or ($_key_information == 'tsn_parent')) {
     934                                        $taxon[$_key_information] = $_data[$_key_data] ? intval($_data[$_key_data]) : 0;
     935                                } else {
     936                                        $taxon[$_key_information] = $_data[$_key_data];
     937                                }
     938                        }
     939
     940                        // On affecte ce bloc soit dans la liste des parents, soit dans la liste des enfants, soit dans
     941                        // l'index du taxon lui-même.
     942                        if ($tsn == $taxon['tsn']) {
     943                                $information['taxon'] = $taxon;
     944                        } elseif ($tsn == $taxon['tsn_parent']) {
     945                                $information['fils'][] = $taxon;
     946                        } else {
     947                                $information['ascendants'][] = $taxon;
     948                        }
     949                }
     950        }
     951
     952        return $information;
     953}
Note: See TracChangeset for help on using the changeset viewer.