Changeset 113806 in spip-zone
- Timestamp:
- Feb 7, 2019, 8:01:42 PM (2 years ago)
- Location:
- _plugins_/taxonomie/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
_plugins_/taxonomie/trunk/formulaires/creer_espece.php
r113790 r113806 112 112 $erreurs = array(); 113 113 114 // Si on a déjà choisi une langue, on peut accéder à Wikipedia avec le nom scientifique et retourner 115 // les pages trouvées (étape 2). 116 if ($recherche = ltrim(_request('recherche'))) { 117 // On récupère le type de recherche et la correspondance. 118 $type_recherche = _request('type_recherche'); 119 $correspondance = _request('correspondance'); 120 $recherche_exacte = ($correspondance == 'exact'); 121 $recherche_commence_par = ($correspondance == 'debut'); 122 123 // Si la recherche est de type nom commun on ne peut rien vérifier sur le texte. 124 // Si la recherche est de type nom scientifique, on vérifie que le texte de recherche : 125 // - contient au moins deux mots 126 // - que le deuxième mot n'est pas un 'x' (désigne uniquement un taxon de rang supérieur hybride) 127 // - et que le deuxième mot n'est pas entre parenthèses (sous-genre). 128 $recherche_conforme = true; 129 if ($type_recherche == 'scientificname') { 130 $nombre_mots = preg_match_all('#\w+#', $recherche, $mots); 131 if (($nombre_mots < 2) and ($recherche_exacte)) { 132 $recherche_conforme = false; 133 } elseif ($nombre_mots == 2) { 134 if ((strtolower($mots[0][1]) == 'x') 135 or ((substr($mots[0][1], 0, 1) == '(') and (substr($mots[0][1], -1) == ')'))) { 114 // Il est inutile de vérifier à nouveau les valeurs de l'étape 1 si on est dans une étape ultérieure 115 // car on ne modifie rien. On gagne du temps en passant outre. 116 if (_request('_etape') == 1) { 117 // Si on a déjà choisi une langue, on peut accéder à Wikipedia avec le nom scientifique et retourner 118 // les pages trouvées (étape 2). 119 if ($recherche = ltrim(_request('recherche'))) { 120 // On récupère le type de recherche et la correspondance. 121 $type_recherche = _request('type_recherche'); 122 $correspondance = _request('correspondance'); 123 $recherche_exacte = ($correspondance == 'exact'); 124 $recherche_commence_par = ($correspondance == 'debut'); 125 126 // Si la recherche est de type nom commun on ne peut rien vérifier sur le texte. 127 // Si la recherche est de type nom scientifique, on vérifie que le texte de recherche : 128 // - contient au moins deux mots 129 // - que le deuxième mot n'est pas un 'x' (désigne uniquement un taxon de rang supérieur hybride) 130 // - et que le deuxième mot n'est pas entre parenthèses (sous-genre). 131 $recherche_conforme = true; 132 if ($type_recherche == 'scientificname') { 133 $nombre_mots = preg_match_all('#\w+#', $recherche, $mots); 134 if (($nombre_mots < 2) and ($recherche_exacte)) { 136 135 $recherche_conforme = false; 137 } 138 } 139 } 140 141 if ($recherche_conforme) { 142 // On recherche le ou les taxons correspondant au texte saisi. 143 // -- récupération du règne 144 $regne = _request('regne'); 145 // -- suppression des espaces en trop dans la chaîne de recherche pour permettre la comparaison 146 // avec le combinedName ou le commonName d'ITIS. 147 $recherche = preg_replace('#\s{2,}#', ' ', $recherche); 148 149 // Appel de l'API de recherche d'ITIS en fonction du type et de la correspondance de recherche 150 include_spip('services/itis/itis_api'); 151 $action = $type_recherche; 152 if (($type_recherche == 'commonname') and ($correspondance == 'debut')) { 153 $action = 'commonnamebegin'; 154 } elseif (($type_recherche == 'commonname') and ($correspondance == 'fin')) { 155 $action = 'commonnameend'; 156 } 157 $taxons = itis_search_tsn($action, $recherche, $recherche_exacte); 158 if ($taxons) { 159 if ($recherche_exacte) { 160 // Si la correspondance est exacte, les informations de chaque taxon sont suffisantes pour limiter 161 // d'emblée le nombre de taxon au seul qui correspond. 162 $taxon_exact = array(); 163 foreach ($taxons as $_taxon) { 164 if ((($type_recherche == 'scientificname') and (strcasecmp($_taxon['nom_scientifique'], $recherche) === 0)) 165 or (($type_recherche == 'commonname') and (strcasecmp($_taxon['nom_commun'], $recherche) === 0))) { 166 $taxon_exact = $_taxon; 167 break; 136 } elseif ($nombre_mots == 2) { 137 if ((strtolower($mots[0][1]) == 'x') 138 or ((substr($mots[0][1], 0, 1) == '(') and (substr($mots[0][1], -1) == ')'))) { 139 $recherche_conforme = false; 140 } 141 } 142 } 143 144 if ($recherche_conforme) { 145 // On recherche le ou les taxons correspondant au texte saisi. 146 // -- récupération du règne 147 $regne = _request('regne'); 148 // -- suppression des espaces en trop dans la chaîne de recherche pour permettre la comparaison 149 // avec le combinedName ou le commonName d'ITIS. 150 $recherche = preg_replace('#\s{2,}#', ' ', $recherche); 151 152 // Appel de l'API de recherche d'ITIS en fonction du type et de la correspondance de recherche 153 include_spip('services/itis/itis_api'); 154 $action = $type_recherche; 155 if (($type_recherche == 'commonname') and ($correspondance == 'debut')) { 156 $action = 'commonnamebegin'; 157 } elseif (($type_recherche == 'commonname') and ($correspondance == 'fin')) { 158 $action = 'commonnameend'; 159 } 160 $taxons = itis_search_tsn($action, $recherche, $recherche_exacte); 161 if ($taxons) { 162 if ($recherche_exacte) { 163 // Si la correspondance est exacte, les informations de chaque taxon sont suffisantes pour limiter 164 // d'emblée le nombre de taxon au seul qui correspond. 165 // Néanmoins si un seul taxon est renvoyé rien est à faire car on a déjà le bon taxon. 166 if (count($taxons) > 1) { 167 $taxon_exact = array(); 168 foreach ($taxons as $_taxon) { 169 if ((($type_recherche == 'scientificname') and (strcasecmp($_taxon['nom_scientifique'], $recherche) === 0)) 170 or (($type_recherche == 'commonname') and (strcasecmp($_taxon['nom_commun'], $recherche) === 0))) { 171 $taxon_exact = $_taxon; 172 break; 173 } 174 } 175 $taxons = $taxon_exact ? array($taxon_exact) : array(); 176 } 177 } elseif ($recherche_commence_par and ($type_recherche == 'scientificname')) { 178 // Si la correspondance est 'commence par' et que l'on recherche par nom scientifique, les informations 179 // de chaque taxon sont suffisantes pour limiter d'emblée le nombre de taxons à ceux qui commencent 180 // par la recherche. 181 foreach ($taxons as $_cle => $_taxon) { 182 if (substr_compare($_taxon['nom_scientifique'], $recherche, 0, strlen($recherche), true) !== 0) { 183 unset($taxons[$_cle]); 184 } 168 185 } 169 186 } 170 $taxons = $taxon_exact ? array($taxon_exact) : array(); 171 } elseif ($recherche_commence_par and ($type_recherche == 'scientificname')) { 172 // Si la correspondance est 'commence par' et que l'on recherche par nom scientifique, les informations 173 // de chaque taxon sont suffisantes pour limiter d'emblée le nombre de taxons à ceux qui commencent 174 // par la recherche. 175 foreach ($taxons as $_cle => $_taxon) { 176 if (substr_compare($_taxon['nom_scientifique'], $recherche, 0, strlen($recherche), true) !== 0) { 177 unset($taxons[$_cle]); 178 } 179 } 180 } 181 182 // Etant donné qu'on a filtré le tableau issu de l'appel au service ITIS on vérifie à nouveau que 183 // ce tableau n'est pas vide. 184 if ($taxons) { 185 // Si le nombre de taxons récupérés est trop important on renvoie une erreur. 186 // TODO : est-on sur qu'il y a forcément un taxon ? 187 if (count($taxons) <= _TAXONOMIE_RECHERCHE_MAX_ESPECES) { 188 // Construire le tableau des taxons trouvés en supprimant: 189 // - les taxons qui n'appartiennent pas au règne concerné 190 // - ou qui n'ont pas un rang compatible (uniquement pour la recherche par nom commun) 191 // - ou qui ne sont pas des appellations valides 192 // - ou qui sont déjà créés. 193 $valeurs['_taxons'] = array(); 194 $valeurs['_taxon_defaut'] = 0; 195 include_spip('inc/taxonomie'); 196 foreach ($taxons as $_taxon) { 197 if (!sql_countsel('spip_taxons', array('tsn=' . intval($_taxon['tsn'])))) { 198 $taxon = itis_get_record($_taxon['tsn']); 199 if (($taxon['usage_valide']) 200 and (strcasecmp($taxon['regne'], $regne) === 0) 201 and (rang_est_espece($taxon['rang_taxon']))) { 202 if ($type_recherche == 'scientificname') { 203 $valeurs['_taxons'][$taxon['tsn']] = '<span class="nom_scientifique_inline">' 204 . $_taxon['nom_scientifique'] 205 . '</span>' 206 . ' - ' 207 . _T('taxonomie:rang_' . $taxon['rang_taxon']); 208 if (strcasecmp($recherche, $_taxon['nom_scientifique']) === 0) { 209 $valeurs['_taxon_defaut'] = $taxon['tsn']; 210 } 211 } else { 212 // Vérifier que ce rang est compatible avec une espèce ou un rang inférieur. 213 $valeurs['_taxons'][$taxon['tsn']] = $_taxon['nom_commun'] 214 . " [{$_taxon['langage']}]" 215 . ' - ' 216 . _T('taxonomie:rang_' . $taxon['rang_taxon']); 217 if (strcasecmp($recherche, $_taxon['nom_commun']) === 0) { 218 $valeurs['_taxon_defaut'] = $taxon['tsn']; 187 188 // Etant donné qu'on a filtré le tableau issu de l'appel au service ITIS on vérifie à nouveau que 189 // ce tableau n'est pas vide. 190 if ($taxons) { 191 // Si le nombre de taxons récupérés est trop important on renvoie une erreur. 192 if (count($taxons) <= _TAXONOMIE_RECHERCHE_MAX_ESPECES) { 193 // Construire le tableau des taxons trouvés en supprimant: 194 // - les taxons qui n'appartiennent pas au règne concerné 195 // - ou qui n'ont pas un rang compatible (uniquement pour la recherche par nom commun) 196 // - ou qui ne sont pas des appellations valides 197 // - ou qui sont déjà créés. 198 $valeurs['_taxons'] = array(); 199 $valeurs['_taxon_defaut'] = 0; 200 include_spip('inc/taxonomie'); 201 foreach ($taxons as $_taxon) { 202 if (!sql_countsel('spip_taxons', array('tsn=' . intval($_taxon['tsn'])))) { 203 $taxon = itis_get_record($_taxon['tsn']); 204 if (($taxon['usage_valide']) 205 and (strcasecmp($taxon['regne'], $regne) === 0) 206 and (rang_est_espece($taxon['rang_taxon']))) { 207 if ($type_recherche == 'scientificname') { 208 $valeurs['_taxons'][$taxon['tsn']] = '<span class="nom_scientifique_inline">' 209 . $_taxon['nom_scientifique'] 210 . '</span>' 211 . ' - ' 212 . _T('taxonomie:rang_' . $taxon['rang_taxon']); 213 if (strcasecmp($recherche, $_taxon['nom_scientifique']) === 0) { 214 $valeurs['_taxon_defaut'] = $taxon['tsn']; 215 } 216 } else { 217 // Vérifier que ce rang est compatible avec une espèce ou un rang inférieur. 218 $valeurs['_taxons'][$taxon['tsn']] = $_taxon['nom_commun'] 219 . " [{$_taxon['langage']}]" 220 . ' - ' 221 . _T('taxonomie:rang_' . $taxon['rang_taxon']); 222 if (strcasecmp($recherche, $_taxon['nom_commun']) === 0) { 223 $valeurs['_taxon_defaut'] = $taxon['tsn']; 224 } 219 225 } 220 226 } 221 227 } 222 228 } 223 } 224 225 if ($valeurs['_taxons']) { 226 // Si aucun taxon par défaut, on prend le premier taxon de la liste. 227 if (!$valeurs['_taxon_defaut']) { 228 reset($valeurs['_taxons']); 229 $valeurs['_taxon_defaut'] = key($valeurs['_taxons']); 230 } 231 // On fournit ces informations au formulaire pour l'étape 2. 232 foreach ($valeurs as $_champ => $_valeur) { 233 set_request($_champ, $_valeur); 229 230 if ($valeurs['_taxons']) { 231 // Si aucun taxon par défaut, on prend le premier taxon de la liste. 232 if (!$valeurs['_taxon_defaut']) { 233 reset($valeurs['_taxons']); 234 $valeurs['_taxon_defaut'] = key($valeurs['_taxons']); 235 } 236 // On fournit ces informations au formulaire pour l'étape 2. 237 foreach ($valeurs as $_champ => $_valeur) { 238 set_request($_champ, $_valeur); 239 } 240 } else { 241 $erreurs['message_erreur'] = _T('taxonomie:erreur_recherche_aucun_taxon'); 234 242 } 235 243 } else { 236 $erreurs['message_erreur'] = _T('taxonomie:erreur_recherche_ aucun_taxon');244 $erreurs['message_erreur'] = _T('taxonomie:erreur_recherche_max_reponses', array('nb' => count($taxons))); 237 245 } 238 246 } else { 239 $erreurs['message_erreur'] = _T('taxonomie:erreur_recherche_ max_reponses', array('nb' => count($taxons)));247 $erreurs['message_erreur'] = _T('taxonomie:erreur_recherche_aucun_taxon'); 240 248 } 241 249 } else { … … 243 251 } 244 252 } else { 245 $erreurs[' message_erreur'] = _T('taxonomie:erreur_recherche_aucun_taxon');253 $erreurs['recherche'] = _T('taxonomie:erreur_recherche_nom_scientifique'); 246 254 } 247 255 } else { 248 $erreurs['recherche'] = _T('taxonomie:erreur_recherche_nom_scientifique'); 249 } 250 } else { 251 $erreurs['recherche'] = _T('info_obligatoire'); 256 $erreurs['recherche'] = _T('info_obligatoire'); 257 } 252 258 } 253 259 … … 276 282 $erreurs = array(); 277 283 284 // Il est cette fois indispensable de vérifier à nouveau les valeurs de l'étape 2 si on est dans une l'étape 3 285 // car on a besoin de l'espèce et de ses ascendants jusqu'au genre compris. 278 286 if ($tsn = intval(_request('tsn'))) { 279 287 // On récupère les informations de base du taxon afin de les présenter à l'utilisateur pour validation … … 298 306 299 307 // On récupère la hiérarchie complète du taxon à partir de la base ITIS. 300 $hierarchie = itis_get_information('hierarchyfull', $espece['tsn']); 301 $ascendants = $hierarchie['ascendants']; 308 // Comme la hiérarchie intègre aussi le taxon concerné on le supprime (dernière position). 309 $ascendants = itis_get_information('hierarchyfull', $espece['tsn']); 310 unset($ascendants[count($ascendants) - 1]); 302 311 303 312 // On classe la liste des ascendants du plus proche au plus éloigné. … … 355 364 356 365 // On range la liste des taxons de plus haut rang (genre) à celui de plus petit rang et on ajoute le 357 // taxon espèce en fin de liste. 366 // taxon espèce en fin de liste. La variable _parents est toujours un tableau d'au moins une unité et 367 // l'espèce existe toujours. 358 368 $taxons = _request('_parents'); 359 369 $taxons[] = _request('_espece'); -
_plugins_/taxonomie/trunk/services/itis/itis_api.php
r113783 r113806 506 506 $information = array(); 507 507 if (!empty($data)) { 508 // On vérifie si une fonction de post-formatage existe 508 509 $format = "itis_format_$action"; 509 if (function_exists($format)) { 510 $information = $format($tsn, $data, $index); 511 } else { 512 foreach ($data as $_data) { 513 $item = array(); 514 foreach ($index as $_key_information => $_key_data) { 515 $item[$_key_information] = $_data[$_key_data]; 516 } 517 $information[] = $item; 510 if (!function_exists($format)) { 511 $format = ''; 512 } 513 foreach ($data as $_data) { 514 $item = array(); 515 // On construit le tableau de l'item brut correspondant à la configuration de l'action 516 foreach ($index as $_key_information => $_key_data) { 517 $item[$_key_information] = $_data[$_key_data]; 518 518 } 519 // Si un formatage existe on formate l'item avant de l'ajouter au tableau de sortie. 520 $information[] = $format ? $format($item) : $item; 519 521 } 520 522 } … … 911 913 912 914 // ---------------------------------------------------------------- 915 // ---------- Fonctions internes de formatage des sorties --------- 916 // ---------------------------------------------------------------- 917 918 /** 919 * Formatage d'un item de la liste des ascendants d'un taxon. 920 * 921 * @internal 922 * 923 * @param array $item 924 * Tableau extrait du service get et représentant un taxon ascendant. Les valeurs sont insérées btutes. 925 * 926 * @return array 927 * Tableau dont les valeurs ont été formatées (rang taxonomique en minuscules). 928 */ 929 function itis_format_hierarchyfull($item) { 930 931 // Le formatage d'un item de la hiérarchie consiste uniquement à passer en minuscule l'identifiant du rang. 932 if (isset($item['rang_taxon'])) { 933 $item['rang_taxon'] = strtolower($item['rang_taxon']); 934 } 935 936 return $item; 937 } 938 939 940 // ---------------------------------------------------------------- 913 941 // ------------ Fonctions internes utilisées par l'API ------------ 914 942 // ----------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.