Browse Source

Premier commit du plugin Territoires qui gère un objet géographique territoire unifiant les régions du monde, les pays et les subdivisions.

Le peuplement se fait à partir de l'API REST de Nomenclatures.
Il est possible de lier des objets à un territoire comme des contours géographiques, des points GIS, des taxons...
master
Eric Lupinacci 10 months ago
parent
commit
8a65af2bdf
  1. 43
      action/supprimer_territoire.php
  2. 128
      base/territoires.php
  3. 5
      fabrique_diff.diff
  4. 326
      fabrique_territoires.php
  5. 23
      formulaires/configurer_territoires.html
  6. 20
      formulaires/editer_territoire.html
  7. 152
      formulaires/editer_territoire.php
  8. 44
      formulaires/peupler_territoires.html
  9. 226
      formulaires/peupler_territoires.php
  10. 690
      inc/territoire.php
  11. 14
      lang/paquet-territoires_fr.php
  12. 72
      lang/territoire_fr.php
  13. 62
      lang/territoires_fr.php
  14. 33
      paquet.xml
  15. 52
      prive/objets/contenu/territoire.html
  16. 16
      prive/objets/infos/territoire.html
  17. 34
      prive/objets/liste/objets_lies_territoire.html
  18. 37
      prive/objets/liste/territoires.html
  19. 70
      prive/objets/liste/territoires_associer.html
  20. 18
      prive/objets/liste/territoires_associer_fonctions.php
  21. 61
      prive/objets/liste/territoires_lies.html
  22. 17
      prive/objets/liste/territoires_lies_fonctions.php
  23. 6
      prive/squelettes/contenu/configurer_territoires.html
  24. 6
      prive/squelettes/contenu/peupler_territoires.html
  25. 68
      prive/squelettes/contenu/territoire.html
  26. 36
      prive/squelettes/contenu/territoire_edit.html
  27. 21
      prive/squelettes/inclure/inc-navigation_territoires.html
  28. 3
      prive/squelettes/navigation/configurer_territoires.html
  29. 3
      prive/squelettes/navigation/peupler_territoires.html
  30. 3
      prive/squelettes/navigation/territoires.html
  31. 32
      prive/style_prive_plugin_territoires.html
  32. BIN
      prive/themes/spip/images/territoire-12.png
  33. BIN
      prive/themes/spip/images/territoire-16.png
  34. BIN
      prive/themes/spip/images/territoire-24.png
  35. BIN
      prive/themes/spip/images/territoire-32.png
  36. BIN
      prive/themes/spip/images/territoire-new-16.png
  37. 20
      saisies-vues/territoires.html
  38. 13
      saisies/territoires.html
  39. BIN
      territoires-64.png
  40. 63
      territoires_administrations.php
  41. 142
      territoires_autorisations.php
  42. 127
      territoires_pipelines.php

43
action/supprimer_territoire.php

@ -0,0 +1,43 @@
<?php
/**
* Utilisation de l'action supprimer pour l'objet territoire
*
* @plugin Territoires
* @copyright 2020
* @author Eric Lupinacci
* @licence GNU/GPL
* @package SPIP\Territoires\Action
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Action pour supprimer un·e territoire
*
* Vérifier l'autorisation avant d'appeler l'action.
*
* @param null|int $arg
* Identifiant à supprimer.
* En absence de id utilise l'argument de l'action sécurisée.
**/
function action_supprimer_territoire_dist($arg=null) {
if (is_null($arg)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
$arg = intval($arg);
// cas suppression
if (autoriser('supprimer', 'territoire', $arg)) {
if ($arg) {
sql_delete('spip_territoires', 'id_territoire=' . sql_quote($arg));
}
else {
spip_log("action_supprimer_territoire_dist $arg pas compris");
}
}
}

128
base/territoires.php

@ -0,0 +1,128 @@
<?php
/**
* Déclarations relatives à la base de données.
*
* @plugin Territoires
*
* @copyright 2020
* @author Eric Lupinacci
* @licence GNU/GPL
*
* @package SPIP\Territoires\Pipelines
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Déclaration des alias de tables et filtres automatiques de champs.
*
* @pipeline declarer_tables_interfaces
*
* @param array $interfaces
* Déclarations d'interface pour le compilateur
*
* @return array
* Déclarations d'interface pour le compilateur
*/
function territoires_declarer_tables_interfaces($interfaces) {
$interfaces['table_des_tables']['territoires'] = 'territoires';
$interfaces['table_des_traitements']['NOM_USAGE']['territoires'] = _TRAITEMENT_TYPO;
$interfaces['table_des_traitements']['ISO_TITRE']['territoires'] = _TRAITEMENT_TYPO;
$interfaces['table_des_traitements']['DESCRIPTIF']['territoires'] = _TRAITEMENT_RACCOURCIS;
return $interfaces;
}
/**
* Déclaration des objets éditoriaux.
*
* @pipeline declarer_tables_objets_sql
*
* @param array $tables
* Description des tables
*
* @return array
* Description complétée des tables
*/
function territoires_declarer_tables_objets_sql($tables) {
$tables['spip_territoires'] = array(
'type' => 'territoire',
'principale' => 'oui',
'field' => array(
'id_territoire' => 'bigint(21) NOT NULL',
'iso_territoire' => 'varchar(10) NOT NULL DEFAULT ""',
'iso_titre' => 'text NOT NULL DEFAULT ""',
'nom_usage' => 'text NOT NULL DEFAULT ""',
'descriptif' => 'text NOT NULL DEFAULT ""',
'type' => 'varchar(12) DEFAULT "" NOT NULL',
'categorie' => 'varchar(64) NOT NULL DEFAULT ""',
'iso_continent' => 'varchar(3) DEFAULT "" NOT NULL',
'iso_pays' => 'varchar(2) NOT NULL DEFAULT ""',
'iso_parent' => 'varchar(10) NOT NULL DEFAULT ""',
'edite' => 'varchar(3) NOT NULL DEFAULT ""',
'date' => 'datetime NOT NULL DEFAULT "0000-00-00 00:00:00"',
'maj' => 'TIMESTAMP NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'
),
'key' => array(
'PRIMARY KEY' => 'id_territoire',
'KEY iso_territoire' => 'iso_territoire',
'KEY iso_parent' => 'iso_parent',
'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'),
'texte_retour' => 'icone_retour',
'texte_objets' => 'territoire:titre_territoires',
'texte_objet' => 'territoire:titre_territoire',
'texte_modifier' => 'territoire:icone_modifier_territoire',
'texte_creer' => 'territoire:icone_creer_territoire',
'info_aucun_objet' => 'territoire:info_aucun_territoire',
'info_1_objet' => 'territoire:info_1_territoire',
'info_nb_objets' => 'territoire:info_nb_territoires',
'texte_logo_objet' => 'territoire:titre_logo_territoire',
'texte_langue_objet' => 'territoire:titre_langue_territoire',
);
return $tables;
}
/**
* Déclaration des tables secondaires (liaisons).
*
* @pipeline declarer_tables_auxiliaires
*
* @param array $tables
* Description des tables
*
* @return array
* Description complétée des tables
*/
function territoires_declarer_tables_auxiliaires($tables) {
$tables['spip_territoires_liens'] = array(
'field' => array(
'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(
'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;
}

5
fabrique_diff.diff

@ -0,0 +1,5 @@
diff -r -x . -x .. -x fabrique_diff.diff -x fabrique_territoires.php ../plugins/fabrique_auto/.backup/territoires/paquet.xml ../plugins/fabrique_auto/territoires/paquet.xml
12c12
< Paquet généré le 2020-07-02 13:43:22
---
> Paquet généré le 2020-07-02 13:44:33

326
fabrique_territoires.php
File diff suppressed because it is too large
View File

23
formulaires/configurer_territoires.html

@ -0,0 +1,23 @@
<div class="formulaire_spip formulaire_configurer formulaire_#FORM">
<h3 class="titrem"><:territoires:cfg_titre_parametrages:/></h3>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<form method="post" action="#ENV{action}">
<div>
#ACTION_FORMULAIRE
<input type="hidden" name="_meta_casier" value="territoires" />
<div class="editer-groupe">
[(#SAISIE{choisir_objets, association_objets,
label=<:territoires:cfg_label_objets_associes:>,
exclus=#LISTE{spip_territoires},
conteneur_class=long_label,
})]
</div>
<p class="boutons"><span class="image_loading">&nbsp;</span><input type="submit" class="submit" value="<:bouton_enregistrer|attribut_html:/>" /></p>
</div>
</form>
</div>

20
formulaires/editer_territoire.html

@ -0,0 +1,20 @@
<div class='formulaire_spip formulaire_editer formulaire_#FORM formulaire_#FORM-#ENV{id_territoire,nouveau}'>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[(#ENV{editable})
<form method="post" action="#ENV{action}"><div>
#ACTION_FORMULAIRE
<input type="hidden" name="id_territoire" value="#ENV{id_territoire}" />
<div class="editer-groupe">
[(#SAISIE{textarea, descriptif,
label=<:territoire:champ_descriptif_label:>,
})]
</div>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<p class="boutons"><input type="submit" class="submit" value="<:bouton_enregistrer|attribut_html:/>" /></p>
</div></form>
]
</div>

152
formulaires/editer_territoire.php

@ -0,0 +1,152 @@
<?php
/**
* Gestion du formulaire de d'édition de territoire
*
* @plugin Territoires
* @copyright 2020
* @author Eric Lupinacci
* @licence GNU/GPL
* @package SPIP\Territoires\Formulaires
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
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é
*
* @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
*/
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));
}
/**
* 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
*/
function formulaires_editer_territoire_charger_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $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é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
*/
function formulaires_editer_territoire_verifier_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$erreurs = array();
$erreurs = formulaires_editer_objet_verifier('territoire', $id_territoire);
return $erreurs;
}
/**
* 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
*/
function formulaires_editer_territoire_traiter_dist($id_territoire = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $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);
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));
if (isset($retours['redirect'])) {
$retours['redirect'] = parametre_url($retours['redirect'], 'id_lien_ajoute', $id_territoire, '&');
}
}
}
return $retours;
}

44
formulaires/peupler_territoires.html

@ -0,0 +1,44 @@
<div class="formulaire_spip formulaire_#FORM" id="formulaire_#FORM">
<h3></h3>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[(#ENV{editable})
<form method="post" action="#ENV{action}">
<div>
#ACTION_FORMULAIRE{#ENV{action}}
<p><:territoires:explication_peupler_form:></p>
<div class="editer-groupe">
[(#SAISIE{radio, action_peuplement,
label=<:territoires:label_peupler_action:>,
data=#ENV{_actions_peuplement},
defaut=#ENV{_action_defaut},
disable=#ENV{_actions_disable},
conteneur_class=long_label,
obligatoire=oui,
})]
[(#SAISIE{checkbox, types,
label=<:territoires:label_peupler_territoire:>,
explication=<:territoires:explication_zone_pays_territoire:>,
data=#ENV{_types},
conteneur_class=long_label,
obligatoire=oui,
})]
[(#SAISIE{checkbox, pays,
explication=<:territoires:explication_subdivision_territoire:>,
data=#ENV{_pays},
conteneur_class=long_label,
obligatoire=oui,
tout_selectionner=oui,
})]
</div>
<p class="boutons">
<span class="image_loading">&nbsp;</span>
<input type="submit" class="submit" value="<:bouton_enregistrer:>" />
</p>
</div>
</form>
]
</div>

226
formulaires/peupler_territoires.php

@ -0,0 +1,226 @@
<?php
/**
* Gestion du formulaire de chargement ou de vidage des territoires.
*
* @package SPIP\TERRITOIRES\OBJET
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Chargement des données : le formulaire propose les actions possibles sur les tables de codes ISO,
* à savoir, charger ou vider et la liste des tables regroupées par service.
* L'action vider s'appelle décharger car il existe dékà une fonction d'administration de vidage des tables.
*
* @uses territoire_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.
*/
function formulaires_peupler_territoires_charger() {
// Initialisation des valeurs à transmettre au formulaire
$valeurs = array();
// Lister les actions sur les tables
$valeurs['_actions_peuplement'] = array(
'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'),
);
// -- indiquer les territoires déjà chargés
foreach ($valeurs['_types'] as $_type => $_label) {
if (territoire_est_peuple($_type)) {
$valeurs['_types'][$_type] .= ' - <em>[' . _T('territoires:info_territoire_peuple') . ']</em>';
$un_territoire_charge = true;
}
}
// Acquérir la liste des pays dont les subdivisions sont disponibles
$options = array(
'exclure' => 'alternates',
'index' => 'pays'
);
$valeurs['_pays'] = territoire_acquerir('subdivision', array(), $options);
// -- indiquer les territoires déjà chargés
foreach ($valeurs['_pays'] as $_code => $_pays) {
if (territoire_est_peuple('subdivision', $_code)) {
$valeurs['_pays'][$_code] .= ' - <em>[' . _T('territoires:info_territoire_peuple') . ']</em>';
$un_territoire_charge = true;
}
}
// Ne pas sélectionner des pays par défaut et ne pas se trainer les messages d'erreur
set_request('types', array());
set_request('pays', array());
// Désactiver l'action vider si aucun pays encore chargé
if (!$un_territoire_charge) {
$valeurs['_actions_disable'] = array('depeupler' => 'oui');
$valeurs['_action_defaut'] = 'peupler';
}
return $valeurs;
}
/**
* 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.
*/
function formulaires_peupler_territoires_verifier() {
$erreurs = array();
if (!_request('action_peuplement')) {
$erreurs['action_peuplement'] = _T('info_obligatoire');
}
if (!_request('pays') and !_request('types')) {
$erreurs['types'] = _T('info_obligatoire');
$erreurs['pays'] = ' ';
}
return $erreurs;
}
/**
* Exécution du formulaire : les pays choisis sont soit vidés, soit chargés.
*
* @uses territoire_peupler()
* @uses territoire_depeupler()
* @uses formater_message()
*
* @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() {
// Initialisation des messages de retour
$retour = array(
'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.
$action = _request('action_peuplement');
$types = _request('types');
$pays = _request('pays');
if ($pays) {
$types[] = 'subdivision';
}
// 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)
include_spip('inc/territoire');
$actionner = "territoire_${action}";
foreach ($types as $_type) {
// Traitement du type en prenant en compte le cas particulier des subdivisions.
if ($_type === 'subdivision') {
foreach ($pays as $_pays) {
$statut[] = $actionner($_type, $_pays);
}
} else {
$statut[] = $actionner($_type);
}
// Formater le message correspondant au traitement du type
$retour = message_formater($_type, $retour, $action, $statut);
}
// Renvoie au formulaire toujours éditable
$retour['editable'] = true;
return $retour;
}
/**
* Formate les messages de succès et d'erreur résultant des actions de chargement ou de vidage
* des territoires.
*
* @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
* `depeupler`.
* @param array $statuts Tableau résultant de l'action sur le type choisi. Peut-êre un tableau de statut pour les
* subdivisions (plusieurs pays).
* - `ok` : `true` si l'action a complètement réussi, `false` sinon (au moins une erreur).
* - `sha` : indique une sha identique donc pas chargement effectué.
* - `arg` : indique que le couple (type, pays) eest invalide (pas possible avec le formulaire).
* - `type` : type de territoire.
* - `pays` : code ISO alpha2 du pays si le type est subdivision.
*
* @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 message_formater($type, $messages, $action, $statuts) {
$variables = array(
'ok' => array(),
'nok' => array(),
'sha' => array(),
);
$statut_global = array(
'ok' => false,
'nok' => false,
'sha' => false,
);
// On compile la liste des pays traités et un indicateur global pour chaque cas d'erreur.
foreach ($statuts as $_statut) {
// Traitement des succès
if (!empty($_statut['sha'])) {
if ($type === 'subdivision') {
$variables['sha'][] = $_statut['pays'];
}
$statut_global['sha'] = true;
} elseif (!$_statut['ok']) {
if ($type === 'subdivision') {
$variables['nok'][] = $_statut['pays'];
}
$statut_global['nok'] = true;
} else {
if ($type === 'subdivision') {
$variables['ok'][] = $_statut['pays'];
}
$statut_global['ok'] = true;
}
}
// Traitement des succès
if ($statut_global['ok']) {
$messages['message_ok'] .= _T("territoires:msg_${action}_${type}_succes", array('pays' => implode(', ', $variables['ok'])));
}
// Traitement des erreurs
if ($statut_global['nok']) {
$messages['message_erreur'] .= _T("territoires:msg_${action}_${type}_erreur", array('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'])));
}
return $messages;
}

690
inc/territoire.php

@ -0,0 +1,690 @@
<?php
/**
* Gestion du formulaire de chargement ou de vidage des territoires.
*
* @package SPIP\TERRITOIRES\API
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS['territoires']['zone'] = array(
'champs' => array(
'base' => array(
'code_num' => 'iso_territoire',
'category' => 'categorie',
'parent' => 'iso_parent',
'label' => 'iso_titre',
),
),
'index' => 'zones',
);
$GLOBALS['territoires']['country'] = array(
'champs' => array(
'base' => array(
'code_alpha2' => 'iso_territoire',
'category' => 'categorie',
'code_continent' => 'iso_continent',
'label' => 'iso_titre',
),
'addon' => array(
'code_num_region' => 'iso_parent',
'code_alpha3' => '',
'code_num' => '',
'capital' => '',
'area' => '',
'population' => '',
'tld' => '',
'code_4217_3' => '',
'currency_en' => '',
'phone_id' => ''
),
),
'index' => 'pays',
);
$GLOBALS['territoires']['subdivision'] = array(
'champs' => array(
'base' => array(
'code_3166_2' => 'iso_territoire',
'type' => 'categorie',
'country' => 'iso_pays',
'parent' => 'iso_parent',
'label' => 'iso_titre',
)
),
'index' => 'subdivisions',
);
/**
* Peuple soit les régions du monde, soit les pays ou soit les subdivisions d'un pays.
* La fonction utilise les données fournies par Nomenclatures.
*
* @api
*
* @param string $type Type de territoires à peupler. Prends les valeurs `zone`, `country` ou `subdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays dont on veut peupler les subdivisions.
* N'est utilisé que si le type choisi est `subdivision`.
*
* @return array
*/
function territoire_peupler($type, $pays = '') {
// On initialise le retour à une erreur nok
$retour = array(
'ok' => false,
'arg' => false,
'sha' => false,
'type' => $type,
'pays' => $pays
);
// Le peuplement dépend du type :
// - type = zone ou country : on charge l'ensemble des régions du monde ou l'ensemble des pays
// - type = subdivision : il faut préciser le pays (code ISO alpha2) pour lequel on charge toutes les subdivisions
if (type_pays_est_valide($type, $pays)) {
$erreur = true;
$type_identique = false;
// On récupère tous les index fournis la collection et pas uniquement celui des territoires du type.
// Ainsi, les autres index éventuels restent disponibles.
$collection = territoire_acquerir($type, $pays);
if (!empty($collection[$GLOBALS['territoires'][$type]['index']])) {
// On extrait que l'index correspondant au type demandé
$territoires = $collection[$GLOBALS['territoires'][$type]['index']];
// Si le type de territoire est déjà chargé il possède un sha. Si le sha des data récupérées de Nomenclatures
// possèdent le même sha alors on ne fait aucun traitement et on indique que la configuration n'a pas
// changée. Dans ce cas, aucun traitement n'a lieu.
$sha_type = sha1(json_encode($territoires));
if (sha_est_identique($sha_type, $type, $pays)) {
$type_identique = true;
} else {
// Le sha a changé : il est donc licite de recharger les territoires.
// -- on préserve les éditions manuelles et les liens pour les réinjecter ensuite lors du
// rechargement
$sauvegardes = territoire_preserver($type, $pays);
// -- on vide les territoires avant de les remettre (inutile de gérer les erreurs
// car l'insertion les détectera).
territoire_depeupler($type, $pays);
// -- on insère chaque territoire comme un objet
include_spip('action/editer_objet');
$erreur_insertion = false;
$ids = array();
foreach ($territoires as $_territoire) {
// On initialise le territoire avec les noms de champs de la table spip_territoires
$territoire = enregistrement_initialiser($_territoire, $type, $pays);
// Si le code iso_continent est rempli c'est qu'on vient de charger les pays. Comme le code
// du continent est le code alpha2 on le remplace par le code M49 pour être homogène.
// -- la collection pays contient pour cela un bloc 'continents'.
if (!empty($territoire['iso_continent'])) {
$territoire['iso_continent'] = $collection['continents'][$territoire['iso_continent']]['code_num'];
}
// Intégrer les éventuelles modifications sauvegardées
if (isset($sauvegardes['editions'][$territoire['iso_territoire']])) {
// -- descriptif en fusionnant les traductions (priorité aux sauvegardes)
// -- remise à 'oui' de l'indicateur d'édition
$territoire['descriptif'] = traduction_fusionner(
$sauvegardes['editions'][$territoire['iso_territoire']]['nom_usage'],
$territoire['descriptif']
);
$territoire['edite'] = 'oui';
}
if ($id = objet_inserer('territoire', null, $territoire)) {
// On consigne le couple (iso, id) pour rétablir les liens si besoin
$ids[$territoire['iso_territoire']] = $id;
} else {
$erreur_insertion = true;
break;
}
}
if (!$erreur_insertion) {
// On rétablit les liens vers les territoires et les logos
// -- les liens avec les autres objets
lien_retablir('liens', $sauvegardes);
// -- les liens avec les logos
lien_retablir('logos', $sauvegardes);
// On stocke les informations de chargement du pays dans une meta.
$meta = array(
'sha' => $sha_type,
'nbr' => count($territoires),
'maj' => date('Y-m-d H:i:s')
);
peuplement_consigner($meta, $type, $pays);
$erreur = false;
}
spip_log("Les territoires (Type '${type}' - Pays '${pays}') ont été chargées", 'territoires' . _LOG_DEBUG);
}
} else {
spip_log("Aucun territoire pour (Type '${type}' - Pays '${pays}') retourné par Nomenclatures", 'territoires' . _LOG_ERREUR);
}
// Si le territoire est en erreur, on passe on stocke le cas d'erreur.
if ($erreur) {
if ($type_identique) {
$retour['sha'] = true;
spip_log("Les territoires de (Type '${type}' - Pays '${pays}') sont inchangés", 'territoires' . _LOG_DEBUG);
} else {
$retour['ok'] = false;
}
} else {
$retour['ok'] = true;
}
} else {
$retour['arg'] = true;
spip_log("Le couple (Type '${type}' - Pays '${pays}') est invalide", 'territoires' . _LOG_ERREUR);
}
return $retour;
}
/**
* Supprime de la base soit les régions du monde, soit les pays ou soit les subdivisions d'un pays.
*
* @api
*
* @param string $type Type de territoires à peupler. Prends les valeurs `zone`, `country` ou `subdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays dont on veut peupler les subdivisions.
* N'est utilisé que si le type choisi est `subdivision`.
*
* @return array Liste des code ISO 3166-1 alpha2 des pays chargés sous la forme [code] = nom multi.
*/
function territoire_depeupler($type, $pays = '') {
// On initialise le retour à une erreur nok
$retour = array(
'ok' => false,
'arg' => false,
'sha' => false,
'type' => $type,
'pays' => $pays
);
// Le vidage dépend du type :
// - type = zone ou country : on vide l'ensemble des régions du monde ou l'ensemble des pays
// - type = subdivision : il faut préciser le pays (code ISO alpha2) pour lequel on vide toutes les subdivisions
if (type_pays_est_valide($type, $pays)) {
// Inutile de vider une table vide
if (territoire_est_peuple($type, $pays)) {
// 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.
// -- on calcule donc d'emblée la condition IN qui sera appliquée sur la table de liens.
$from = 'spip_territoires';
$where = array(
'type=' . sql_quote($type),
);
if ($type === 'subdivision') {
$where[] = 'iso_pays=' . sql_quote($pays);
}
$where_lien[] = sql_in_select('id_territoire', 'id_territoire', $from, $where);
$where_logo[] = sql_in_select('id_objet', 'id_territoire', $from, $where);
$sql_ok = sql_delete($from, $where);
if ($sql_ok !== false) {
// Vider les liens éventuels avec les autres objets
$sql_ok = sql_delete('spip_territoires_liens', $where_lien);
// Vider les liens éventuels avec les logos (on gère pas d'erreur)
$where_logo[] = 'objet=' . sql_quote('territoire');
sql_delete('spip_documents_liens', $where_logo);
// Supprimer la meta propre au pays même si le vidage des liens est en erreur.
peuplement_deconsigner($type, $pays);
// Enregistrer le succès ou pas du déchargement de la table
if ($sql_ok !== false) {
// Succès complet
$retour['ok'] = true;
spip_log("Les territoires (Type '${type}' - Pays '${pays}') ont été vidés avec succès ainsi que les liens", 'territoires' . _LOG_DEBUG);
} else {
spip_log("Les territoires (Type '${type}' - Pays '${pays}') ont été vidés avec succès mais erreur lors du vidage des liens ", 'territoires' . _LOG_ERREUR);
}
} else {
spip_log("Erreur de vidage des territoires (Type '${type}' - Pays '${pays}')", 'territoires' . _LOG_ERREUR);
}
} else {
$retour['sha'] = true;
spip_log("Aucun territoire (Type '${type}' - Pays '${pays}') à vider", 'territoires' . _LOG_ERREUR);
}
} else {
$retour['arg'] = true;
spip_log("Le couple (Type '${type}' - Pays '${pays}') est invalide", 'territoires' . _LOG_ERREUR);
}
return $retour;
}
/**
* Extrait, pour un les régions, les pays ou les ubdivisions d'un pays, la liste des territoires ayant fait l'objet
* d'une modification manuelle (descriptif ou logo) et la liste associations vers ses mêmes territoires.
*
* @api
*
* @param string $type Type de territoires à préserver. Prends les valeurs `zone`, `country` ou `subdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays nécessaire si le type est `subdivision`.
*
* @return array
*/
function territoire_preserver($type, $pays = '') {
// Initialisation de la table et de la condition de base sur le type et éventuellement le pays.
$territoires = array();
$from = 'spip_territoires';
$where = array(
'type=' . sql_quote($type),
);
if ($type === 'subdivision') {
$where[] = 'iso_pays=' . sql_quote($pays);
}
// Extraction des liens vers les territoires du pays
$where_lien = array(
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(
'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
$select = array('id_territoire', 'iso_territoire');
// -- les liens
$where_ids = array(
sql_in('id_territoire', array_column($territoires['liens'], 'id_territoire'))
);
$ids = sql_allfetsel($select, $from, $where_ids);
$territoires['ids'] = array_column($ids, 'id_territoire', 'iso_territoire');
// -- les logos
$where_ids = array(
sql_in('id_territoire', array_column($territoires['logos'], 'id_objet'))
);
$ids = sql_allfetsel($select, $from, $where_ids);
$ids = array_column($ids, 'id_territoire', 'iso_territoire');
$territoires['ids'] = array_merge($territoires['ids'], $ids);
// Extraction des territoires éditées.
// -- détermination de la liste des champs éditables.
include_spip('base/objets');
$description_table = lister_tables_objets_sql($from);
// -- pour le select, les champs éditables sont complétés par le code ISO et l'id qui servira aux liens.
$select = array_merge($description_table['champs_editables'], array('iso_territoire'));
$where[] = 'edite=' . sql_quote('oui');
$editions = sql_allfetsel($select, $from, $where);
// -- indexer le tableau par le code iso de façon à simplifier la réintégration.
$territoires['editions'] = array_column($editions, null, 'iso_territoire');
return $territoires;
}
/**
* Acquiert les données de territoires disponibles dans Nomenclatures.
* La fonction utilise l'API fonctionnelle de Nomenclatures mais pourra ensuite utiliser directement API REST.
*
* @api
*
* @param string $type Type de territoires à acquérie. Prends les valeurs `zone`, `country` ou `subdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays nécessaire si le type est `subdivision`.
* @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`).
*
* @return array
*/
function territoire_acquerir($type, $pays = '', $options = array()) {
// Initialiser les territoires à vide pour gérer une éventuelle erreur de type.
$territoires = array();
// Déterminer la collection et les conditions à appliquer.
$conditions = array();
$collection = array();
if ($type === 'zone') {
$collection = 'zones';
} elseif ($type === 'country') {
$collection = 'pays';
} elseif ($type === 'subdivision') {
$collection = 'subdivisions';
if ($pays) {
$conditions = array('country=' . sql_quote($pays));
}
}
// Collectionner les territoires avec l'API fonctionnelle
if ($collection) {
// Ajouter les exclusions si nécessaire
$filtres = array();
if (!empty($options['exclure'])) {
$filtres = array('exclure' => $options['exclure']);
}
// TODO : utiliser l'API REST quand le site sera disponible
include_spip('ezrest/isocode');
$collectionner = "${collection}_collectionner";
$territoires = $collectionner(
$conditions,
$filtres,
array()
);
// Si on a demandé un seul index on le renvoie seul sinon on renvoie le tableau complet.
if (
!empty($options['index'])
and isset($territoires[$options['index']])
) {
$territoires = $territoires[$options['index']];
}
}
return $territoires;
}
/**
* Renvoie la liste des pays dont les territoires ont été chargées.
* La fonction lit la meta de chargement et non la table spip_territoires.
*
* @api
*
* @param string $type Type de territoires à acquérie. Prends les valeurs `zone`, `country` ou `subdivision`.
* @param array|string $pays Code ISO 3166-1 alpha2 du pays si le type est une subdivision.
*
* @return bool true si le territoire est chargé, false sinon.
*/
function territoire_est_peuple($type, $pays = '') {
// 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());
if ($type === 'subdivision') {
// Chaque pays chargé est un index du tableau
if (isset($peuplement[$type])) {
$est_peuple = array_key_exists($pays, $peuplement[$type]);
}
} else {
$est_peuple = isset($peuplement[$type]);
}
return $est_peuple;
}
// -----------------
// Services internes
// -----------------
/**
* 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 :
* - les régions du monde
* - les pays
* - les subdivisions d'un pays.
*
* @internal
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country` ou `subdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays dont on veut peupler les subdivisions.
* N'est utilisé que si le type choisi est `subdivision`.
*
* @return bool `true` si le couple (type, pays) est valide, `false` sinon.
*/
function type_pays_est_valide($type, $pays = '') {
$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)
if ($type === 'subdivision') {
if (strlen($pays) === 2) {
$est_valide = true;
}
} elseif (in_array($type, array('zone', 'country'))) {
$est_valide = true;
}
return $est_valide;
}
/**
* Compare le sha passé en argument pour le type de territoire concerné avec le sha stocké dans la meta
* pour cette même type.
*
* @internal
*
* @param string $sha SHA à comparer à celui du type de territoire.
* @param string $type Type de territoires à peupler. Prends les valeurs `zone`, `country` ou `subdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays dont on veut peupler les subdivisions.
* N'est utilisé que si le type choisi est `subdivision`.
*
* @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, $type, $pays = '') {
$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)
include_spip('inc/config');
if ($type === 'subdivision') {
$sha_stocke = lire_config("territoires_peuplement/${type}/${pays}/sha", false);
} else {
$sha_stocke = lire_config("territoires_peuplement/${type}/sha", false);
}
if ($sha_stocke and ($sha == $sha_stocke)) {
$sha_identique = true;
}
return $sha_identique;
}
/**
* Fusionne les traductions d'une balise `<multi>` avec celles d'une autre balise `<multi>`.
* L'une des balise est considérée comme prioritaire ce qui permet de régler le cas la même
* langue est présente dans les deux balises.
* Si on ne trouve pas de balise `<multi>` dans l'un ou l'autre des paramètres, on considère que
* le texte est tout même formaté de la façon suivante : texte0[langue1]texte1[langue2]texte2...
*
* @internal
*
* @param string $multi_prioritaire
* Balise multi considérée comme prioritaire en cas de conflit sur une langue.
* @param string $multi_non_prioritaire
* Balise multi considérée comme non prioritaire en cas de conflit sur une langue.
*
* @return string
* La chaine construite est toujours une balise `<multi>` complète ou une chaine vide sinon.
*/
function traduction_fusionner($multi_prioritaire, $multi_non_prioritaire) {
$multi_merge = '';
// On extrait le contenu de la balise <multi> si elle existe.
$multi_prioritaire = trim($multi_prioritaire);
$multi_non_prioritaire = trim($multi_non_prioritaire);
// Si les deux balises sont identiques on sort directement avec le multi prioritaire ce qui améliore les
// performances.
if ($multi_prioritaire == $multi_non_prioritaire) {
$multi_merge = $multi_prioritaire;
} else {
include_spip('inc/filtres');
if (preg_match(_EXTRAIRE_MULTI, $multi_prioritaire, $match)) {
$multi_prioritaire = trim($match[1]);
}
if (preg_match(_EXTRAIRE_MULTI, $multi_non_prioritaire, $match)) {
$multi_non_prioritaire = trim($match[1]);
}
if ($multi_prioritaire) {
if ($multi_non_prioritaire) {
// On extrait les traductions sous forme de tableau langue=>traduction.
$traductions_prioritaires = extraire_trads($multi_prioritaire);
$traductions_non_prioritaires = extraire_trads($multi_non_prioritaire);
// On complète les traductions prioritaires avec les traductions non prioritaires dont la langue n'est pas
// présente dans les traductions prioritaires.
foreach ($traductions_non_prioritaires as $_lang => $_traduction) {
if (!array_key_exists($_lang, $traductions_prioritaires)) {
$traductions_prioritaires[$_lang] = $_traduction;
}
}
// On construit le contenu de la balise <multi> mergé à partir des traductions prioritaires mises à jour.
// Les traductions vides sont ignorées.
ksort($traductions_prioritaires);
foreach ($traductions_prioritaires as $_lang => $_traduction) {
if ($_traduction) {
$multi_merge .= ($_lang ? '[' . $_lang . ']' : '') . trim($_traduction);
}
}
} else {
$multi_merge = $multi_prioritaire;
}
} else {
$multi_merge = $multi_non_prioritaire;
}
// Si le contenu est non vide on l'insère dans une balise <multi>
if ($multi_merge) {
$multi_merge = '<multi>' . $multi_merge . '</multi>';
}
}
return $multi_merge;
}
/**
* Consigne le peuplement d'un type de territoire.
*
* @internal
*
* @param array $contenu Informations sur le peuplement à consigner dans la meta
* @param string $type Type de territoires à peupler. Prends les valeurs `zone`, `country` ou `subdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays dont on veut peupler les subdivisions.
* N'est utilisé que si le type choisi est `subdivision`.
*
* @return void
*/
function peuplement_consigner($contenu, $type, $pays = '') {
// Prendre en compte l'indexation par pays pour les subdivisions
include_spip('inc/config');
if ($type === 'subdivision') {
ecrire_config("territoires_peuplement/${type}/${pays}", $contenu);
} else {
ecrire_config("territoires_peuplement/${type}", $contenu);
}
}
/**
* Supprime la consignation du peuplement d'un type de territoire.
*
* @internal
*
* @param string $type Type de territoires à peupler. Prends les valeurs `zone`, `country` ou `subdivision`.
* @param string $pays Code ISO 3166-1 alpha2 du pays dont on veut peupler les subdivisions.
* N'est utilisé que si le type choisi est `subdivision`.
*
* @return void
*/
function peuplement_deconsigner($type, $pays = '') {
// Prendre en compte l'indexation par pays pour les subdivisions
include_spip('inc/config');
if ($type === 'subdivision') {
effacer_config("territoires_peuplement/${type}/${pays}");
} else {
effacer_config("territoires_peuplement/${type}");
}
}
/**
* Supprime la consignation du peuplement d'un type de territoire.
*
* @internal
*
* @param string $type_lien Type de liens à restaurer : `liens` ou `logos`.
* @param array $sauvegardes Tableau des sauvegardes dans lequel puiser les liens existants et les nouveaux id.
*
* @return void
*/
function lien_retablir($type_lien, $sauvegardes) {
// Configuration des tables de liens
static $tables = array(
'liens' => array(
'table' => 'spip_territoires_liens',
'id_table' => 'id_territoire'
),
'logos' => array(
'table' => 'spip_documents_liens',
'id_table' => 'id_objet'
)
);
// On contruit la liste des enregistrements correspondant aux liens à rétablir.
$liens = array();
foreach ($sauvegardes[$type_lien] as $_lien) {
// identifier le code iso à partir de l'ancien id
$iso = array_search($_lien[$tables[$type_lien]['id_table']], $sauvegardes['ids']);
// en déduire le nouvel id de la territoire et le mettre à jour dans le tableau
// -- si l'iso n'est pas trouvé dans les nouveaux c'est que la territoire n'existe plus
// et qu'il ne faut pas rétablir les liens
if (isset($ids[$iso])) {
$lien = $_lien;
$lien[$tables[$type_lien]['id_table']] = $ids[$iso];
$liens[] = $lien;
}
}
// Insertion des liens en une seule requête
if ($liens) {
sql_insertq_multi($tables[$type_lien]['table'], $liens);
}
}
function enregistrement_initialiser($territoire, $type, $pays = '') {
// Traduire les champs de Isocode en champs pour Territoires
$enregistrement = array();
$champs = $GLOBALS['territoires'][$type]['champs']['base'];
foreach ($champs as $_champ_source => $_champ_territoire) {
$enregistrement[$_champ_territoire] = $territoire[$_champ_source];
}
// Compléter systématiquement avec le type et le nom d'usage qui pour l'instant n'est pas fourni
// TODO : pour l'instant Nomenclatures ne fournit pas de nom d'usage : on duplique le nom ISO.
$enregistrement['type'] = $type;
$enregistrement['nom_usage'] = $enregistrement['iso_titre'];
// Gestion des parentés inter-types : on remplit systématiquement le champ parent pour créer une hiérarchie complète
// inter-type et ce que le type parent soit peuplé ou pas.
// Cela revient :
// -- à ajouter le pays d'appartenance des subdivisions de plus haut niveau
if (
($type === 'subdivision')
and (!$enregistrement['iso_parent'])
) {
// Le pays d'appartenance est toujours inclus dans le champ iso_pays
$enregistrement['iso_parent'] = $enregistrement['iso_pays'];
}
// -- à ajouter la région d'appartenance des pays (pas de hiérarchie dans les pays).
if (
($type === 'country')
) {
// La région d'appartenance est toujours inclus dans le champ code_num_region fourni par Nomenclatures
$enregistrement['iso_parent'] = $territoire['code_num_region'];
}
return $enregistrement;
}

14
lang/paquet-territoires_fr.php

@ -0,0 +1,14 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// T
'territoires_description' => '',
'territoires_nom' => 'Territoires',
'territoires_slogan' => 'La hiérarchie des zones géographiques du continent à la subdivision d\'un pays',
);

72
lang/territoire_fr.php

@ -0,0 +1,72 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'ajouter_lien_territoire' => 'Ajouter ce territoire',
// C
'categorie_canton' => 'Canton',
'categorie_land' => 'Land',
'categorie_region' => 'Région',
'categorie_province' => 'Province',
'categorie_metropolitan_department' => 'Département métropolitain',
'categorie_metropolitan_region' => 'Région métropolitaine',
'categorie_dependency' => 'Dépendance',
'categorie_collectivity' => 'Collectivité',
'categorie_overseas_region' => 'Région d\'outre-mer',
'categorie_overseas_department' => 'Département d\'outre-mer',
'categorie_overseas_territorial_collectivity' => 'Collectivité territoriale d\'outre-mer',
'categorie_country' => 'Pays',
'categorie_area' => 'Zone',
'categorie_zone_continent' => 'Continent',
'categorie_zone_region' => 'Région',
'champ_categorie_label' => 'Catégorie',
'champ_descriptif_label' => 'Descriptif',
'champ_edite_label' => 'Edité ?',
'champ_iso_continent_label' => 'Continent',
'champ_iso_parent_label' => 'Parent',
'champ_iso_pays_label' => 'Pays',
'champ_iso_territoire_label' => 'Code ISO',
'champ_iso_titre_label' => 'Nom ISO',
'champ_nom_usage_label' => 'Nom d\'usage',
'champ_type_label' => 'Type',
'confirmer_supprimer_territoire' => 'Confirmez-vous la suppression de cet territoire ?',
// I
'icone_creer_territoire' => 'Créer un territoire',
'icone_modifier_territoire' => 'Modifier ce territoire',
'info_1_territoire' => 'Un territoire',
'info_aucun_territoire' => 'Aucun territoire',
'info_nb_territoires' => '@nb@ territoires',
'info_territoires_auteur' => 'Les territoires de cet auteur',
// R
'retirer_lien_territoire' => 'Retirer ce territoire',
'retirer_tous_liens_territoires' => 'Retirer tous les territoires',
// S
'supprimer_territoire' => 'Supprimer cet territoire',
// T
'texte_ajouter_territoire' => 'Ajouter un territoire',
'texte_changer_statut_territoire' => 'Ce territoire est :',
'texte_creer_associer_territoire' => 'Créer et associer un territoire',
'texte_definir_comme_traduction_territoire' => 'Ce territoire est une traduction du territoire numéro :',
'titre_langue_territoire' => 'Langue de ce territoire',
'titre_logo_territoire' => 'Logo de ce territoire',
'titre_objets_lies_territoire' => 'Liés à ce territoire',
'titre_page_territoires' => 'Les territoires',
'titre_territoire' => 'Territoire',
'titre_territoires' => 'Territoires',
'titre_territoires_rubrique' => 'Territoires de la rubrique',
'type_region' => 'Région',
'type_country' => 'Pays',
'type_subdivision' => 'Subdivision',
);

62
lang/territoires_fr.php

@ -0,0 +1,62 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// C
'cfg_titre_parametrages' => 'Paramétrages',
'cfg_label_objets_associes' => 'Permettre l\'association de territoire à des objets',
// E
'explication_peupler_form' => 'Si les territoires sont déjà chargées ils seront supprimés avant le rechargement. Néanmoins, les éventuelles modifications manuelles faites après le chargement initial et les liens avec les logos et les autres objets seront conservés.
<br />Le vidage lui ne conserve ni les territoires ni les liens.',
'explication_zone_pays_territoire' => 'Régions & Pays',
'explication_subdivision_territoire' => 'Subdivisions',
// I
'info_territoire_peuple' => 'chargé',
// L
'label_peupler_action' => 'Choisissez une action',
'label_peupler_territoire' => 'Choisissez les territoires sur lesquels appliquer l\'action sélectionnée',
// M
'menu_peupler' => 'Peupler les territoires',
'menu_configurer' => 'Configurer le plugin',
'menu_lister' => 'Lister les territoires',
// O
'option_depeupler_action' => 'Vider',
'option_peupler_action' => 'Peupler',
'option_zone_territoire' => 'Toutes les régions du monde',
'option_country_territoire' => 'Tous les pays',
// S
'msg_depeupler_zone_erreur' => 'Une erreur s\'est produite lors du vidage des régions du monde.',
'msg_depeupler_zone_notice' => 'Aucun vidage n\'est nécessaire pour les régions du monde.',
'msg_depeupler_zone_succes' => 'Les régions du monde ont bien été vidées.',
'msg_peupler_zone_erreur' => 'Une erreur s\'est produite lors du peuplement des régions du monde.',
'msg_peupler_zone_notice' => 'Aucune mise à jour n\'est nécessaire pour les régions du monde.',
'msg_peupler_zone_succes' => 'Les régions du monde ont bien été chargées.',
'msg_depeupler_country_erreur' => 'Une erreur s\'est produite lors du vidage des pays.',
'msg_depeupler_country_notice' => 'Aucun vidage n\'est nécessaire pour les pays.',
'msg_depeupler_country_succes' => 'Les pays ont bien été vidés.',
'msg_peupler_country_erreur' => 'Une erreur s\'est produite lors du peuplement des pays.',
'msg_peupler_country_notice' => 'Aucune mise à jour n\'est nécessaire pour les pays.',
'msg_peupler_country_succes' => 'Les pays ont bien été chargés.',
'msg_depeupler_subdivision_erreur' => 'Une erreur s\'est produite lors du vidage des subdivisions du ou des pays « @pays@ ».',
'msg_depeupler_subdivision_notice' => 'Aucun vidage n\'est nécessaire pour les subdivisions du ou des pays « @pays@ ».',
'msg_depeupler_subdivision_succes' => 'Les subdivisions du ou des pays « @pays@ » ont bien été vidées.',
'msg_peupler_subdivision_erreur' => 'Une erreur s\'est produite lors du peuplement des subdivisions du ou des pays « @pays@ ».',
'msg_peupler_subdivision_notice' => 'Aucune mise à jour n\'est nécessaire pour les subdivisions du ou des pays « @pays@ ».',
'msg_peupler_subdivision_succes' => 'Les subdivisions du ou des pays « @pays@ » ont bien été chargées.',
// T
'territoires_titre' => 'Territoires',
'titre_page_configurer' => 'Configurer Territoires',
'titre_page_peupler' => 'Peupler Territoires',
);

33
paquet.xml

@ -0,0 +1,33 @@
<paquet
prefix="territoires"
categorie="divers"
version="1.0.0"
etat="dev"
compatibilite="[3.3.0-dev;3.3.*]"
logo="territoires-64.png"
documentation=""
schema="1"
>
<!--
Paquet généré le 2020-07-02 13:44:33
-->
<nom>Territoires</nom>
<!-- La hiérarchie des zones géographiques du continent à la subdivision d&#039;un pays -->
<auteur lien='https://blog.smellup.net'>Eric Lupinacci</auteur>
<licence>GNU/GPL</licence>
<necessite nom="saisies" compatibilite="[3.23.2;]" />
<pipeline nom="autoriser" inclure="territoires_autorisations.php" />
<pipeline nom="declarer_tables_objets_sql" inclure="base/territoires.php" />
<pipeline nom="declarer_tables_interfaces" inclure="base/territoires.php" />
<pipeline nom="declarer_tables_auxiliaires" inclure="base/territoires.php" />
<pipeline nom="affiche_milieu" inclure="territoires_pipelines.php" />
<pipeline nom="optimiser_base_disparus" inclure="territoires_pipelines.php" />
<menu nom="territoires" titre="territoire:titre_territoires" parent="menu_edition" icone="images/territoire-16.png" action="territoires" />
</paquet>

52
prive/objets/contenu/territoire.html

@ -0,0 +1,52 @@
<BOUCLE_territoire(TERRITOIRES){id_territoire}>
[<div class="champ contenu_iso_territoire[ (#ISO_TERRITOIRE*|strlen|?{'',vide})]">
<div class="label"><:territoire:champ_iso_territoire_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{iso_territoire} iso_territoire">(#ISO_TERRITOIRE)</span>
</div>]
[<div class="champ contenu_iso_titre[ (#ISO_TITRE*|strlen|?{'',vide})]">
<div class="label"><:territoire:champ_iso_titre_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{iso_titre} iso_titre">(#ISO_TITRE)</span>
</div>]
[<div class="champ contenu_nom_usage[ (#NOM_USAGE*|strlen|?{'',vide})]">
<div class="label"><:territoire:champ_nom_usage_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{nom_usage} nom_usage">(#NOM_USAGE)</span>
</div>]
[<div class="champ contenu_descriptif[ (#DESCRIPTIF*|strlen|?{'',vide})]">
<div class="label"><:territoire:champ_descriptif_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{descriptif} descriptif">(#DESCRIPTIF)</span>
</div>]
[<div class="champ contenu_type[ (#TYPE*|strlen|?{'',vide})]">
<div class="label"><:territoire:champ_type_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{type} type">(#TYPE)</span>
</div>]
[<div class="champ contenu_categorie[ (#CATEGORIE*|strlen|?{'',vide})]">
<div class="label"><:territoire:champ_categorie_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{categorie} categorie">(#CATEGORIE)</span>
</div>]