Valider bdfc4d15 rédigé par Eric Lupinacci's avatar Eric Lupinacci
Parcourir les fichiers

Vérifier la compatibilité du serveur Nomenclatures et de la version de Territoires

parent cbedc425
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+3 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -6,7 +6,8 @@
	<form method="post" action="#ENV{action}">
		<div>
			#ACTION_FORMULAIRE{#ENV{action}}
			<p class="explication"><:territoires:explication_peupler_form:></p>
			[<p class="explication">(#ENV{_explication})</p>]
			[<p class="attention">(#ENV{_attention})</p>]
			<div class="editer-groupe">[
			(#ENV{editable})
				[(#SAISIE{radio, action_territoire,
@@ -34,7 +35,7 @@
				</div>

				[(#SAISIE{checkbox_flex, territoires,
					explication=#ENV{_explication},
					explication=#ENV{_explication_checkbox},
					label=<:territoires:label_peupler_territoire:>,
					data=#ENV{_donnees},
					obligatoire=oui,
+97 −81
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -23,7 +23,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
 *               - `_actions_disable`   : (affichage) liste des actions désactivées (`depeupler` si aucun pays n`est chargé)
 *               - `_action_defaut`     : (affichage) action sélectionnée par défaut, `peupler`
 *               - `_donnees`           : (affichage) liste des ensembles de territoires pouvant être chargés.
 *               - `_explication`       : (affichage) explication sur les infrasubdivisions.
 *               - `_explication_infra` : (affichage) explication sur les infrasubdivisions.
 *               - `_classe_conteneur`  : (affichage) classe pour forcer un conteneur flex pour les checkbox.
 *               - `_max_choix`         : (affichage) limiter le nombre de choix à 1 pour les infrasubdivisions.
 */
@@ -32,6 +32,8 @@ function formulaires_peupler_territoires_charger(string $groupe) : array {
	$valeurs = [
		'_groupe'             => $groupe,
		'_explication'        => '',
		'_attention'          => '',
		'_explication_infra'  => '',
		'_actions_territoire' => [],
		'_action_defaut'      => 'charger',
		'_actions_disable'    => [],
@@ -42,6 +44,15 @@ function formulaires_peupler_territoires_charger(string $groupe) : array {
		'editable'            => true,
	];

	// Vérifier que la version du serveur est compatible avec celle du plugin Territoires.
	// Si ce n'est pas le cas, on affiche un message d'erreur et on rend le formulaire non éditable.
	if (
		include_spip('territoires/territoires')
		and territoires_feed_serveur_est_compatible('territoires')
	) {
		// Explication générale du formulaire
		$valeurs['_explication'] = _T('territoires:explication_peupler_form');

		// Lister les actions sur les territoires
		// -- le groupe 'zone_country' des régions et pays ne doit jamais être supprimé
		$valeurs['_actions_territoire'] = [
@@ -93,7 +104,7 @@ function formulaires_peupler_territoires_charger(string $groupe) : array {
			if ($groupe === 'subdivision') {
				$valeurs['_classe_conteneur'] = 'pleine_largeur';
			} elseif ($groupe === 'infrasubdivision') {
			$valeurs['_explication'] = _T('territoires:explication_infrasubdivision_territoire');
				$valeurs['_explication_infra'] = _T('territoires:explication_infrasubdivision_territoire');
				$valeurs['_max_choix'] = 1;
			} elseif ($groupe === 'protected_area') {
				$valeurs['_choix_multi_col'] = 3;
@@ -136,6 +147,11 @@ function formulaires_peupler_territoires_charger(string $groupe) : array {
		if (!$valeurs['_donnees']) {
			$valeurs['editable'] = false;
		}
	} else {
		// Expliquer le problème
		$valeurs['_attention'] = _T('territoires:msg_serveur_erreur');
		$valeurs['editable'] = false;
	}

	return $valeurs;
}
+10 −8
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -2,7 +2,7 @@
/**
 * Ce fichier contient la fonction de requêtage des données du plugin Nomenclatures via son API REST.
 *
 * @package SPIP\TERRITOIRES\API
 * @package SPIP\TERRITOIRES\SERVICES
 */
if (!defined('_ECRIRE_INC_VERSION')) {
	return;
@@ -27,8 +27,8 @@ if (!defined('_TERRITOIRE_COEFF_MAX_DISTANT')) {
 * @uses recuperer_url()
 *
 * @param string      $url_base   Endpoint du serveur Nomenclatures
 * @param string   $collection Nom de la collection
 * @param array    $filtres    Tableau des filtres à appliquer à la collection
 * @param null|string $collection Nom de la collection ou vide si on veut récupérer l'index des collections du serveur.
 * @param null|array  $filtres    Tableau des filtres à appliquer à la collection
 * @param null|int    $taille_max Taille maximale du flux récupéré suite à la requête.
 *                                La valeur entière `0` désigne la taille par défaut.
 *
@@ -39,10 +39,12 @@ if (!defined('_TERRITOIRE_COEFF_MAX_DISTANT')) {
 *               La valeur 200 permet de tester une requête réussie et dans ce cas
 *               l'index `page` du flux reçu est retourné après décodage JSON.
 */
function inc_requeter_isocode_dist(string $url_base, string $collection, array $filtres, ?int $taille_max = 0) : array {
function inc_requeter_isocode_dist(string $url_base, ?string $collection = '', ?array $filtres = [], ?int $taille_max = 0) : array {
	// Calcul de l'url complète
	// -- initialisation
	$url = "{$url_base}/{$collection}";
	$url = $collection
		? "{$url_base}/{$collection}"
		: $url_base;
	// -- ajout des filtres
	foreach ($filtres as $_critere => $_valeur) {
		$url .= "&{$_critere}={$_valeur}";
+2 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -59,7 +59,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = [

	// S
	'msg_vider_zone_erreur'               => 'Une erreur s\'est produite lors du vidage des régions du monde.',
	'msg_videer_zone_notice'              => 'Aucun vidage n\'est nécessaire pour les régions du monde.',
	'msg_vider_zone_notice'               => 'Aucun vidage n\'est nécessaire pour les régions du monde.',
	'msg_vider_zone_succes'               => 'Les régions du monde ont bien été vidées.',
	'msg_charger_zone_erreur'             => 'Une erreur s\'est produite lors du peuplement des régions du monde.',
	'msg_charger_zone_notice'             => 'Aucune mise à jour n\'est nécessaire pour les régions du monde.',
@@ -89,6 +89,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = [
	'msg_charger_infrasubdivision_notice' => 'Aucune mise à jour n\'est nécessaire pour les infra-subdivisions du ou des pays « @pays@ ».',
	'msg_charger_infrasubdivision_succes' => 'Les infra-subdivisions du ou des pays « @pays@ » ont bien été chargées.',
	'msg_succes_asynchrone'               => 'Certains peuplements ont été lancés en asynchrone. Ils seront disponibles dans quelques instants.',
	'msg_serveur_erreur'                  => 'Le serveur Nomenclatures configuré n\'est pas compatible avec la version courante du plugin Territoires.',

	// T
	'territoires_titre'       => 'Territoires',
+56 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php
/**
 * Ce fichier contient les fonctions de service nécessitées par l'utilisation du plugin `Territoires`.
 *
 * @package SPIP\TERRITOIRES\SERVICES
 */
if (!defined('_ECRIRE_INC_VERSION')) {
	return;
@@ -13,6 +15,13 @@ if (!defined('_TERRITOIRE_URL_BASE_ISOCODE')) {
	define('_TERRITOIRE_URL_BASE_ISOCODE', 'https://contrib.spip.net/http.api/ezrest');
}

if (!defined('_TERRITOIRE_COMPATIBILITE_ISOCODE')) {
	/**
	 * Endpoint de l'API REST hébergeant les données de Nomenclatures.
	 */
	define('_TERRITOIRE_COMPATIBILITE_ISOCODE', ['vmin' => '2.0.1']);
}

// -----------------------------------------------------------------------
// ------------------- SERVICES RELATIFS AUX FEEDS -----------------------
// -----------------------------------------------------------------------
@@ -114,6 +123,53 @@ function territoires_feed_acquerir(string $plugin, array $categories_feed) : arr
	return $feeds[$index] ?? [];
}

/**
 * Liste les feeds fournissant des informations de territoires d'une nature donnée exprimée sous la forme
 * de catégories.
 *
 * @param string $plugin Préfixe du plugin appelant.
 *
 * @return bool `true` si le serveur est compatible avec la version du plugin appelant ou `false` sinon.
 */
function territoires_feed_serveur_est_compatible(string $plugin) : bool {
	// Initialisation de la sortie et de l'index des collections du serveur.
	$est_compatible = false;
	static $index_collections = [];

	// Identifier l'url de base pour le plugin appelant
	include_spip('territoires/territoires');
	$url_base = territoires_feed_initialiser_url_base($plugin);

	// Acquérir l'index des collections du serveur
	if (!$index_collections) {
		// Appel à l'API REST de Nomenclatures
		$requeter = charger_fonction('requeter_isocode', 'inc');
		$reponse = $requeter($url_base);
		if ((int) ($reponse['erreur']['status']) === 200) {
			$index_collections = $reponse['donnees'];
		}
	}

	// Vérifier la compatibilité avec le plugin Nomenclatures qui fournit les données.
	$version_serveur = $index_collections['isocode']['fournisseur']['version'] ?? '';
	if ($version_serveur) {
		// on collecte les bornes min et max de compatibilité
		$vmin = _TERRITOIRE_COMPATIBILITE_ISOCODE['vmin'] ?? '0.0.0';
		$vmax = _TERRITOIRE_COMPATIBILITE_ISOCODE['vmax'] ?? '999.999.999';

		// vérifier si la version du serveur est comprise entre les bornes admissibles
		include_spip('inc/utils');
		if (
			spip_version_compare($vmin, $version_serveur, '<=')
			and spip_version_compare($vmax, $version_serveur, '>=')
		) {
			$est_compatible = true;
		}
	}

	return $est_compatible;
}

// -----------------------------------------------------------------------
// ------------ SERVICES RELATIFS AUX UNITES DE PEUPLEMENT ---------------
// -----------------------------------------------------------------------