Mise au point du chargement et déchargement des extras (codes et infos) sur les territoires (dans la table spip_territoires_extras.

Resta à les afficher dans la fiche objet.
Attention le schéma de base à changer mais pas le numéro : il faut désinstaller et tout réinstaller.
v0_spip32
Eric Lupinacci 3 years ago
parent 127e103209
commit 398c347963

@ -32,6 +32,16 @@
obligatoire=oui,
tout_selectionner=oui,
})]
[(#SAISIE{case, extra_code,
label_case=<:territoires:label_case_extra_code:>,
conteneur_class=long_label,
})]
[(#SAISIE{case, extra_info,
label_case=<:territoires:label_case_extra_info:>,
conteneur_class=long_label,
})]
</div>
<p class="boutons">

@ -32,8 +32,9 @@ function formulaires_peupler_territoires_charger() {
// Lister les actions sur les tables
$valeurs['_actions_peuplement'] = array(
'peupler' => _T('territoires:option_peupler_action'),
'depeupler' => _T('territoires:option_depeupler_action')
'peupler' => _T('territoires:option_peupler_action'),
'peupler_force' => _T('territoires:option_peupler_force_action'),
'depeupler' => _T('territoires:option_depeupler_action')
);
// Initialiser la liste des types de territoire disponibles (régions, pays)
@ -122,12 +123,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.
$action = _request('action_peuplement');
$forcer = false;
if ($action === 'peupler_force') {
$action = 'peupler';
$forcer = true;
}
$types = _request('types');
$pays = _request('pays');
if ($pays) {
$types[] = 'subdivision';
}
// Détermination des options de l'action
$options = array();
if ($forcer) {
$options['force'] = $forcer;
}
foreach (array('code', 'info') as $_type_extra) {
if (_request("extra_${_type_extra}")) {
$options['extras'][] = $_type_extra;
}
}
// 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');
@ -136,10 +153,10 @@ function formulaires_peupler_territoires_traiter() {
// Traitement du type en prenant en compte le cas particulier des subdivisions.
if ($_type === 'subdivision') {
foreach ($pays as $_pays) {
$statut[] = $actionner($_type, $_pays);
$statut[] = $actionner($_type, $_pays, $options);
}
} else {
$statut[] = $actionner($_type);
$statut[] = $actionner($_type, '', $options);
}
// Formater le message correspondant au traitement du type

@ -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 liens", 'territoires' . _LOG_DEBUG);
spip_log("Les territoires (Type '${type}' - Pays '${pays}') ont été vidés avec succès ainsi que les extras", '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

@ -12,7 +12,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
// 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.
Le vidage lui ne conserve ni les territoires ni les liens.',
Le vidage lui ne conserve ni les territoires, ni les extras, ni les liens.',
'explication_zone_pays_territoire' => 'Régions & Pays',
'explication_subdivision_territoire' => 'Subdivisions',
@ -22,8 +22,10 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'info_aucun_enfant' => 'Aucun territoire directement rattaché',
// L
'label_peupler_action' => 'Choisissez une action',
'label_peupler_territoire' => 'Choisissez les territoires sur lesquels appliquer l\'action sélectionnée',
'label_case_extra_code' => 'Charger des codes d\'identification supplémentaires pour les territoires choisis',
'label_case_extra_info' => 'Charger des informations complémentaires sur les territoires choisis',
'label_peupler_action' => 'Choisissez une action',
'label_peupler_territoire' => 'Choisissez les territoires sur lesquels appliquer l\'action sélectionnée',
// M
'menu_peupler' => 'Peupler',
@ -31,14 +33,18 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'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',
'onglet_tous' => 'Tous',
'onglet_zone' => 'Zones',
'onglet_country' => 'Pays',
'onglet_subdivision' => 'Subdivisions',
'option_depeupler_action' => 'Vider',
'option_peupler_action' => 'Peupler',
'option_peupler_force_action' => 'Peupler avec forçage',
'option_zone_territoire' => 'Toutes les régions du monde',
'option_country_territoire' => 'Tous les pays',
'onglet_edite_oui' => 'Edités',
'onglet_edite_non' => 'Non édités',
'onglet_edite_tous' => 'Tous',
'onglet_tous' => 'Tous',
'onglet_zone' => 'Zones',
'onglet_country' => 'Pays',
'onglet_subdivision' => 'Subdivisions',
// S
'msg_depeupler_zone_erreur' => 'Une erreur s\'est produite lors du vidage des régions du monde.',

@ -6,7 +6,7 @@
compatibilite="[3.3.0-dev;3.3.*]"
logo="territoires_logo-xx.svg"
documentation=""
schema="2"
schema="1"
>
<!--
Paquet généré le 2020-07-02 13:44:33
@ -26,8 +26,9 @@
<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" />
<pipeline nom="pre_edition" inclure="territoires_pipelines.php" />
<pipeline nom="affiche_milieu" inclure="territoires_pipelines.php" />
<pipeline nom="optimiser_base_disparus" inclure="territoires_pipelines.php" />
<pipeline nom="exclure_id_conditionnel" inclure="territoires_pipelines.php" />
<menu nom="territoires" titre="territoire:titre_territoires" parent="menu_edition" icone="images/territoire-16.png" action="territoires" />

@ -29,14 +29,7 @@ function territoires_upgrade($nom_meta_base_version, $version_cible) {
$maj['create'] = array(
array(
'maj_tables',
array('spip_territoires', 'spip_territoires_liens')
)
);
$maj['2'] = array(
array(
'maj_tables',
array('spip_territoires_extras')
array('spip_territoires', 'spip_territoires_extras', 'spip_territoires_liens')
)
);

Loading…
Cancel
Save