Changeset 125372 in spip-zone


Ignore:
Timestamp:
Jul 22, 2020, 9:36:49 AM (2 weeks ago)
Author:
Eric Lupinacci
Message:

Mise en place du peuplement des tables par API REST.
Utilisation de ce mode pour les contours des subdivisions françaises.

Location:
_plugins_/isocode/trunk
Files:
2 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/isocode/trunk

    • Property subgit:lock:11ac60c80a2c4883fdb5e78bf17ed6b6bab000f3 deleted
    • Property subgit:lock:666441f879c162b12166c3b7735e8df7edd49d3a set to 2020-07-22T11:38:16.112
  • _plugins_/isocode/trunk/ezrest/isocode.php

    r125370 r125372  
    314314        // -- Rangement de la liste dans l'index contours
    315315        $contours['contours'] = sql_allfetsel($select, $from, $where);
     316        foreach ($contours['contours'] as $_cle => $_contour) {
     317                $contours['contours'][$_cle]['geometry'] = json_decode($_contour['geometry'], true);
     318        }
    316319
    317320        // La liste est enrichie par défaut:
  • _plugins_/isocode/trunk/inc/isocode_utils.php

    r125366 r125372  
    2222if (!defined('_ISOCODE_GEOMETRIE_MAX_INSERT')) {
    2323        define('_ISOCODE_GEOMETRIE_MAX_INSERT', 50);
     24}
     25
     26if (!defined('_ISOCODE_COEFF_MAX_DISTANT')) {
     27        define('_ISOCODE_COEFF_MAX_DISTANT', 5);
    2428}
    2529
     
    342346                }
    343347        } elseif ($config['populating'] === 'api_rest') {
    344                 // TODO à compléter
    345                 $contenu_decode = array();
    346 
    347                 // Si un noeud est fourni inutile de se trimbaler tout le tableau, on se restreint
    348                 // au noeud fourni.
    349                 include_spip('inc/filtres');
    350                 if (!empty($config['node'])) {
    351                         $contenu_fichier = table_valeur($contenu_decode, $config['node'], array());
     348                // On considère que l'API REST renvoie soit le format JSON soit le format XML
     349                // -- acquisition des données spécifiées par l'url
     350                include_spip('inc/distant');
     351                $options = array(
     352                        'transcoder' => true,
     353                        'taille_max' => _INC_DISTANT_MAX_SIZE * _ISOCODE_COEFF_MAX_DISTANT,
     354                );
     355                $flux = recuperer_url($config['url'], $options);
     356
     357        // Initialisation de la réponse et du bloc d'erreur normalisé.
     358                if (!empty($flux['page']) and ($sha = sha1($flux['page']))) {
     359                        $contenu = decoder_xml_json($flux['page'], $config);
    352360                }
    353361        } else {
     
    391399                                        include_spip('inc/flock');
    392400                                        lire_fichier($_fichier, $contenu_brut);
    393                                         $contenu_fichier = ($config['populating'] === 'file_xml')
    394                                                 ? json_decode(json_encode(simplexml_load_string($contenu_brut)), true)
    395                                                 : json_decode($contenu_brut, true);
    396 
    397                                         // Si un noeud est fourni inutile de se trimbaler tout le tableau, on se restreint
    398                                         // au noeud fourni.
    399                                         include_spip('inc/filtres');
    400                                         if (!empty($config['node'])) {
    401                                                 $contenu_fichier = table_valeur($contenu_fichier, $config['node'], array());
    402                                         }
     401                                        $contenu_fichier = decoder_xml_json($contenu_brut, $config);
    403402                                }
    404403                                // On additionne les contenus de chaque fichier
     
    480479                        $element[$_champ] = $type;
    481480                } elseif (substr($_valeur, 0, 1) === '/') {
    482                         // -- la valeur de l'index de config identifié par la nom après le /
     481                        // -- la valeur de l'index de config identifié par la chaine après le /
    483482                        $index = ltrim($_valeur, '/');
    484483                        if ($valeur = table_valeur($config, $index, '')) {
     
    577576        }
    578577}
     578
     579function decoder_xml_json($xml_json, $config) {
     580
     581        // Initialisation du contenu décodé
     582        $contenu = array();
     583
     584        if ($config['extension'] == '.xml') {
     585                // Pouvoir attraper les erreurs de simplexml_load_string().
     586                // http://stackoverflow.com/questions/17009045/how-do-i-handle-warning-simplexmlelement-construct/17012247#17012247
     587                set_error_handler(
     588                        function ($erreur_id, $erreur_message, $erreur_fichier, $erreur_ligne) {
     589                                throw new Exception($erreur_message, $erreur_id);
     590                        }
     591                );
     592
     593                try {
     594                        $contenu = json_decode(json_encode(simplexml_load_string($xml_json)), true);
     595                } catch (Exception $erreur) {
     596                        restore_error_handler();
     597                        spip_log("Erreur d'analyse XML pour l'URL `{$config['url']}` : " . $erreur->getMessage(), 'isocode' . _LOG_ERREUR);
     598                }
     599                restore_error_handler();
     600        } elseif ($config['extension'] == '.json') {
     601                // Transformation de la chaîne json reçue en tableau associatif
     602                try {
     603                        $contenu = json_decode($xml_json, true);
     604                } catch (Exception $erreur) {
     605                        spip_log("Erreur d'analyse JSON pour l'URL `{$config['url']}` : " . $erreur->getMessage(), 'isocode' . _LOG_ERREUR);
     606                }
     607        }
     608
     609        // Si un noeud est fourni inutile de se trimbaler tout le tableau, on se restreint
     610        // au noeud fourni.
     611        if ($contenu) {
     612                include_spip('inc/filtres');
     613                if (!empty($config['node'])) {
     614                        $contenu = table_valeur($contenu, $config['node'], array());
     615                }
     616        }
     617
     618        return $contenu;
     619}
  • _plugins_/isocode/trunk/isocode_administrations.php

    r125360 r125372  
    4040        );
    4141
    42         $maj['2'] = array(
    43                 array(
    44                         'maj_tables',
    45                         'spip_geoboundaries'
    46                 ),
    47         );
    48 
    4942        include_spip('base/upgrade');
    5043        maj_plugin($nom_meta_base_version, $version_cible, $maj);
  • _plugins_/isocode/trunk/paquet.xml

    r125360 r125372  
    22        prefix="isocode"
    33        categorie="outil"
    4         version="0.5.0"
     4        version="0.6.0"
    55        etat="dev"
    66        compatibilite="[3.1.0;3.2.*]"
    77        logo="isocode_logo-64.png"
    8         schema="2"
     8        schema="1"
    99>
    1010
  • _plugins_/isocode/trunk/services/geometrie/geometrie_api.php

    r125371 r125372  
    3838                ),
    3939                'label_field'  => false,
    40                 'populating'   => 'file_geojson',
    41                 'multiple'     => false,
     40                'populating'   => 'api_rest',
     41                'url'          => 'https://open.urssaf.fr/api/records/1.0/search/?dataset=contours-geographiques-des-regions-2016&q=&rows=-1',
    4242                'extension'    => '.json',
    4343                'node'         => 'records',
     
    7272                ),
    7373                'label_field'  => false,
    74                 'populating'   => 'file_geojson',
    75                 'multiple'     => false,
     74                'populating'   => 'api_rest',
     75                'url'          => 'https://open.urssaf.fr/api/records/1.0/search/?dataset=contours-geographiques-des-departements-2016&q=&rows=-1',
    7676                'extension'    => '.json',
    7777                'node'         => 'records',
     
    119119        // Et d'apporter des corrections au champs déjà compilés : attention on a encore les index source !!!
    120120        // - serialiser le champs des géométries
    121         $element['geometry'] = serialize($element['geometry']);
     121        $element['geometry'] = json_encode($element['geometry']);
    122122
    123123        return $element;
     
    133133        // Et d'apporter des corrections au champs déjà compilés
    134134        // - serialiser le champs des géométries
    135         $element['geo_shape'] = serialize($element['geo_shape']);
     135        $element['geo_shape'] = json_encode($element['geo_shape']);
    136136
    137137        return $element;
     
    147147        // Et d'apporter des corrections au champs déjà compilés
    148148        // - serialiser le champs des géométries
    149         $element['geo_shape'] = serialize($element['geo_shape']);
     149        $element['geo_shape'] = json_encode($element['geo_shape']);
    150150
    151151        return $element;
Note: See TracChangeset for help on using the changeset viewer.