@ -16,8 +16,8 @@ $GLOBALS['territoires']['zone'] = array(
'parent' => 'iso_parent',
'label' => 'iso_titre',
),
'index' => 'zones',
),
'index' => 'zones',
);
$GLOBALS['territoires']['country'] = array(
@ -28,20 +28,22 @@ $GLOBALS['territoires']['country'] = array(
'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' => ''
'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'
),
),
'index' => 'pays',
),
'index' => 'pays',
);
$GLOBALS['territoires']['subdivision'] = array(
@ -52,9 +54,19 @@ $GLOBALS['territoires']['subdivision'] = array(
'country' => 'iso_pays',
'parent' => 'iso_parent',
'label' => 'iso_titre',
)
),
'index' => 'subdivisions',
),
'extras' => array(
'code' => array(
'champs' => array(
'type_alter' => 'extra',
'code_alter' => 'valeur',
),
'index' => 'alternates',
'cle_iso' => 'code_3166_2',
),
),
'index' => 'subdivisions',
);
/**
@ -63,13 +75,17 @@ $GLOBALS['territoires']['subdivision'] = 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`.
* @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`.
* @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
* et `info` pour le caractéristiques (table spip_territoires_extras)
*
* @return array
*/
function territoire_peupler($type, $pays = '') {
function territoire_peupler($type, $pays = '', $options = array() ) {
// On initialise le retour à une erreur nok
$retour = array(
@ -86,19 +102,23 @@ function territoire_peupler($type, $pays = '') {
if (type_pays_est_valide($type, $pays)) {
$erreur = true;
$type_identique = false;
$configuration = $GLOBALS['territoires'][$type];
// 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']])) {
if (!empty($collection[$configuration['champs' ]['index']])) {
// On extrait que l'index correspondant au type demandé
$territoires = $collection[$GLOBALS['territoires'][$type ]['index']];
$territoires = $collection[$configuration['champs' ]['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)) {
if (
sha_est_identique($sha_type, $type, $pays)
and empty($options['force'])
) {
$type_identique = true;
} else {
// Le sha a changé : il est donc licite de recharger les territoires.
@ -114,6 +134,8 @@ function territoire_peupler($type, $pays = '') {
include_spip('action/editer_objet');
$erreur_insertion = false;
$ids = array();
$extras = array();
$meta_extras = 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);
@ -139,6 +161,35 @@ function territoire_peupler($type, $pays = '') {
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;
// Si demandé et que la configuration le prévoit préparer le tableau des extras inclus dans
// le bloc principal des territoires
if (!empty($options['extras'])) {
foreach ($options['extras'] as $_type_extra) {
// Vérifier qu'il existe des extras pour le type de territoire
if (!empty($configuration['champs']['extras'][$_type_extra])) {
// on extrait de chaque territoire les champs extras
$extra_defaut = array(
'iso_territoire' => $territoire['iso_territoire'],
'type_extra' => $_type_extra,
'type' => $type,
'iso_pays' => $pays,
);
// chaque champ extra du territoire devient un objet extra de la table spip_territoires_extras
foreach ($configuration['champs']['extras'][$_type_extra] as $_champ_api => $_extra) {
$extra = $extra_defaut;
$extra['extra'] = $_extra;
$extra['valeur'] = $_territoire[$_champ_api];
$extras[] = $extra;
}
// Enregistrer le type d'extra pour la meta de consignation
if (!in_array($_type_extra, $meta_extras)) {
$meta_extras[] = $_type_extra;
}
}
}
}
} else {
$erreur_insertion = true;
break;
@ -146,6 +197,50 @@ function territoire_peupler($type, $pays = '') {
}
if (!$erreur_insertion) {
// Traitements des extras
if (!empty($options['extras'])) {
// Ajouter les extras inclus dans le bloc principal préparés lors de la création des territoires.
if ($extras) {
sql_insertq_multi('spip_territoires_extras', $extras);
}
// Traiter les extras inclus dans un bloc annexe
if (!empty($configuration['extras'])) {
$extras = array();
foreach ($options['extras'] as $_type_extra) {
// Vérifier qu'il existe des extras pour le type de territoire
if (
!empty($configuration['extras'][$_type_extra])
and isset($collection[$configuration['extras'][$_type_extra]['index']])
) {
$extra_defaut = array(
'type_extra' => $_type_extra,
'type' => $type,
'iso_pays' => $pays,
);
$champs_extras = array_flip($configuration['extras'][$_type_extra]['champs']);
foreach ($collection[$configuration['extras'][$_type_extra]['index']] as $_extra) {
$extra = $extra_defaut;
$extra['iso_territoire'] = $_extra[$configuration['extras'][$_type_extra]['cle_iso']];
$extra['extra'] = $champs_extras['extra'];
$extra['valeur'] = $champs_extras['valeur'];
$extras[] = $extra;
}
// Enregistrer le type d'extra pour la meta de consignation
if (!in_array($_type_extra, $meta_extras)) {
$meta_extras[] = $_type_extra;
}
}
}
// Ajouter les extras venant d'être extraits des blocs annexes.
if ($extras) {
sql_insertq_multi('spip_territoires_extras', $extras);
}
}
}
// On rétablit les liens vers les territoires et les logos
// -- les liens avec les autres objets
lien_retablir('liens', $sauvegardes);
@ -157,7 +252,8 @@ function territoire_peupler($type, $pays = '') {
$meta = array(
'sha' => $sha_type,
'nbr' => count($territoires),
'maj' => date('Y-m-d H:i:s')
'maj' => date('Y-m-d H:i:s'),
'ext' => $meta_extras
);
peuplement_consigner($meta, $type, $pays);
$erreur = false;
@ -172,7 +268,7 @@ function territoire_peupler($type, $pays = '') {
if ($erreur) {
if ($type_identique) {
$retour['sha'] = true;
spip_log("Les territoires de (Type '${type}' - Pays '${pays}') sont inchangés", 'territoires' . _LOG_DEBUG );
spip_log("Les territoires de (Type '${type}' - Pays '${pays}') sont inchangés", 'territoires' . _LOG_AVERTISSEMENT );
} else {
$retour['ok'] = false;
}
@ -230,30 +326,35 @@ function territoire_depeupler($type, $pays = '') {
$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 extras si besoin
$sql_ok = sql_delete('spip_territoires_extras', $where);
if ($sql_ok !== false) {
// 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);
// 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);
// Vider les liens éventuels avec les autres objets (on gère pas d'erreur)
sql_delete('spip_territoires_liens', $where_lien);
// Supprimer la meta propre au pays même si le vidage des liens est en erreur.
peuplement_deconsigner($type, $pays);
// 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 lien s", 'territoires' . _LOG_DEBUG);
spip_log("Les territoires (Type '${type}' - Pays '${pays}') ont été vidés avec succès ainsi que les extra s", '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);
spip_log("Les territoires (Type '${type}' - Pays '${pays}') ont été vidés avec succès mais erreur lors du vidage des extras ", '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 );
spip_log("Aucun territoire (Type '${type}' - Pays '${pays}') à vider", 'territoires' . _LOG_AVERTISSEMENT );
}
} else {
$retour['arg'] = true;
@ -266,6 +367,7 @@ function territoire_depeupler($type, $pays = '') {
/**
* 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.
* Les extras ne sont pas sauvegardés car il ne sont ni modifiables ni indexés par un id.
*
* @api
*
@ -657,8 +759,8 @@ 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 ];
foreach ($champs as $_champ_api => $_champ_territoire) {
$enregistrement[$_champ_territoire] = $territoire[$_champ_api ];
}
// Compléter systématiquement avec le type et le nom d'usage qui pour l'instant n'est pas fourni