diff --git a/README.md b/README.md index bf06690..99418db 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ # territoires -Gestion des zones géographiques du continent à la subdivision +Gestion des zones géographiques du continent à la subdivision minimale d'un pays diff --git a/formulaires/peupler_territoires.html b/formulaires/peupler_territoires.html index 3d94063..7023df1 100644 --- a/formulaires/peupler_territoires.html +++ b/formulaires/peupler_territoires.html @@ -18,12 +18,6 @@ obligatoire=oui, })] - [(#SAISIE{case, forcer, - label_case=<:territoires:label_case_forcer:>, - explication=<:territoires:explication_forcer:>, - conteneur_class=long_label, - })] - [(#SAISIE{checkbox, types, label=<:territoires:label_peupler_territoire:>, explication=<:territoires:explication_zone_country_territoire:>, @@ -38,17 +32,33 @@ obligatoire=oui, tout_selectionner=oui, })] + - [(#SAISIE{case, extra_code, - label_case=<:territoires:label_case_extra_code:>, - conteneur_class=long_label, - })] +
@@ -58,3 +68,20 @@
]
+
+
diff --git a/formulaires/peupler_territoires.php b/formulaires/peupler_territoires.php
index 4d826f3..aeab934 100644
--- a/formulaires/peupler_territoires.php
+++ b/formulaires/peupler_territoires.php
@@ -65,7 +65,7 @@ function formulaires_peupler_territoires_charger() {
}
}
- // Ne pas sélectionner des pays par défaut et ne pas se trainer les messages d'erreur
+ // Ne pas sélectionner un type ou un pays par défaut
set_request('types', array());
set_request('pays', array());
@@ -103,6 +103,7 @@ function formulaires_peupler_territoires_verifier() {
/**
* Exécution du formulaire : les territoires choisis sont soit vidés, soit chargés.
*
+ * @uses territoire_est_peuple()
* @uses territoire_peupler()
* @uses territoire_depeupler()
* @uses formulaires_peupler_territoires_notifier()
@@ -121,14 +122,28 @@ function formulaires_peupler_territoires_traiter() {
// 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.
+ include_spip('inc/territoire');
$action = _request('action_territoire');
if ($action === 'peupler_force') {
$action = 'peupler';
}
$types = _request('types');
$pays = _request('pays');
+ $infra = _request('infrasub');
if ($pays) {
$types[] = 'subdivision';
+ if (
+ (
+ ($action === 'peupler')
+ and $infra
+ )
+ or (
+ ($action === 'depeupler')
+ and territoire_est_peuple('infra_subdivision', $pays)
+ )
+ ) {
+ $types[] = 'infra_subdivision';
+ }
}
// Détermination des options de l'action
@@ -145,11 +160,14 @@ 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)
- include_spip('inc/territoire');
$actionner = "territoire_${action}";
+ $statut = array();
foreach ($types as $_type) {
// Traitement du type en prenant en compte le cas particulier des subdivisions.
- if ($_type === 'subdivision') {
+ if (
+ include_spip('inc/territoires_utils')
+ and type_est_subdivision($_type)
+ ) {
foreach ($pays as $_pays) {
$statut[] = $actionner($_type, $_pays, $options);
}
@@ -203,20 +221,21 @@ function formulaires_peupler_territoires_notifier($type, $messages, $action, $st
);
// On compile la liste des pays traités et un indicateur global pour chaque cas d'erreur.
+ include_spip('inc/territoires_utils');
foreach ($statuts as $_statut) {
// Traitement des succès
if (!empty($_statut['sha'])) {
- if ($type === 'subdivision') {
+ if (type_est_subdivision($type)) {
$variables['sha'][] = $_statut['pays'];
}
$statut_global['sha'] = true;
} elseif (!$_statut['ok']) {
- if ($type === 'subdivision') {
+ if (type_est_subdivision($type)) {
$variables['nok'][] = $_statut['pays'];
}
$statut_global['nok'] = true;
} else {
- if ($type === 'subdivision') {
+ if (type_est_subdivision($type)) {
$variables['ok'][] = $_statut['pays'];
}
$statut_global['ok'] = true;
diff --git a/inc/requeter_isocode.php b/inc/requeter_isocode.php
index 5fd1403..beec80c 100644
--- a/inc/requeter_isocode.php
+++ b/inc/requeter_isocode.php
@@ -44,7 +44,7 @@ function inc_requeter_isocode_dist($url_base, $collection, $filtres, $taille_max
include_spip('inc/distant');
$options = array(
'transcoder' => true,
- 'taille_max' => _INC_DISTANT_MAX_SIZE * _TERRITOIRE_COEFF_MAX_DISTANT,
+ 'taille_max' => $taille_max ? $taille_max : _INC_DISTANT_MAX_SIZE * _TERRITOIRE_COEFF_MAX_DISTANT,
);
// Acquisition du flux de données
diff --git a/inc/territoire.php b/inc/territoire.php
index 46bf524..a23405b 100644
--- a/inc/territoire.php
+++ b/inc/territoire.php
@@ -15,9 +15,8 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @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` sinon est une chaine vide.
+ * @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infra_subdivision`.
+ * @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infra_subdivision` sinon une chaine vide.
* @param array $options Options de peuplement (défaut à `false`) :
* - `force` : si `true` force le repeuplement même si le sha est identique.
* - `extras`: tableau des types d'extras à peupler soit `code` pour les codes alternatifs
@@ -38,7 +37,7 @@ function territoire_peupler($type, $pays, $options = array()) {
// 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
+ // - type = subdivision ou infra_subdivision : il faut préciser le pays (code ISO alpha2) pour lequel on charge toutes les subdivisions
include_spip('inc/territoires_services');
include_spip('inc/territoires_utils');
if (type_pays_est_valide($type, $pays)) {
@@ -77,6 +76,14 @@ function territoire_peupler($type, $pays, $options = array()) {
// -- on vide les territoires avant de les remettre (inutile de gérer les erreurs
// car l'insertion les détectera).
+ // On gère aussi les infra subdivisions qui doivent être vidées au préalable si on vide
+ // les subdivisions parents.
+ if (
+ ($type === 'subdivision')
+ and territoire_est_peuple('infra_subdivision', $pays)
+ ) {
+ territoire_depeupler('infra_subdivision', $pays);
+ }
territoire_depeupler($type, $pays);
// -- on insère chaque territoire comme un objet
@@ -230,9 +237,8 @@ function territoire_peupler($type, $pays, $options = array()) {
*
* @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` sinon est une chaine vide.
+ * @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infra_subdivision`.
+ * @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infra_subdivision` sinon une chaine vide.
*
* @return array Liste des code ISO 3166-1 alpha2 des pays chargés sous la forme [code] = nom multi.
*/
@@ -249,7 +255,7 @@ function territoire_depeupler($type, $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
+ // - type = subdivision ou infra_subdivision : il faut préciser le pays (code ISO alpha2) pour lequel on vide toutes les subdivisions
include_spip('inc/territoires_services');
include_spip('inc/territoires_utils');
if (type_pays_est_valide($type, $pays)) {
@@ -264,7 +270,7 @@ function territoire_depeupler($type, $pays = '') {
$where = array(
'type=' . sql_quote($type),
);
- if ($type === 'subdivision') {
+ if (type_est_subdivision($type)) {
$where[] = 'iso_pays=' . sql_quote($pays);
}
if ($ids = sql_allfetsel('id_territoire', $from, $where)) {
@@ -337,8 +343,8 @@ function territoire_depeupler($type, $pays = '') {
*
* @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 sinon une chaine vide.
+ * @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infra_subdivision`.
+ * @param array|string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infra_subdivision` sinon une chaine vide.
*
* @return bool true si le territoire est chargé, false sinon.
*/
@@ -350,7 +356,10 @@ function territoire_est_peuple($type, $pays = '') {
// La liste des territoires chargés est en meta.
include_spip('inc/config');
$peuplement = lire_config('territoires_peuplement', array());
- if ($type === 'subdivision') {
+ if (
+ include_spip('inc/territoires_utils')
+ and type_est_subdivision($type)
+ ) {
// Chaque pays chargé est un index du tableau
if (isset($peuplement[$type])) {
$est_peuple = array_key_exists($pays, $peuplement[$type]);
@@ -368,9 +377,9 @@ function territoire_est_peuple($type, $pays = '') {
*
* @api
*
- * @param string $type Type de territoires à acquérir. Prends les valeurs `zone`, `country` ou `subdivision`.
- * @param array|string $pays Code ISO 3166-1 alpha2 du pays si le type est une subdivision ou chaine vide sinon.
- * @param string $type_extra Type d'extra. Prends les valeurs `code` ou `info`.
+ * @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infra_subdivision`.
+ * @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infra_subdivision` sinon une chaine vide.
+ * @param string $type_extra Type d'extra. Prends les valeurs `code` ou `info`.
*
* @return bool true si le territoire est chargé, false sinon.
*/
@@ -382,7 +391,10 @@ function territoire_extra_est_peuple($type, $pays, $type_extra) {
// La liste des territoires chargés est en meta.
include_spip('inc/config');
$peuplement = lire_config('territoires_peuplement', array());
- if ($type === 'subdivision') {
+ if (
+ include_spip('inc/territoires_utils')
+ and type_est_subdivision($type)
+ ) {
// Chaque pays chargé est un index du tableau
if (isset($peuplement[$type][$pays]['ext'])) {
$est_peuple = in_array($type_extra, $peuplement[$type][$pays]['ext']);
diff --git a/inc/territoires_services.php b/inc/territoires_services.php
index 44709b1..6d90d16 100644
--- a/inc/territoires_services.php
+++ b/inc/territoires_services.php
@@ -18,9 +18,8 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @api
*
- * @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`.
+ * @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infra_subdivision`.
+ * @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infra_subdivision` sinon une chaine vide.
*
* @return bool `true` si le couple (type, pays) est valide, `false` sinon.
*/
@@ -28,7 +27,8 @@ 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') {
+ include_spip('inc/territoires_utils');
+ if (type_est_subdivision($type)) {
if (strlen($pays) === 2) {
$est_valide = true;
}
diff --git a/inc/territoires_utils.php b/inc/territoires_utils.php
index 0f995d9..88f4c83 100644
--- a/inc/territoires_utils.php
+++ b/inc/territoires_utils.php
@@ -97,9 +97,9 @@ function territoires_configurer() {
*
* @internal
*
- * @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
+ * @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infra_subdivision`.
+ * @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infra_subdivision` 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`).
*
* @return array
@@ -116,8 +116,11 @@ function territoires_acquerir($type, $pays = '', $options = array()) {
$collection = 'zones';
} elseif ($type === 'country') {
$collection = 'pays';
- } elseif ($type === 'subdivision') {
- $collection = 'subdivisions';
+ } elseif (
+ include_spip('inc/territoires_utils')
+ and type_est_subdivision($type)
+ ) {
+ $collection = "${type}s";
if ($pays) {
$filtres = array('pays' => $pays);
}
@@ -155,8 +158,8 @@ function territoires_acquerir($type, $pays = '', $options = array()) {
*
* @internal
*
- * @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`.
+ * @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infra_subdivision`.
+ * @param string $pays Code ISO 3166-1 alpha2 du pays si le type est `subdivision` ou `infra_subdivision` sinon une chaine vide.
*
* @return array
*/
@@ -168,7 +171,7 @@ function territoires_preserver($type, $pays = '') {
$where = array(
'type=' . sql_quote($type),
);
- if ($type === 'subdivision') {
+ if (type_est_subdivision($type)) {
$where[] = 'iso_pays=' . sql_quote($pays);
}
@@ -240,10 +243,8 @@ function territoires_preserver($type, $pays = '') {
*
* @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.
+ * @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 ` #ISO_TERRITOIRE