Actions qualité sur le code : nettoyage, amélioration, typage des fonctions, PHPDoc systématique.

master v1.4.3
Eric Lupinacci 6 months ago
parent a517573acf
commit 36de43205a

@ -9,37 +9,38 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Cette action permet peupler certains ensembles de territoires contenant un nombre important d'éléments.
* Elle est appelée par l'API `territoire_peupler_asynchrone()`.
*
* Elle ne nécessite les mêmes arguments que la fonction de peuplement.
*
* @uses territoire_peupler()
* @uses territoire_peupler_asynchrone()
*
* @return void
*/
function action_peupler_territoires_dist() {
function action_peupler_territoires_dist() : void {
// Securisation et autorisation.
// L'argument attendu est la page à recharger ou sinon vide pour toutes les pages.
$securiser_action = charger_fonction('securiser_action', 'inc');
$arguments = $securiser_action();
// Structuration des arguments de peuplement
$arguments = explode(':', $arguments);
if (
(count($arguments) > 1)
($arguments = explode(':', $arguments))
and (count($arguments) > 1)
and ($type = $arguments[0])
and ($pays = $arguments[1])
) {
// Identification des options : par défaut on passe l'itération à 0
$options = array('iteration' => 0);
$options = ['iteration' => 0];
unset($arguments[0], $arguments[1]);
foreach ($arguments as $_argument) {
if ($_argument === 'force') {
$options[$_argument] = true;
} elseif (substr($_argument, 0, 4) === 'iter') {
$options['iteration'] = intval(str_replace('iter', '', $_argument));
$options['iteration'] = (int) (str_replace('iter', '', $_argument));
} else {
$options['extras'][] = $_argument;
}

@ -15,10 +15,9 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @param array $interfaces Déclarations d'interface pour le compilateur
*
* @return array Déclarations d'interface pour le compilateur
* @return array Déclarations d'interface mis à jour
*/
function territoires_declarer_tables_interfaces($interfaces) {
function territoires_declarer_tables_interfaces(array $interfaces) : array {
$interfaces['table_des_tables']['territoires'] = 'territoires';
$interfaces['table_des_tables']['territoires_extras'] = 'territoires_extras';
@ -35,15 +34,15 @@ function territoires_declarer_tables_interfaces($interfaces) {
*
* @pipeline declarer_tables_objets_sql
*
* @param array $tables Description des tables
* @param array $tables Description des tables d'objet
*
* @return array Description complétée des tables
* @return array Description complétée des tables d'objet
*/
function territoires_declarer_tables_objets_sql($tables) {
$tables['spip_territoires'] = array(
function territoires_declarer_tables_objets_sql(array $tables) : array {
$tables['spip_territoires'] = [
'type' => 'territoire',
'principale' => 'oui',
'field' => array(
'field' => [
'id_territoire' => 'bigint(21) NOT NULL',
'iso_territoire' => 'varchar(20) NOT NULL DEFAULT ""',
'iso_titre' => 'text NOT NULL DEFAULT ""',
@ -54,26 +53,26 @@ function territoires_declarer_tables_objets_sql($tables) {
'iso_continent' => 'varchar(3) DEFAULT "" NOT NULL',
'iso_pays' => 'varchar(2) NOT NULL DEFAULT ""',
'iso_parent' => 'varchar(20) NOT NULL DEFAULT ""',
'profondeur_type' => "int NOT NULL DEFAULT 0",
'profondeur_type' => 'int NOT NULL DEFAULT 0',
'iso_parent_alt' => 'varchar(20) NOT NULL DEFAULT ""',
'edite' => 'varchar(3) NOT NULL DEFAULT "non"',
'date' => 'datetime NOT NULL DEFAULT "0000-00-00 00:00:00"',
'maj' => 'TIMESTAMP NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'
),
'key' => array(
],
'key' => [
'PRIMARY KEY' => 'id_territoire',
'KEY iso_territoire' => 'iso_territoire',
'KEY iso_parent' => 'iso_parent',
'KEY iso_parent_alt' => 'iso_parent_alt',
'KEY iso_pays' => 'iso_pays',
'KEY iso_continent' => 'iso_continent',
),
],
'titre' => 'nom_usage AS titre, "" AS lang',
'date' => 'date',
'champs_editables' => array('descriptif'),
'champs_versionnes' => array('descriptif'),
'rechercher_champs' => array('iso_territoire' => 10, 'iso_titre' => 5, 'nom_usage' => 5, 'descriptif' => 2),
'tables_jointures' => array('spip_territoires_liens'),
'champs_editables' => ['descriptif'],
'champs_versionnes' => ['descriptif'],
'rechercher_champs' => ['iso_territoire' => 10, 'iso_titre' => 5, 'nom_usage' => 5, 'descriptif' => 2],
'tables_jointures' => ['spip_territoires_liens'],
'texte_retour' => 'icone_retour',
'texte_objets' => 'territoire:titre_territoires',
@ -85,7 +84,7 @@ function territoires_declarer_tables_objets_sql($tables) {
'info_nb_objets' => 'territoire:info_nb_territoires',
'texte_logo_objet' => 'territoire:titre_logo_territoire',
'texte_langue_objet' => 'territoire:titre_langue_territoire',
);
];
return $tables;
}
@ -94,54 +93,53 @@ function territoires_declarer_tables_objets_sql($tables) {
* Déclaration des tables secondaires (liaisons).
* Le plugin Territoires déclare 2 nouvelle tables auxilliaire:
* - celle des liens, `spip_territoires_liens`
* - celle des caractéristiques complémentaires, `spip_territoires_extras`
* - celle des caractéristiques complémentaires, `spip_territoires_extras`.
*
* @pipeline declarer_tables_auxiliaires
*
* @param array $tables Description des tables
* @param array $tables Description des tables auxilliaires
*
* @return array Description complétée des tables
* @return array Description complétée des tables auxilliaires
*/
function territoires_declarer_tables_auxiliaires($tables) {
function territoires_declarer_tables_auxiliaires(array $tables) : array {
// Table d'extensions des données d'un territoire :
// -- contient les codes alternatifs, les caractéristiques géographiques (superficie, population...) ou autres.
$tables['spip_territoires_extras'] = array(
'field' => array(
'iso_territoire' => 'varchar(20) NOT NULL DEFAULT ""',
'extra' => 'varchar(255) NOT NULL DEFAULT ""', // type d'attribut (unique pour un territoire)
'valeur' => 'text DEFAULT ""', // valeur quelconque comme une meta
'type_extra' => 'varchar(4) DEFAULT "" NOT NULL', // type du champ extra (code ou info)
'type' => 'varchar(20) DEFAULT "" NOT NULL', // recopie du champ de spip_territoires (optimisation)
'iso_pays' => 'varchar(2) DEFAULT "" NOT NULL', // recopie du champ de spip_territoires (optimisation)
'maj' => 'timestamp NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp'
),
'key' => array(
'PRIMARY KEY' => 'iso_territoire,extra',
'KEY extra' => 'extra',
'KEY type_extra' => 'type_extra',
'KEY type' => 'type',
'KEY iso_pays' => 'iso_pays',
)
);
$tables['spip_territoires_extras'] = [
'field' => [
'iso_territoire' => 'varchar(20) NOT NULL DEFAULT ""',
'extra' => 'varchar(255) NOT NULL DEFAULT ""', // type d'attribut (unique pour un territoire)
'valeur' => 'text DEFAULT ""', // valeur quelconque comme une meta
'type_extra' => 'varchar(4) DEFAULT "" NOT NULL', // type du champ extra (code ou info)
'type' => 'varchar(20) DEFAULT "" NOT NULL', // recopie du champ de spip_territoires (optimisation)
'iso_pays' => 'varchar(2) DEFAULT "" NOT NULL', // recopie du champ de spip_territoires (optimisation)
'maj' => 'timestamp NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp'
],
'key' => [
'PRIMARY KEY' => 'iso_territoire,extra',
'KEY extra' => 'extra',
'KEY type_extra' => 'type_extra',
'KEY type' => 'type',
'KEY iso_pays' => 'iso_pays',
]
];
// Table de liens avec les autres objets SPIP
$tables['spip_territoires_liens'] = array(
'field' => array(
$tables['spip_territoires_liens'] = [
'field' => [
'id_territoire' => 'bigint(21) DEFAULT "0" NOT NULL',
'objet' => 'varchar(25) DEFAULT "" NOT NULL',
'id_objet' => 'bigint(21) DEFAULT "0" NOT NULL',
'role' => 'varchar(30) NOT NULL DEFAULT ""',
'vu' => 'varchar(6) DEFAULT "non" NOT NULL',
),
'key' => array(
],
'key' => [
'PRIMARY KEY' => 'id_territoire,id_objet,objet,role',
'KEY id_territoire' => 'id_territoire',
'KEY objet' => 'objet',
'KEY id_objet' => 'id_objet',
'KEY role' => 'role'
)
);
]
];
return $tables;
}

@ -1,6 +1,6 @@
<?php
/**
* Ce fichier contient les fonctions de service nécessitées par le plugin Cache Factory.
* Ce fichier contient les fonctions de service nécessitées par l'utilisation du plugin Cache Factory.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
@ -9,27 +9,25 @@ if (!defined('_ECRIRE_INC_VERSION')) {
/**
* Renvoie la configuration spécifique des caches de Rainette.
*
* @param string $plugin Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier ou
* un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
* @param string $plugin Préfixe du plugin, à savoir, `territoires`.
*
* @return array Tableau de la configuration des types de cache du plugin.
* @return array<string, mixed> Tableau de la configuration brute du plugin Territoires
*/
function territoires_cache_configurer($plugin) {
function territoires_cache_configurer(string $plugin) : array {
// Initialisation du tableau de configuration avec les valeurs par défaut du plugin Cache.
$configuration = array(
'asynchrone' => array(
$configuration = [
'asynchrone' => [
'racine' => '_DIR_TMP',
'sous_dossier' => false,
'nom_obligatoire' => array('type', 'pays', 'fonction'),
'nom_facultatif' => array(),
'nom_obligatoire' => ['type', 'pays', 'fonction'],
'nom_facultatif' => [],
'extension' => '.php',
'securisation' => true,
'serialisation' => true,
'separateur' => '_',
'conservation' => 0
),
);
],
];
return $configuration;
}

@ -1,10 +1,9 @@
<?php
/**
* Gestion du formulaire de d'édition de territoire
* Gestion du formulaire de d'édition de territoire.
*
* @package SPIP\TERRITOIRES\UI
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -12,132 +11,102 @@ if (!defined('_ECRIRE_INC_VERSION')) {
include_spip('inc/actions');
include_spip('inc/editer');
/**
* Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
* Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité.
*
* @param int|string $id_territoire Identifiant du territoire. 'new' pour un nouveau territoire.
* @param string $retour URL de redirection après le traitement
* @param string $associer_objet Éventuel `objet|x` indiquant de lier le territoire créé à cet objet,
* tel que `article|3`
* @param int $lier_trad Identifiant éventuel d'un territoire source d'une traduction
* @param string $config_fonc Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row Valeurs de la ligne SQL du territoire, si connu
* @param string $hidden Contenu HTML ajouté en même temps que les champs cachés du formulaire.
*
* @param int|string $id_territoire
* Identifiant du territoire. 'new' pour un nouveau territoire.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le territoire créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un territoire source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du territoire, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return string
* Hash du formulaire
* @return string Hash du formulaire
*/
function formulaires_editer_territoire_identifier_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
return serialize(array(intval($id_territoire), $associer_objet));
function formulaires_editer_territoire_identifier_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = [], $hidden = '') {
return serialize([(int) $id_territoire, $associer_objet]);
}
/**
* Chargement du formulaire d'édition de territoire
* Chargement du formulaire d'édition de territoire.
*
* Déclarer les champs postés et y intégrer les valeurs par défaut
*
* @uses formulaires_editer_objet_charger()
*
* @param int|string $id_territoire
* Identifiant du territoire. 'new' pour un nouveau territoire.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le territoire créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un territoire source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du territoire, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Environnement du formulaire
* @param int|string $id_territoire Identifiant du territoire. 'new' pour un nouveau territoire.
* @param string $retour URL de redirection après le traitement
* @param string $associer_objet Éventuel `objet|x` indiquant de lier le territoire créé à cet objet,
* tel que `article|3`
* @param int $lier_trad Identifiant éventuel d'un territoire source d'une traduction
* @param string $config_fonc Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row Valeurs de la ligne SQL du territoire, si connu
* @param string $hidden Contenu HTML ajouté en même temps que les champs cachés du formulaire.
*
* @return array Environnement du formulaire
*/
function formulaires_editer_territoire_charger_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
function formulaires_editer_territoire_charger_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = [], $hidden = '') {
$valeurs = formulaires_editer_objet_charger('territoire', $id_territoire, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
return $valeurs;
}
/**
* Vérifications du formulaire d'édition de territoire
* Vérifications du formulaire d'édition de territoire.
*
* Vérifier les champs postés et signaler d'éventuelles erreurs
*
* @uses formulaires_editer_objet_verifier()
*
* @param int|string $id_territoire
* Identifiant du territoire. 'new' pour un nouveau territoire.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le territoire créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un territoire source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du territoire, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Tableau des erreurs
* @param int|string $id_territoire Identifiant du territoire. 'new' pour un nouveau territoire.
* @param string $retour URL de redirection après le traitement
* @param string $associer_objet Éventuel `objet|x` indiquant de lier le territoire créé à cet objet,
* tel que `article|3`
* @param int $lier_trad Identifiant éventuel d'un territoire source d'une traduction
* @param string $config_fonc Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row Valeurs de la ligne SQL du territoire, si connu
* @param string $hidden Contenu HTML ajouté en même temps que les champs cachés du formulaire.
*
* @return array Tableau des erreurs
*/
function formulaires_editer_territoire_verifier_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$erreurs = array();
function formulaires_editer_territoire_verifier_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = [], $hidden = '') {
$erreurs = formulaires_editer_objet_verifier('territoire', $id_territoire);
return $erreurs;
}
/**
* Traitement du formulaire d'édition de territoire
* Traitement du formulaire d'édition de territoire.
*
* Traiter les champs postés
*
* @uses formulaires_editer_objet_traiter()
*
* @param int|string $id_territoire
* Identifiant du territoire. 'new' pour un nouveau territoire.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le territoire créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un territoire source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du territoire, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Retours des traitements
* @param int|string $id_territoire Identifiant du territoire. 'new' pour un nouveau territoire.
* @param string $retour URL de redirection après le traitement
* @param string $associer_objet Éventuel `objet|x` indiquant de lier le territoire créé à cet objet,
* tel que `article|3`
* @param int $lier_trad Identifiant éventuel d'un territoire source d'une traduction
* @param string $config_fonc Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row Valeurs de la ligne SQL du territoire, si connu
* @param string $hidden Contenu HTML ajouté en même temps que les champs cachés du formulaire.
*
* @return array Retours des traitements
*/
function formulaires_editer_territoire_traiter_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
function formulaires_editer_territoire_traiter_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = [], $hidden = '') {
$retours = formulaires_editer_objet_traiter('territoire', $id_territoire, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
// Un lien a prendre en compte ?
if ($associer_objet and $id_territoire = $retours['id_territoire']) {
list($objet, $id_objet) = explode('|', $associer_objet);
[$objet, $id_objet] = explode('|', $associer_objet);
if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) {
include_spip('action/editer_liens');
objet_associer(array('territoire' => $id_territoire), array($objet => $id_objet));
objet_associer(['territoire' => $id_territoire], [$objet => $id_objet]);
if (isset($retours['redirect'])) {
$retours['redirect'] = parametre_url($retours['redirect'], 'id_lien_ajoute', $id_territoire, '&');
}

@ -15,33 +15,31 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @uses territoires_acquerir()
* @uses territoire_est_peuple()
*
* @return array
* Tableau des données à charger par le formulaire (affichage). Aucune donnée chargée n'est un
* champ de saisie, celle-ci sont systématiquement remises à zéro.
* - `_actions_peuplement`: (affichage) alias et libellés des actions possibles, `peupler` et `depeupler`
* - `_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`
* - `_types` : (affichage) types region et pays.
* - `_pays` : (affichage) pays avec leur code et leur nom ISO dont les subdivisions sont disponibles.
* @return array Tableau des données à charger par le formulaire (affichage). Aucune donnée chargée n'est un
* champ de saisie, celle-ci sont systématiquement remises à zéro.
* - `_actions_peuplement`: (affichage) alias et libellés des actions possibles, `peupler` et `depeupler`
* - `_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`
* - `_types` : (affichage) types region et pays.
* - `_pays` : (affichage) pays avec leur code et nom ISO dont les subdivisions sont disponibles.
*/
function formulaires_peupler_territoires_charger() {
function formulaires_peupler_territoires_charger() : array {
// Initialisation des valeurs à transmettre au formulaire
$valeurs = array();
$valeurs = [];
// Lister les actions sur les tables
$valeurs['_actions_territoire'] = array(
'peupler' => _T('territoires:option_peupler_action'),
'depeupler' => _T('territoires:option_depeupler_action')
);
$valeurs['_actions_territoire'] = [
'peupler' => _T('territoires:option_peupler_action'),
'depeupler' => _T('territoires:option_depeupler_action')
];
// Initialiser la liste des types de territoire disponibles (régions, pays)
include_spip('inc/territoire');
$un_territoire_charge = false;
$valeurs['_types'] = array(
'zone' => _T('territoires:option_zone_territoire'),
'country' => _T('territoires:option_country_territoire'),
);
$valeurs['_types'] = [
'zone' => _T('territoires:option_zone_territoire'),
'country' => _T('territoires:option_country_territoire'),
];
// -- indiquer les territoires déjà chargés
foreach ($valeurs['_types'] as $_type => $_label) {
if (territoire_est_peuple($_type)) {
@ -52,11 +50,11 @@ function formulaires_peupler_territoires_charger() {
// Acquérir la liste des pays dont les subdivisions sont disponibles
include_spip('inc/territoires_utils');
$options = array(
$options = [
'exclure' => 'alternates,subdivisions',
'index' => 'pays'
);
$valeurs['_pays'] = territoires_acquerir('subdivision', array(), $options);
];
$valeurs['_pays'] = territoires_acquerir('subdivision', [], $options);
// -- indiquer les territoires déjà chargés
foreach ($valeurs['_pays'] as $_code => $_pays) {
$pays = extraire_multi($_pays);
@ -69,11 +67,11 @@ function formulaires_peupler_territoires_charger() {
// Acquérir la liste des pays dont les infra subdivisions sont disponibles et dont les subdivisions sont déjà
// chargées.
$options = array(
$options = [
'exclure' => 'alternates,infrasubdivisions',
'index' => 'pays'
);
$infrasubdivisions = territoires_acquerir('infrasubdivision', array(), $options);
];
$infrasubdivisions = territoires_acquerir('infrasubdivision', [], $options);
// -- indiquer les territoires déjà chargés
foreach ($infrasubdivisions as $_code => $_pays) {
if (territoire_est_peuple('subdivision', $_code)) {
@ -87,13 +85,13 @@ function formulaires_peupler_territoires_charger() {
}
// Ne pas sélectionner un type ou un pays par défaut
set_request('types', array());
set_request('pays', array());
set_request('pays_infra', array());
set_request('types', []);
set_request('pays', []);
set_request('pays_infra', []);
// Désactiver l'action vider si aucun pays encore chargé
if (!$un_territoire_charge) {
$valeurs['_actions_disable'] = array('depeupler' => 'oui');
$valeurs['_actions_disable'] = ['depeupler' => 'oui'];
$valeurs['_action_defaut'] = 'peupler';
}
@ -104,11 +102,10 @@ function formulaires_peupler_territoires_charger() {
* Vérification des saisies : il est indispensable de choisir une action (`depeupler` ou `peupler`) et
* au moins un territoire.
*
* @return array
* Tableau des erreurs sur l'action et/ou le pays ou tableau vide si aucune erreur.
* @return array Tableau des erreurs sur l'action et/ou le pays ou tableau vide si aucune erreur.
*/
function formulaires_peupler_territoires_verifier() {
$erreurs = array();
function formulaires_peupler_territoires_verifier() : array {
$erreurs = [];
if (!_request('action_territoire')) {
$erreurs['action_territoire'] = _T('info_obligatoire');
@ -131,17 +128,15 @@ function formulaires_peupler_territoires_verifier() {
* @uses territoire_depeupler()
* @uses formulaires_peupler_territoires_notifier()
*
* @return array
* Tableau retourné par le formulaire contenant toujours un message de bonne exécution ou
* d'erreur. L'indicateur editable est toujours à vrai.
* @return array Tableau retourné par le formulaire contenant toujours un message de bonne exécution ou
* d'erreur. L'indicateur editable est toujours à vrai.
*/
function formulaires_peupler_territoires_traiter() {
function formulaires_peupler_territoires_traiter() : array {
// Initialisation des messages de retour
$retour = array(
$retour = [
'message_ok' => '',
'message_erreur' => ''
);
];
// Acquisition des saisies: comme elles sont obligatoires, il existe toujours une action et un territoire
// à savoir soit un type région ou pays, soit un pays pour une subdivision.
@ -158,7 +153,7 @@ function formulaires_peupler_territoires_traiter() {
}
// Détermination des options de l'action
$options = array();
$options = [];
$forcer = _request('forcer');
if (
$forcer
@ -166,7 +161,7 @@ function formulaires_peupler_territoires_traiter() {
) {
$options['force'] = true;
}
foreach (array('code', 'info') as $_type_extra) {
foreach (['code', 'info'] as $_type_extra) {
if (_request("extra_{$_type_extra}")) {
$options['extras'][] = $_type_extra;
}
@ -175,7 +170,7 @@ function formulaires_peupler_territoires_traiter() {
// On peuple chaque type (ou type,pays pour les subdivisions).
// (La fonction de chargement lance un vidage préalable si le pays demandé est déjà chargée)
$actionner = "territoire_{$action}";
$statut = array();
$statut = [];
foreach ($types as $_type) {
// Traitement du type en prenant en compte le cas particulier des subdivisions et infra subdivisions.
if ($_type === 'subdivision') {
@ -203,11 +198,12 @@ function formulaires_peupler_territoires_traiter() {
return $retour;
}
/**
* Formate les messages de succès et d'erreur résultant des actions de chargement ou de vidage
* des territoires.
*
* @uses type_est_subdivision()
*
* @param string $type Type de territoire.
* @param array $messages Tableau des messages ok et nok à compléter.
* @param string $action Action venant d'être appliquée à certains pays. Peut prendre les valeurs `peupler` et
@ -222,24 +218,22 @@ function formulaires_peupler_territoires_traiter() {
* - `sync` : indique si le peuplement est synchrone ou asynchrone
* - `job` : id du job si asynchrone
*
* @return array
* Tableau des messages à afficher sur le formulaire:
* - `message_ok` : message sur les types ayant été traités avec succès ou vide sinon.
* - `message_erreur` : message sur les types en erreur ou vide sinon.
* @return array Tableau des messages à afficher sur le formulaire:
* - `message_ok` : message sur les types ayant été traités avec succès ou vide sinon.
* - `message_erreur` : message sur les types en erreur ou vide sinon.
*/
function formulaires_peupler_territoires_notifier($type, $messages, $action, $statuts) {
$variables = array(
'ok' => array(),
'nok' => array(),
'sha' => array(),
);
$statut_global = array(
function formulaires_peupler_territoires_notifier(string $type, array $messages, string $action, array $statuts) : array {
$variables = [
'ok' => [],
'nok' => [],
'sha' => [],
];
$statut_global = [
'ok' => false,
'nok' => false,
'sha' => false,
'sync' => true,
);
];
// On compile la liste des pays traités et un indicateur global pour chaque cas d'erreur.
include_spip('inc/territoires_utils');
@ -268,20 +262,20 @@ function formulaires_peupler_territoires_notifier($type, $messages, $action, $st
// Traitement des succès
if ($statut_global['ok']) {
$messages['message_ok'] .= _T("territoires:msg_{$action}_{$type}_succes", array('pays' => implode(', ', $variables['ok'])));
$messages['message_ok'] .= _T("territoires:msg_{$action}_{$type}_succes", ['pays' => implode(', ', $variables['ok'])]);
if (!$statut_global['sync']) {
$messages['message_ok'] .= '<br />' . _T("territoires:msg_succes_asynchrone");
$messages['message_ok'] .= '<br />' . _T('territoires:msg_succes_asynchrone');
}
}
// Traitement des erreurs
if ($statut_global['nok']) {
$messages['message_erreur'] .= _T("territoires:msg_{$action}_{$type}_erreur", array('pays' => implode(', ', $variables['nok'])));
$messages['message_erreur'] .= _T("territoires:msg_{$action}_{$type}_erreur", ['pays' => implode(', ', $variables['nok'])]);
}
if ($statut_global['sha']) {
$messages['message_erreur'] .= $messages['message_erreur'] ? '<br />' : '';
$messages['message_erreur'] .= _T("territoires:msg_{$action}_{$type}_notice", array('pays' => implode(', ', $variables['sha'])));
$messages['message_erreur'] .= _T("territoires:msg_{$action}_{$type}_notice", ['pays' => implode(', ', $variables['sha'])]);
}
return $messages;
}
}

@ -26,19 +26,18 @@ if (!defined('_TERRITOIRE_COEFF_MAX_DISTANT')) {
*
* @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 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|int $taille_max Taille maximale du flux récupéré suite à la requête.
* `null` désigne la taille par défaut.
* La valeur entière `0` désigne la taille par défaut.
*
* @return array Tableau de la réponse.
* Si l'index `erreur['status']` indique le statut de la réponse.
* 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($url_base, $collection, $filtres, $taille_max = null) {
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}";
@ -49,15 +48,15 @@ function inc_requeter_isocode_dist($url_base, $collection, $filtres, $taille_max
// Options de la fonction de récupération du JSON
include_spip('inc/distant');
$options = array(
$options = [
'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();
$reponse = [];
if (
!$flux
or ($flux['status'] === 404)
@ -85,7 +84,7 @@ function inc_requeter_isocode_dist($url_base, $collection, $filtres, $taille_max
'element' => 'serveur',
'valeur' => $url_base,
'extra' => [
'url' => $url,
'url' => $url,
'erreur_json' => $erreur->getMessage()
]
];

@ -15,111 +15,109 @@ if (!defined('_TERRITOIRE_TIME_OUT_PEUPLEMENT')) {
define('_TERRITOIRE_TIME_OUT_PEUPLEMENT', 20);
}
/**
* Renvoie la configuration du plugin, soit statique (non modifiable), soit utilisateur (modifiable).
*
* @api
*
* @param string $type_configuration Type de configuration. Prend les valeurs `statique` ou `utilisateur`.
* @param null|string $type_configuration Type de configuration. Prend les valeurs `statique` ou `utilisateur`.
*
* @return array Tableau de la configuration demandée.
*/
function territoire_configurer($type_configuration = 'statique') {
function territoire_configurer(?string $type_configuration = 'statique') : array {
if ($type_configuration === 'statique') {
// Configuration de l'extraction des données REST
$configuration = array(
$configuration = [
// liste des types de territoires (chaque type a une configuration)
'types' => array('zone', 'country', 'subdivision', 'infrasubdivision'),
'types' => ['zone', 'country', 'subdivision', 'infrasubdivision'],
// configuration de l'extraction des territoires de type zone
'zone' => array(
'zone' => [
// -- liste des champs récupérés dans la réponse.
'champs' => array(
'champs' => [
// L'index 'base' correspond aux colonnes dans la table spip_territoires sous la forme :
// [index dans la réponse] = colonne de spip_territoires
'base' => array(
'base' => [
'code_num' => 'iso_territoire',
'category' => 'categorie',
'parent' => 'iso_parent',
'depth' => 'profondeur_type',
'label' => 'iso_titre',
),
],
// L'index 'index' définit la racine des champs dans la réponse
'index' => 'zones',
),
],
// -- liste des extras de type 'code' ou 'info' récupérés dans la réponse à un index différent de
// celui des champs et mis à jour dans la table spip_territoires_extras
'extras' => array(
'extras' => [
// Pour le type 'code'
'code' => array(
'code' => [
// L'index 'champs' correspond aux colonnes dans la table spip_territoires_extras sous la forme :
// [colonne de spip_territoires_extras] = index dans la réponse
'champs' => array(
'champs' => [
'extra' => '#code_geoip', // La réponse ne contient pas ce champ : il est forcé à 'code_geopip'
'valeur' => 'code',
),
],
// L'index 'index' définit la racine des champs extras dans la réponse
'index' => 'continents',
'index' => 'continents',
// L'index 'cle_iso' identifie l'index dans la réponse qui représente le code iso, soit iso_territoire
'cle_iso' => 'code_num',
),
),
),
'country' => array(
'champs' => array(
'base' => array(
'code_alpha2' => 'iso_territoire',
'category' => 'categorie',
'code_continent' => 'iso_continent',
'label' => 'iso_titre',
),
],
],
],
'country' => [
'champs' => [
'base' => [
'code_alpha2' => 'iso_territoire',
'category' => 'categorie',
'code_continent' => 'iso_continent',
'label' => 'iso_titre',
],
// -- liste des extras de type 'code' ou 'info' récupérés dans la réponse au même index que
// celui des champs et aussi mis à jour dans la table spip_territoires_extras.
// La forme des correspondance est identique à celle des champs de base.
'extras' => array(
'code' => array(
'code_alpha3' => 'code_iso3166_a3',
'code_num' => 'code_iso3166_num',
),
'info' => array(
'capital' => 'capital',
'area' => 'area',
'population' => 'population',
'tld' => 'tld',
'code_4217_3' => 'code_4217_3',
'phone_id' => 'phone_id'
),
),
'extras' => [
'code' => [
'code_alpha3' => 'code_iso3166_a3',
'code_num' => 'code_iso3166_num',
],
'info' => [
'capital' => 'capital',
'area' => 'area',
'population' => 'population',
'tld' => 'tld',
'code_4217_3' => 'code_4217_3',
'phone_id' => 'phone_id'
],
],
'index' => 'pays',
),
),
'subdivision' => array(
'champs' => array(
'base' => array(
],
],
'subdivision' => [
'champs' => [
'base' => [
'code_3166_2' => 'iso_territoire',
'type' => 'categorie',
'country' => 'iso_pays',
'parent' => 'iso_parent',
'depth' => 'profondeur_type',
'label' => 'iso_titre',
),
],
'index' => 'subdivisions',
),
'extras' => array(
'code' => array(
'champs' => array(
],
'extras' => [
'code' => [
'champs' => [
'extra' => 'type_alter',
'valeur' => 'code_alter',
),
],
'index' => 'codes_alternatifs',
'cle_iso' => 'code_iso',
),
),
),
'infrasubdivision' => array(
'champs' => array(
'base' => array(
],
],
],
'infrasubdivision' => [
'champs' => [
'base' => [
'code' => 'iso_territoire',
'type' => 'categorie',
'country' => 'iso_pays',
@ -127,32 +125,32 @@ function territoire_configurer($type_configuration = 'statique') {
'depth' => 'profondeur_type',
'label' => 'iso_titre',
'parent_alt1' => 'iso_parent_alt',
),
'extras' => array(
'info' => array(
],
'extras' => [
'info' => [
'lat' => 'latitude',
'lon' => 'longitude',
),
),
],
],
'index' => 'infrasubdivisions',
),
'extras' => array(
'code' => array(
'champs' => array(
],
'extras' => [
'code' => [
'champs' => [
'extra' => 'type_alter',
'valeur' => 'code_alter',
),
],
'index' => 'codes_alternatifs',
'cle_iso' => 'code_iso',
),
),
),
);
],
],
],
];
} else {
// Liste des objets associables à un territoire
$configuration = array(
'association_objets' => array(),
);
$configuration = [
'association_objets' => [],
];
}
return $configuration;
@ -164,26 +162,25 @@ function territoire_configurer($type_configuration = 'statique') {
*
* @api
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param array $options Tableau des options de peuplement:
* - `force` : si `true` force le repeuplement même si le sha est identique (`false` par défaut).
* - `extras`: tableau des types d'extras à peupler soit `code` pour les codes alternatifs
* et `info` pour le caractéristiques (table spip_territoires_extras)
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param null|string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param null|array $options Tableau des options de peuplement:
* - `force` : si `true` force le repeuplement même si le sha est identique (`false` par défaut).
* - `extras`: tableau des types d'extras à peupler soit `code` pour les codes alternatifs
* et `info` pour le caractéristiques (table spip_territoires_extras)
*
* @return array Tableau retour de la fonction permettant de connaitre le résultat du traitement (utile pour l'affichage
* du message dans le formulaire de peuplement).
*/
function territoire_peupler($type, $pays, $options = array()) {
function territoire_peupler(string $type, ?string $pays, ?array $options = []) : array {
// On initialise le retour à une erreur nok
$retour = array(
$retour = [
'ok' => false,
'arg' => false,
'sha' => false,
'type' => $type,
'pays' => $pays,
);
];
// Détermination du mode de peuplement et insertion dans le retour pour les affichages
$peuplement_asynchrone = isset($options['iteration']);
@ -210,13 +207,13 @@ function territoire_peupler($type, $pays, $options = array()) {
$timeout = time() + _TERRITOIRE_TIME_OUT_PEUPLEMENT;
// Initialisation à vide des variables à transmettre d'une itération à une autre.
$ids = array();
$extras = array();
$meta_extras = array();
$ids = [];
$extras = [];
$meta_extras = [];
$sha_type = '';
$territoires = array();
$sauvegardes = array();
$timestamp = array();
$territoires = [];
$sauvegardes = [];
$timestamp = [];
// Phase 1 :
// - Acquisition des données et vérification de l'utilité de les recharger ou pas.
@ -231,7 +228,7 @@ function territoire_peupler($type, $pays, $options = array()) {
// Acquisition de la collection complete du couple (type, pays) via l'API REST
// -- on précise si le mode est asynchrone afin de mettre en cache la collection dans ce cas.
$collection = territoires_acquerir($type, $pays, array('cacher' => $peuplement_asynchrone));
$collection = territoires_acquerir($type, $pays, ['cacher' => $peuplement_asynchrone]);
// On extrait la liste complète des territoires
if (!empty($collection[$configuration['champs']['index']])) {
@ -255,7 +252,7 @@ function territoire_peupler($type, $pays, $options = array()) {
// On sait que le traitement va continuer on peut continuer les étapes de préalables à l'insertion.
// -- on préserve les éditions manuelles et les liens pour les réinjecter ensuite lors du
// rechargement
$sauvegardes = territoires_preserver($type, $pays, array('cacher' => $peuplement_asynchrone));
$sauvegardes = territoires_preserver($type, $pays, ['cacher' => $peuplement_asynchrone]);
$timestamp['preservation'] = microtime(true);
// -- on vide les territoires avant de les remettre (inutile de gérer les erreurs
@ -277,11 +274,11 @@ function territoire_peupler($type, $pays, $options = array()) {
// dans des caches sécurisés.
// -- lecture du cache de la collection complète correspondant au couple (type, pays).
include_spip('inc/ezcache_cache');
$cache = array(
$cache = [
'type' => $type,
'pays' => $pays,
'fonction' => 'collection'
);
];
$collection = cache_lire('territoires', 'asynchrone', $cache);
// -- lecture du cache des sauvegardes.
@ -375,20 +372,20 @@ function territoire_peupler($type, $pays, $options = array()) {
and (time() >= $timeout)
) {
// Consignation du contexte dans un cache
$contexte = array(
$contexte = [
'cle_fin' => $_cle,
'ids_crees' => $ids,
'extras_crees' => $extras,
'meta_extras' => $meta_extras,
'sha_type' => $sha_type,
'timestamp' => $timestamp,
);
];
include_spip('inc/ezcache_cache');
$cache = array(
$cache = [
'type' => $type,
'pays' => $pays,
'fonction' => 'contexte'
);
];
cache_ecrire('territoires', 'asynchrone', $cache, $contexte);
// Consignation du nombre d'itérations dans le retour de la fonction
@ -430,42 +427,42 @@ function territoire_peupler($type, $pays, $options = array()) {
// On rétablit les liens vers les territoires et les logos
// -- les liens avec les autres objets
$config_lien = array(
$config_lien = [
'table' => 'spip_territoires_liens',
'id_table' => 'id_territoire'
);
];
liens_retablir('liens', $sauvegardes, $ids, $config_lien);
// -- les liens avec les logos
$config_lien = array(
$config_lien = [
'table' => 'spip_documents_liens',
'id_table' => 'id_objet'
);
];
liens_retablir('logos', $sauvegardes, $ids, $config_lien);
$timestamp['retablissement'] = microtime(true);
// Permettre à d'autres plugins de compléter le peuplement.
// -- par exemple le plugin Contours rétablit les liens vers les contours GIS (spip_liens_gis),
// les objets GIS étant conservés si ils existent déjà.
$flux = array(
'args' => array(
$flux = [
'args' => [
'type' => $type,
'pays' => $pays,
'sauvegardes' => $sauvegardes,
'ids_crees' => $ids,
),
'data' => array()
);
],
'data' => []
];
pipeline('post_peupler_territoire', $flux);
// On stocke les informations de chargement dans une meta.
$contenu = array(
$contenu = [
'sha' => $sha_type,
'nbr' => count($territoires),
'maj' => date('Y-m-d H:i:s'),
'lic' => isset($collection['credits']) ? $collection['credits'] : array(),
'lic' => isset($collection['credits']) ? $collection['credits'] : [],
'ext' => $meta_extras,
);
];
ecrire_config("{$meta}/{$consigne}", $contenu);
$timestamp['fin'] = microtime(true);
$erreur = false;
@ -493,10 +490,10 @@ function territoire_peupler($type, $pays, $options = array()) {
// Si on arrive à ce point de sortie, c'est que le traitement est complètement fini ou est en erreur.
// En mode asynchrone, dans les deux cas, on supprime les caches.
if ($peuplement_asynchrone) {
$filtres = array(
'type' => $type,
'pays' => $pays,
);
$filtres = [
'type' => $type,
'pays' => $pays,
];
$caches = cache_repertorier('territoires', 'asynchrone', $filtres);
if ($caches) {
cache_vider('territoires', 'asynchrone', $caches);
@ -533,27 +530,26 @@ function territoire_peupler($type, $pays, $options = array()) {
*
* @api
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param array $options Tableau des options de peuplement:
* - `force` : si `true` force le repeuplement même si le sha est identique (`false` par défaut).
* - `extras`: tableau des types d'extras à peupler soit `code` pour les codes alternatifs
* et `info` pour le caractéristiques (table spip_territoires_extras)
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param null|array $options Tableau des options de peuplement:
* - `force` : si `true` force le repeuplement même si le sha est identique (`false` par défaut).
* - `extras`: tableau des types d'extras à peupler soit `code` pour les codes alternatifs
* et `info` pour le caractéristiques (table spip_territoires_extras)
*
* @return array Tableau retour de la fonction permettant de connaitre le résultat du traitement (utile pour l'affichage
* du message dans le formulaire de peuplement).
*/
function territoire_peupler_asynchrone($type, $pays, $options = array()) {
function territoire_peupler_asynchrone(string $type, string $pays, ?array $options = []) : array {
// On initialise le retour à une ok ce qui est le cas le plus fréquent car on ne fait que créer le job.
$retour = array(
$retour = [
'ok' => true,
'arg' => false,
'sha' => false,
'type' => $type,
'pays' => $pays,
'sync' => false
);
];
include_spip('inc/territoires_services');
if (type_pays_est_valide($type, $pays)) {
@ -590,26 +586,25 @@ function territoire_peupler_asynchrone($type, $pays, $options = array()) {
*
* @api
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param array $options Tableau des options de dépeuplement:
* - `force` : si `true` force le vidage même si la meta n'est pas présente (cas d'erreur
* sur timeout par exemple). La valeur par défaut est `false`.
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param null|string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param null|array $options Tableau des options de dépeuplement:
* - `force` : si `true` force le vidage même si la meta n'est pas présente (cas d'erreur
* sur timeout par exemple). La valeur par défaut est `false`.
*
* @return array Tableau retour de la fonction permettant de connaitre le résultat du traitement (utile pour l'affichage
* du message dans le formulaire de peuplement).
*/
function territoire_depeupler($type, $pays = '', $options = array()) {
function territoire_depeupler(string $type, ?string $pays = '', ?array $options = []) : array {
// On initialise le retour à une erreur nok
$retour = array(
$retour = [
'ok' => false,
'arg' => false,
'sha' => false,
'type' => $type,
'pays' => $pays,
'sync' => true
);
];
// Le vidage dépend du type :
// - type = zone ou country : on vide l'ensemble des régions du monde ou l'ensemble des pays
@ -628,9 +623,9 @@ function territoire_depeupler($type, $pays = '', $options = array()) {
// Avant de vider la table on réserve la liste des id de territoire qui seront supprimés
// de façon à vider ensuite les liens éventuels y compris ceux des logos.
$from = 'spip_territoires';
$where = array(
$where = [
'type=' . sql_quote($type),
);
];
if (type_est_subdivision($type)) {
$where[] = 'iso_pays=' . sql_quote($pays);
}
@ -644,29 +639,29 @@ function territoire_depeupler($type, $pays = '', $options = array()) {
if ($sql_ok !== false) {
// Vider les liens éventuels avec les logos (on gère pas d'erreur)
$where_logo = array(
$where_logo = [
sql_in('id_objet', $ids),
'objet=' . sql_quote('territoire')
);
];
sql_delete('spip_documents_liens', $where_logo);
// Vider les liens éventuels avec les autres objets (on gère pas d'erreur)
$where_lien = array(
$where_lien = [
sql_in('id_territoire', $ids),
);
];
sql_delete('spip_territoires_liens', $where_lien);
// Permettre à d'autres plugins de compléter le dépeuplement.
// -- par exemple le plugin Contours supprime les liens vers les contours GIS (spip_liens_gis),
// mais pas les objets GIS.
$flux = array(
'args' => array(
$flux = [
'args' => [
'type' => $type,
'pays' => $pays,
'ids_territoire' => $ids,
),
'data' => array()
);
],
'data' => []
];
pipeline('post_depeupler_territoire', $flux);
// Supprimer la meta propre au pays même si le vidage des liens est en erreur.
@ -704,19 +699,18 @@ function territoire_depeupler($type, $pays = '', $options = array()) {
*
* @api
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param array|string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param null|string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
*
* @return bool `true` si le territoire est chargé, `false` sinon.
*/
function territoire_est_peuple($type, $pays = '') {
function territoire_est_peuple(string $type, ?string $pays = '') : bool {
// Initialisation de la liste
$est_peuple = false;
// La liste des territoires chargés est en meta.
include_spip('inc/config');
$peuplement = lire_config('territoires_peuplement', array());
$peuplement = lire_config('territoires_peuplement', []);
if (
include_spip('inc/territoires_utils')
and type_est_subdivision($type)
@ -732,26 +726,24 @@ function territoire_est_peuple($type, $pays = '') {
return $est_peuple;
}
/**
* Fournit l'ascendance géographique d'un territoire, par consultation dans la base de données.
*
* @api
*
* @param string $iso_territoire Code ISO principal du territoire
* @param string|null $iso_parent Code ISO principal du parent direct du territoire concerné ou chaine vide sinon
* @param string $ordre Classement de la liste : `descendant`(défaut) ou `ascendant`.
* @param null|string $iso_parent Code ISO principal du parent direct du territoire concerné ou chaine vide sinon
* @param null|string $ordre Classement de la liste : `descendant`(défaut) ou `ascendant`.
*
* @return array Liste des territoires ascendants.
*/
function territoire_lire_ascendance($iso_territoire, $iso_parent = null, $ordre = 'descendant') {
$ascendance = array();
function territoire_lire_ascendance(string $iso_territoire, ?string $iso_parent = null, ?string $ordre = 'descendant') : array {
$ascendance = [];
// Si on ne passe pas le parent correspondant au territoire pour lequel on cherche l'ascendance
// alors on le cherche en base de données.
// Le fait de passer le parent est uniquement une optimisation.
if (\is_null($iso_parent)) {
if (null === $iso_parent) {
$iso_parent = sql_getfetsel('iso_parent', 'spip_territoires', 'iso_territoire=' . sql_quote($iso_territoire));
}
@ -760,8 +752,8 @@ function territoire_lire_ascendance($iso_territoire, $iso_parent = null, $ordre
$iso_parent_alt = sql_getfetsel('iso_parent_alt', 'spip_territoires', 'iso_territoire=' . sql_quote($iso_territoire));
while ($iso_parent) {
$select = array('id_territoire', 'iso_territoire', 'iso_parent', 'iso_parent_alt', 'nom_usage', 'type', 'categorie');
$where = array('iso_territoire=' . sql_quote($iso_parent));
$select = ['id_territoire', 'iso_territoire', 'iso_parent', 'iso_parent_alt', 'nom_usage', 'type', 'categorie'];
$where = ['iso_territoire=' . sql_quote($iso_parent)];
$territoire = sql_fetsel($select, 'spip_territoires', $where);
if ($territoire) {
$iso_parent_alt_parent = $territoire['iso_parent_alt'];
@ -776,7 +768,7 @@ function territoire_lire_ascendance($iso_territoire, $iso_parent = null, $ordre
}
}
if ($ascendance and ($ordre === 'descendant')) {
if ($ascendance and ($ordre === 'descendant')) {
$ascendance = array_reverse($ascendance);
}
@ -790,20 +782,19 @@ function territoire_lire_ascendance($iso_territoire, $iso_parent = null, $ordre
*
* @api
*
* @param string $iso_territoire Code ISO principal du territoire
* @param string $information Type d'information à renvoyer depuis la table spip_territoires_extras ou vide
* si on veut toutes les informations.
* @param string $iso_territoire Code ISO principal du territoire
* @param null|string $information Type d'information à renvoyer depuis la table spip_territoires_extras ou vide
* si on veut toutes les informations.
*
* @return string|array Information ou liste des informations.
* @return array|string Information ou liste des informations.
*/
function territoire_extra_lire($iso_territoire, $information = '') {
function territoire_extra_lire(string $iso_territoire, ?string $information = '') {
// Initialisation de la sortie en fonction de la demande
$informations = $information ? '' : array();
$informations = $information ? '' : [];
// Quelque soit la demande, on récupère toutes les informations du territoire.
$select = array('extra', 'valeur');
$where = array('iso_territoire=' . sql_quote($iso_territoire));
$select = ['extra', 'valeur'];
$where = ['iso_territoire=' . sql_quote($iso_territoire)];
$extras = sql_allfetsel($select, 'spip_territoires_extras', $where);
if ($extras) {
@ -828,14 +819,13 @@ function territoire_extra_lire($iso_territoire, $information = '') {
*
* @return bool `true` si le territoire est chargé, `false` sinon.
*/
function territoire_extra_est_peuple($type, $pays, $type_extra) {
function territoire_extra_est_peuple(string $type, string $pays, string $type_extra) : bool {
// Initialisation de la liste
$est_peuple = false;
// La liste des territoires chargés est en meta.
include_spip('inc/config');
$peuplement = lire_config('territoires_peuplement', array());
$peuplement = lire_config('territoires_peuplement', []);
if (
include_spip('inc/territoires_utils')
and type_est_subdivision($type)

@ -8,7 +8,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie si le couple (type, pays) est valide, à savoir, désigne bien un sous-ensemble cohérent de territoires.
* Les sous-ensembles valides sont :
@ -18,12 +17,14 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @api
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @uses type_est_subdivision()
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param null|string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
*
* @return bool `true` si le couple (type, pays) est valide, `false` sinon.
*/
function type_pays_est_valide($type, $pays = '') {
function type_pays_est_valide(string $type, ?string $pays = '') : bool {
$est_valide = false;
// On récupère le sha de la table dans les metas si il existe (ie. la table a été chargée)
@ -32,7 +33,7 @@ function type_pays_est_valide($type, $pays = '') {
if (strlen($pays) === 2) {
$est_valide = true;
}
} elseif (in_array($type, array('zone', 'country'))) {
} elseif (in_array($type, ['zone', 'country'])) {
$est_valide = true;
}
@ -51,8 +52,7 @@ function type_pays_est_valide($type, $pays = '') {
*
* @return bool `true` si le sha passé en argument est identique au sha stocké pour la table choisie, `false` sinon.
*/
function sha_est_identique($sha, $meta, $consigne) {
function sha_est_identique(string $sha, string $meta, string $consigne) : bool {
$sha_identique = false;
// On récupère le sha de la table dans les metas si il existe (ie. la table a été chargée)
@ -80,10 +80,9 @@ function sha_est_identique($sha, $meta, $consigne) {
*
* @return void
*/
function liens_retablir($type_lien, $sauvegardes, $ids_crees, $config_lien) {
function liens_retablir(string $type_lien, array $sauvegardes, array $ids_crees, array $config_lien) : void {
// On contruit la liste des enregistrements correspondant aux liens à rétablir.
$liens = array();
$liens = [];
foreach ($sauvegardes[$type_lien] as $_lien) {
// identifier le code iso à partir de l'ancien id
$iso = array_search($_lien[$config_lien['id_table']], $sauvegardes['ids']);

@ -14,6 +14,12 @@ if (!defined('_TERRITOIRE_URL_BASE_ISOCODE')) {
*/
define('_TERRITOIRE_URL_BASE_ISOCODE', 'https://contrib.spip.net/http.api/ezrest');
}
if (!defined('_EXTRAIRE_MULTI')) {
/**
* Restaure cette constante à partir de SPIP 4.2.
*/
define('_EXTRAIRE_MULTI', '@<multi>(.*?)</multi>@sS');
}
/**
* Acquiert les données de territoires disponibles dans Nomenclatures.
@ -21,23 +27,26 @@ if (!defined('_TERRITOIRE_URL_BASE_ISOCODE')) {
*
* @internal
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param array $options Permet de demander l'exclusion (`exclure`) de certains index si ceux-ci sont inutilisés
* ou de ne retourner qu'un seul index (`index`).
* L'index `cacher` à true permet de mettre la collection récupérée dans un cache spécifique. Cette
* option est utilisée dans les chargements en mode asynchrone.
* @uses type_est_subdivision()
* @uses requeter_isocode()
* @uses cache_ecrire()
*
* @return array
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param null|string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param null|array $options Permet de demander l'exclusion (`exclure`) de certains index si ceux-ci sont inutilisés
* ou de ne retourner qu'un seul index (`index`).
* L'index `cacher` à true permet de mettre la collection récupérée dans un cache spécifique. Cette
* option est utilisée dans les chargements en mode asynchrone.
*
* @return array Liste des descriptions de territoires telles que fournies par Nomenclatures
*/
function territoires_acquerir($type, $pays = '', $options = array()) {
function territoires_acquerir(string $type, ?string $pays = '', ?array $options = []) : array {
// Initialiser les territoires à vide pour gérer une éventuelle erreur de type.
$territoires = array();
$territoires = [];
// Déterminer la collection et les conditions à appliquer.
$filtres = array();
$collection = array();
$filtres = [];
$collection = [];
if ($type === 'zone') {
$collection = 'zones';
} elseif ($type === 'country') {
@ -48,7 +57,7 @@ function territoires_acquerir($type, $pays = '', $options = array()) {
) {
$collection = "{$type}s";
if ($pays) {
$filtres = array('pays' => $pays);
$filtres = ['pays' => $pays];
}
}
@ -62,7 +71,7 @@ function territoires_acquerir($type, $pays = '', $options = array()) {
// Appel à l'API REST de Nomenclatures
$requeter = charger_fonction('requeter_isocode', 'inc');
$reponse = $requeter(_TERRITOIRE_URL_BASE_ISOCODE, $collection, $filtres);
if (intval($reponse['erreur']['status']) === 200) {
if ((int) ($reponse['erreur']['status']) === 200) {
$territoires = $reponse['donnees'];
// Si on a demandé un seul index on le renvoie seul sinon on renvoie le tableau complet.
@ -82,11 +91,11 @@ function territoires_acquerir($type, $pays = '', $options = array()) {
// Création d'un cache sécurisé de la collection pour le relire si besoin de plusieurs itérations de
// chargement.
include_spip('inc/ezcache_cache');
$cache = array(
$cache = [
'type' => $type,
'pays' => $pays,
'fonction' => 'collection'
);
];
cache_ecrire('territoires', 'asynchrone', $cache, $territoires);
}
@ -96,56 +105,59 @@ function territoires_acquerir($type, $pays = '', $options = array()) {
/**
* Extrait, pour un les régions, les pays ou les subdivisions d'un pays, la liste des territoires ayant fait l'objet
* d'une modification manuelle (descriptif) et la liste associations vers ses mêmes territoires.
*
* Les extras ne sont pas sauvegardés car il ne sont ni modifiables ni indexés par un id mais par un code invariant.
* Si l'extraction fait suite à un chargement asynchrone, les territoires modifiés sont sauvegardés dans une cache.
*
* @internal
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param array $options L'index `cacher` à true permet de mettre la collection récupérée dans un cache spécifique. Cette
* option est utilisée dans les chargements en mode asynchrone.
* @uses type_est_subdivision()
*
* @return array
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`.
* @param null|string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infrasubdivision` sinon une chaine vide.
* @param null|array $options L'index `cacher` à true permet de mettre la collection récupérée dans un cache spécifique. Cette
* option est utilisée dans les chargements en mode asynchrone.
*
* @return array Liste des territoires ayant été modifiés : seules les champs éditables sont consignés.
*/
function territoires_preserver($type, $pays = '', $options = array()) {
function territoires_preserver(string $type, ?string $pays = '', ?array $options = []) : array {
// Initialisation de la table et de la condition de base sur le type et éventuellement le pays.
$territoires = array();
$territoires = [];
$from = 'spip_territoires';
$where = array(
$where = [
'type=' . sql_quote($type),
);
];
if (type_est_subdivision($type)) {
$where[] = 'iso_pays=' . sql_quote($pays);
}
// Extraction des liens vers les territoires du pays
$where_lien = array(
$where_lien = [
sql_in_select('id_territoire', 'id_territoire', $from, $where)
);
];
$territoires['liens'] = sql_allfetsel('*', 'spip_territoires_liens', $where_lien);
// Extraction des liens de logos vers les territoires du pays
$where_logo = array(
$where_logo = [
'objet=' . sql_quote('territoire'),
sql_in_select('id_objet', 'id_territoire', $from, $where)
);
];
$territoires['logos'] = sql_allfetsel('*', 'spip_documents_liens', $where_logo);
// Extraction de la correspondance id-iso pour les liens et les logos
$territoires['ids'] = array();
$select = array('id_territoire', 'iso_territoire');
$territoires['ids'] = [];
$select = ['id_territoire', 'iso_territoire'];
// -- les liens