You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
territoires/inc/requeter_isocode.php

75 lines
2.6 KiB
PHP

<?php
/**
* Ce fichier contient la fonction de requêtage des données du plugin Nomenclatures via son API REST.
*
* @package SPIP\TERRITOIRES\API
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
if (!defined('_TERRITOIRE_COEFF_MAX_DISTANT')) {
/**
* Coefficient multiplicateur de la constante SPIP `_INC_DISTANT_MAX_SIZE` permettant de calculer la taille max
* d'une réponse à `recuperer_url()` si aucune taille n'est précisée dans l'appel.
*/
define('_TERRITOIRE_COEFF_MAX_DISTANT', 8);
}
/**
* Renvoie, à partir de l'url du service, le tableau des données demandées.
* Le service utilise dans ce cas une chaine JSON qui est décodée pour fournir
* le tableau de sortie. Le flux retourné par le service est systématiquement
* transcodé dans le charset du site avant d'être décodé.
*
* @api
*
* @uses recuperer_url()
*
* @param mixed $url_base Endpoint du serveur Nomenclatures
* @param mixed $collection Nom de la collection
* @param mixed $filtres Tableau des filtres à appliquer à la collection
* @param null|int $taille_max Taille maximale du flux récupéré suite à la requête.
* `null` désigne la taille par défaut.
*
* @return array Tableau de la réponse. Si l'index `erreur est présent c'est que la requête s'est mal déroulée`et
* la valeur retournée est une chaine qui identifie l'erreur.
* Sinon, l'index `page` du flux reçu est retourné après décodage JSON.
*/
function inc_requeter_isocode_dist($url_base, $collection, $filtres, $taille_max = null) {
// Calcul de l'url complète
// -- initialisation
$url = "${url_base}/${collection}";
// -- ajout des filtres
foreach ($filtres as $_critere => $_valeur) {
$url .= "&${_critere}=${_valeur}";
}
// Options de la fonction de récupération du JSON
include_spip('inc/distant');
$options = array(
'transcoder' => true,
'taille_max' => $taille_max ? $taille_max : _INC_DISTANT_MAX_SIZE * _TERRITOIRE_COEFF_MAX_DISTANT,
);
// Acquisition du flux de données
$flux = recuperer_url($url, $options);
$reponse = array();
if (empty($flux['page'])) {
spip_log("URL indiponible : ${url}", 'territoires' . _LOG_ERREUR);
$reponse['erreur'] = 'url_indisponible';
} else {
try {
// Transformation de la chaîne json reçue en tableau associatif
$reponse = json_decode($flux['page'], true);
} catch (Exception $erreur) {
$reponse['erreur'] = 'analyse_json';
spip_log("Erreur d'analyse JSON pour l'URL `${url}` : " . $erreur->getMessage(), 'territoires' . _LOG_ERREUR);
}
}
return $reponse;
}