Skip to content
Extraits de code Groupes Projets
Valider 38e9f79e rédigé par Eric Lupinacci's avatar Eric Lupinacci
Parcourir les fichiers

Un première version fonctionnelle de l'édition de feed.

On peut éditer :
- le titre et la description
- le mapping
- les crédits et licence de la source
parent 4a5a2560
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -11,9 +11,10 @@ description: ''
is_editable: true
# -- Pour le plugin, la catégorie des feeds est toujours la même, `territory_data`
category: 'territory_data'
# -- Le plugin utilise les tags pour définir le type de territoire, le pays et le code territoire utilisé dans le jeu de données
# -- Le plugin utilise les tags pour définir le type de territoire (type), le pays (pays)
# et le code territoire (_type_id) utilisé dans le jeu de données
tags:
type_id: ''
_type_id: ''
type: ''
pays: ''
......@@ -29,8 +30,8 @@ target:
# Configuration du mapping et du processus de mashup
mapping:
# Données de base : ces données sont issues du jeu de données
# - `code_feed` contient le code utilisé par jeu si celui-ci n'est pas le code primaire du territoire. Sinon ce champ
# est absent et on remplir directement le champ `iso_territoire`
# - `code_feed` contient le code utilisé par le jeu si celui-ci n'est pas le code primaire du territoire. Sinon ce champ
# est absent et on remplit directement le champ `iso_territoire`
basic_fields:
iso_territoire: 'iso_feed'
code_feed: ''
......@@ -81,3 +82,6 @@ sources_basic:
provider:
name: ''
url: ''
# Description facultative du fichier à l'origine de la source. Vide si la source est une api ou page web
build_from:
file: ''
......@@ -139,6 +139,31 @@ function territoires_stats_feed_completer_vidage(array $feed) : void {
}
}
/**
* Renvoie la page de redirection suite à une action d'administration sur un feed.
* Les actions d'administration sont actuellement limitée à exécuter, vider, éditer ou supprimer mais pour l'instant
* seule l'action d'édition de feed nécessite une redirection vers le formulaire idoine.
*
* @param string $action Action d'aministration venant d'être exécutée avec succès
* @param array $feed Description complète du feed
*
* @return string URL de redirection
*/
function territoires_stats_feed_rediriger_admin(string $action, array $feed) : string {
// Pas de redirection si l'action n'est pas l'éedition du feed
$url = '';
if ($action === 'editer_feed') {
$url = parametre_url(
generer_url_ecrire('feed_territoires_edit'),
'feed_id',
$feed['feed_id']
);
}
return $url;
}
// -----------------------------------------------------------------------
// ------------------------- SOURCE DATASETS -----------------------------
// -----------------------------------------------------------------------
......@@ -146,7 +171,7 @@ function territoires_stats_feed_completer_vidage(array $feed) : void {
/**
* Complète un item de la source venant d'être extrait.
*
* Le plugin gère les cas où le code identifiant les territoires ne sont pas les codes ISO comme l'attend la
* Le plugin gère les cas où le code identifiant les territoires n'est pas le code ISO comme l'attend la
* table spip_territoires_extras (par exemple, le code INSEE en France).
*
* @param array $item Item d'un dataset source
......@@ -163,7 +188,7 @@ function territoires_stats_item_completer(array $item, array $feed) : array {
// Détermination du tag type_id qui indique quel est le code utilisé pour identifier les territoires et des autres
// information sur les territoires
if (null === $type_id) {
$type_id = $feed['tags']['type_id'] ?? '';
$type_id = $feed['tags']['_type_id'] ?? '';
}
if (null === $type) {
$type = $feed['tags']['type'] ?? '';
......@@ -197,7 +222,6 @@ function territoires_stats_item_completer(array $item, array $feed) : array {
}
// On extrait le code utilisé pour trouver son id primaire : si il n'existe pas on rejette l'item
// -- comme on travaille au niveau de l'item pour éviter de charger des données inutiles, il faut
include_spip('inc/filtres');
$index = $feed['mapping']['basic_fields']['code_feed'];
$code = table_valeur($item, $index, '');
......
title: 'Population des pays'
description: ''
is_editable: false
category: territory_data
tags:
_type_id: iso_territoire
type: country
pays: ''
target:
format: sql_table
id: territoires_extras
options:
stop_on_error: false
mapping:
basic_fields:
iso_territoire: ISO
valeur: Population
static_fields:
extra: population
type_extra: stat
feed_id: /feed_id
type: '#type'
iso_pays: '#pays'
sources_basic:
basic_1:
source: { type: file, format: csv, uri: iso3166countries-geonames-info.csv, last_update: '2022', version: '', license: '' }
decoding: { delimiter: "\t" }
provider: { name: 'Geonames', url: 'https://www.geonames.org/' }
build_from: { file: 'http://download.geonames.org/export/dump/countryInfo.txt' }
ISO ISO3 ISO-Numeric fips Country Population
AD AND 020 AN Andorra 77006
AE ARE 784 AE United Arab Emirates 9630959
AF AFG 004 AF Afghanistan 37172386
AG ATG 028 AC Antigua and Barbuda 96286
AI AIA 660 AV Anguilla 13254
AL ALB 008 AL Albania 2866376
AM ARM 051 AM Armenia 2951776
AO AGO 024 AO Angola 30809762
AQ ATA 010 AY Antarctica 0
AR ARG 032 AR Argentina 44494502
AS ASM 016 AQ American Samoa 55465
AT AUT 040 AU Austria 8847037
AU AUS 036 AS Australia 24992369
AW ABW 533 AA Aruba 105845
AX ALA 248 Aland Islands 26711
AZ AZE 031 AJ Azerbaijan 9942334
BA BIH 070 BK Bosnia and Herzegovina 3323929
BB BRB 052 BB Barbados 286641
BD BGD 050 BG Bangladesh 161356039
BE BEL 056 BE Belgium 11422068
BF BFA 854 UV Burkina Faso 19751535
BG BGR 100 BU Bulgaria 7000039
BH BHR 048 BA Bahrain 1569439
BI BDI 108 BY Burundi 11175378
BJ BEN 204 BN Benin 11485048
BL BLM 652 TB Saint Barthelemy 8450
BM BMU 060 BD Bermuda 63968
BN BRN 096 BX Brunei 428962
BO BOL 068 BL Bolivia 11353142
BQ BES 535 Bonaire, Saint Eustatius and Saba 18012
BR BRA 076 BR Brazil 209469333
BS BHS 044 BF Bahamas 385640
BT BTN 064 BT Bhutan 754394
BV BVT 074 BV Bouvet Island 0
BW BWA 072 BC Botswana 2254126
BY BLR 112 BO Belarus 9485386
BZ BLZ 084 BH Belize 383071
CA CAN 124 CA Canada 37058856
CC CCK 166 CK Cocos Islands 628
CD COD 180 CG Democratic Republic of the Congo 84068091
CF CAF 140 CT Central African Republic 4666377
CG COG 178 CF Republic of the Congo 5244363
CH CHE 756 SZ Switzerland 8516543
CI CIV 384 IV Ivory Coast 25069229
CK COK 184 CW Cook Islands 21388
CL CHL 152 CI Chile 18729160
CM CMR 120 CM Cameroon 25216237
CN CHN 156 CH China 1392730000
CO COL 170 CO Colombia 49648685
CR CRI 188 CS Costa Rica 4999441
CU CUB 192 CU Cuba 11338138
CV CPV 132 CV Cabo Verde 543767
CW CUW 531 UC Curacao 159849
CX CXR 162 KT Christmas Island 1500
CY CYP 196 CY Cyprus 1189265
CZ CZE 203 EZ Czechia 10625695
DE DEU 276 GM Germany 82927922
DJ DJI 262 DJ Djibouti 958920
DK DNK 208 DA Denmark 5797446
DM DMA 212 DO Dominica 71625
DO DOM 214 DR Dominican Republic 10627165
DZ DZA 012 AG Algeria 42228429
EC ECU 218 EC Ecuador 17084357
EE EST 233 EN Estonia 1320884
EG EGY 818 EG Egypt 98423595
EH ESH 732 WI Western Sahara 273008
ER ERI 232 ER Eritrea 0
ES ESP 724 SP Spain 46723749
ET ETH 231 ET Ethiopia 109224559
FI FIN 246 FI Finland 5518050
FJ FJI 242 FJ Fiji 883483
FK FLK 238 FK Falkland Islands 2638
FM FSM 583 FM Micronesia 112640
FO FRO 234 FO Faroe Islands 48497
FR FRA 250 FR France 66987244
GA GAB 266 GB Gabon 2119275
GB GBR 826 UK United Kingdom 66488991
GD GRD 308 GJ Grenada 111454
GE GEO 268 GG Georgia 3731000
GF GUF 254 FG French Guiana 195506
GG GGY 831 GK Guernsey 65228
GH GHA 288 GH Ghana 29767108
GI GIB 292 GI Gibraltar 33718
GL GRL 304 GL Greenland 56025
GM GMB 270 GA Gambia 2280102
GN GIN 324 GV Guinea 12414318
GP GLP 312 GP Guadeloupe 443000
GQ GNQ 226 EK Equatorial Guinea 1308974
GR GRC 300 GR Greece 10727668
GS SGS 239 SX South Georgia and the South Sandwich Islands 30
GT GTM 320 GT Guatemala 17247807
GU GUM 316 GQ Guam 165768
GW GNB 624 PU Guinea-Bissau 1874309
GY GUY 328 GY Guyana 779004
HK HKG 344 HK Hong Kong 7451000
HM HMD 334 HM Heard Island and McDonald Islands 0
HN HND 340 HO Honduras 9587522
HR HRV 191 HR Croatia 4089400
HT HTI 332 HA Haiti 11123176
HU HUN 348 HU Hungary 9768785
ID IDN 360 ID Indonesia 267663435
IE IRL 372 EI Ireland 4853506
IL ISR 376 IS Israel 8883800
IM IMN 833 IM Isle of Man 84077
IN IND 356 IN India 1352617328
IO IOT 086 IO British Indian Ocean Territory 4000
IQ IRQ 368 IZ Iraq 38433600
IR IRN 364 IR Iran 81800269
IS ISL 352 IC Iceland 353574
IT ITA 380 IT Italy 60431283
JE JEY 832 JE Jersey 90812
JM JAM 388 JM Jamaica 2934855
JO JOR 400 JO Jordan 9956011
JP JPN 392 JA Japan 126529100
KE KEN 404 KE Kenya 51393010
KG KGZ 417 KG Kyrgyzstan 6315800
KH KHM 116 CB Cambodia 16249798
KI KIR 296 KR Kiribati 115847
KM COM 174 CN Comoros 832322
KN KNA 659 SC Saint Kitts and Nevis 52441
KP PRK 408 KN North Korea 25549819
KR KOR 410 KS South Korea 51635256
XK XKX 0 KV Kosovo 1845300
KW KWT 414 KU Kuwait 4137309
KY CYM 136 CJ Cayman Islands 64174
KZ KAZ 398 KZ Kazakhstan 18276499
LA LAO 418 LA Laos 7061507
LB LBN 422 LE Lebanon 6848925
LC LCA 662 ST Saint Lucia 181889
LI LIE 438 LS Liechtenstein 37910
LK LKA 144 CE Sri Lanka 21670000
LR LBR 430 LI Liberia 4818977
LS LSO 426 LT Lesotho 2108132
LT LTU 440 LH Lithuania 2789533
LU LUX 442 LU Luxembourg 607728
LV LVA 428 LG Latvia 1926542
LY LBY 434 LY Libya 6678567
MA MAR 504 MO Morocco 36029138
MC MCO 492 MN Monaco 38682
MD MDA 498 MD Moldova 3545883
ME MNE 499 MJ Montenegro 622345
MF MAF 663 RN Saint Martin 37264
MG MDG 450 MA Madagascar 26262368
MH MHL 584 RM Marshall Islands 58413
MK MKD 807 MK North Macedonia 2082958
ML MLI 466 ML Mali 19077690
MM MMR 104 BM Myanmar 53708395
MN MNG 496 MG Mongolia 3170208
MO MAC 446 MC Macao 631636
MP MNP 580 CQ Northern Mariana Islands 56882
MQ MTQ 474 MB Martinique 432900
MR MRT 478 MR Mauritania 4403319
MS MSR 500 MH Montserrat 9341
MT MLT 470 MT Malta 483530
MU MUS 480 MP Mauritius 1265303
MV MDV 462 MV Maldives 515696
MW MWI 454 MI Malawi 17563749
MX MEX 484 MX Mexico 126190788
MY MYS 458 MY Malaysia 31528585
MZ MOZ 508 MZ Mozambique 29495962
NA NAM 516 WA Namibia 2448255
NC NCL 540 NC New Caledonia 284060
NE NER 562 NG Niger 22442948
NF NFK 574 NF Norfolk Island 1828
NG NGA 566 NI Nigeria 195874740
NI NIC 558 NU Nicaragua 6465513
NL NLD 528 NL Netherlands 17231017
NO NOR 578 NO Norway 5314336
NP NPL 524 NP Nepal 28087871
NR NRU 520 NR Nauru 12704
NU NIU 570 NE Niue 2166
NZ NZL 554 NZ New Zealand 4885500
OM OMN 512 MU Oman 4829483
PA PAN 591 PM Panama 4176873
PE PER 604 PE Peru 31989256
PF PYF 258 FP French Polynesia 277679
PG PNG 598 PP Papua New Guinea 8606316
PH PHL 608 RP Philippines 106651922
PK PAK 586 PK Pakistan 212215030
PL POL 616 PL Poland 37978548
PM SPM 666 SB Saint Pierre and Miquelon 7012
PN PCN 612 PC Pitcairn 46
PR PRI 630 RQ Puerto Rico 3195153
PS PSE 275 WE Palestinian Territory 4569087
PT PRT 620 PO Portugal 10281762
PW PLW 585 PS Palau 17907
PY PRY 600 PA Paraguay 6956071
QA QAT 634 QA Qatar 2781677
RE REU 638 RE Reunion 776948
RO ROU 642 RO Romania 19473936
RS SRB 688 RI Serbia 6982084
RU RUS 643 RS Russia 144478050
RW RWA 646 RW Rwanda 12301939
SA SAU 682 SA Saudi Arabia 33699947
SB SLB 090 BP Solomon Islands 652858
SC SYC 690 SE Seychelles 96762
SD SDN 729 SU Sudan 41801533
SS SSD 728 OD South Sudan 8260490
SE SWE 752 SW Sweden 10183175
SG SGP 702 SN Singapore 5638676
SH SHN 654 SH Saint Helena 7460
SI SVN 705 SI Slovenia 2067372
SJ SJM 744 SV Svalbard and Jan Mayen 2550
SK SVK 703 LO Slovakia 5447011
SL SLE 694 SL Sierra Leone 7650154
SM SMR 674 SM San Marino 33785
SN SEN 686 SG Senegal 15854360
SO SOM 706 SO Somalia 15008154
SR SUR 740 NS Suriname 575991
ST STP 678 TP Sao Tome and Principe 197700
SV SLV 222 ES El Salvador 6420744
SX SXM 534 NN Sint Maarten 40654
SY SYR 760 SY Syria 16906283
SZ SWZ 748 WZ Eswatini 1136191
TC TCA 796 TK Turks and Caicos Islands 37665
TD TCD 148 CD Chad 15477751
TF ATF 260 FS French Southern Territories 140
TG TGO 768 TO Togo 7889094
TH THA 764 TH Thailand 69428524
TJ TJK 762 TI Tajikistan 9100837
TK TKL 772 TL Tokelau 1466
TL TLS 626 TT Timor Leste 1267972
TM TKM 795 TX Turkmenistan 5850908
TN TUN 788 TS Tunisia 11565204
TO TON 776 TN Tonga 103197
TR TUR 792 TU Turkey 82319724
TT TTO 780 TD Trinidad and Tobago 1389858
TV TUV 798 TV Tuvalu 11508
TW TWN 158 TW Taiwan 22894384
TZ TZA 834 TZ Tanzania 56318348
UA UKR 804 UP Ukraine 44622516
UG UGA 800 UG Uganda 42723139
UM UMI 581 United States Minor Outlying Islands 0
US USA 840 US United States 327167434
UY URY 858 UY Uruguay 3449299
UZ UZB 860 UZ Uzbekistan 32955400
VA VAT 336 VT Vatican 921
VC VCT 670 VC Saint Vincent and the Grenadines 110211
VE VEN 862 VE Venezuela 28870195
VG VGB 092 VI British Virgin Islands 29802
VI VIR 850 VQ U.S. Virgin Islands 106977
VN VNM 704 VM Vietnam 95540395
VU VUT 548 NH Vanuatu 292680
WF WLF 876 WF Wallis and Futuna 16025
WS WSM 882 WS Samoa 196130
YE YEM 887 YM Yemen 28498687
YT MYT 175 MF Mayotte 159042
ZA ZAF 710 SF South Africa 57779622
ZM ZMB 894 ZA Zambia 17351822
ZW ZWE 716 ZI Zimbabwe 14439018
CS SCG 891 YI Serbia and Montenegro 10829175
AN ANT 530 NT Netherlands Antilles 300000
......@@ -214,7 +214,10 @@ function formulaires_creer_feed_territoires_verifier_1() : array {
// -- Identifiant proposé pour le feed
include_spip('inc/ezmashup_feed');
$id_feed = "{$type}_" . ($pays ? "{$pays}_" : '') . $extra;
if (feed_ressource_existe('territoires_stats', $id_feed, ['type' => 'config'])) {
$ressource = [
'type' => 'config'
];
if (feed_ressource_existe('territoires_stats', $id_feed, $ressource)) {
// On rajoute un suffixe que l'utilisateur devra modifier
$id_feed .= '_xxx';
}
......@@ -257,7 +260,7 @@ function formulaires_creer_feed_territoires_verifier_2() : array {
// -- sinon : on attend un index comme pour le mapping ou vide
if ($decodage) {
if ($format_source === 'csv') {
if (!in_array($decodage, [',', ';', '|', "\t"])) {
if (!in_array($decodage, [',', ';', "\t"])) {
$erreurs['decodage'] = _T('territoires_stats:erreur_feed_decodage');
}
} elseif (!preg_match('#^[\w/]+$#i', $decodage)) {
......@@ -316,14 +319,13 @@ function formulaires_creer_feed_territoires_traiter() : array {
// -- catégorisation : seuls les tags sont à mettre à jour (category imposée, édition autorisée)
$description_yaml['tags']['type'] = $type;
$description_yaml['tags']['pays'] = $pays;
$description_yaml['tags']['type_id'] = $type_code;
$description_yaml['tags']['_type_id'] = $type_code;
// -- mapping : basic, static et unused fields
if ($type_code === 'iso_territoire') {
// Le code primaire est utilisé dans jeu de données, il n'est pas utile de passer par un code alternatif
// - le champ `code_feed` est donc inutile
$description_yaml['mapping']['basic_fields']['iso_territoire'] = $mapping_code;
unset($description_yaml['mapping']['basic_fields']['code_feed'], $description_yaml['mapping']['unused_fields']);
} else {
// Le jeu de données utilise un code alternatif au code primaire
// - le champ `code_feed` est donc nécessaire temporairement
......@@ -360,8 +362,10 @@ function formulaires_creer_feed_territoires_traiter() : array {
// Stockage de la source dans son emplacement final
$ressource = [
'type' => "source_{$format_source}",
'id' => $id_source
'type' => 'source',
'format' => $format_source,
'decodage' => $decodage,
'id' => $id_source
];
if ($fichier_source = feed_ressource_ecrire('territoires_stats', $id_feed, $ressource, $contenu_source)) {
// -- extraire l'uri pour la description YAML
......
......@@ -6,17 +6,82 @@
<form method="post" action="#ENV{action}"><div>
#ACTION_FORMULAIRE
<input type="hidden" name="feed_id" value="#ENV{feed_id}" />
<div class="editer-groupe">
[(#SAISIE{input, titre,
label=<:carte_territoires:champ_titre_label:>
})]
[(#SAISIE{textarea, descriptif,
label=<:carte_territoires:champ_descriptif_label:>,
rows=5,
class=inserer_barre_edition
})]
</div>
<fieldset>
<legend><:territoires_stats:legende_feed_identite:></legend>
<div class="editer-groupe">
[(#SAISIE{input, title,
explication=<:territoires_stats:explication_feed_titre:>,
label=<:territoires_stats:label_feed_titre:>,
obligatoire=oui,
})]
[(#SAISIE{textarea, description,
label=<:territoires_stats:label_feed_description:>,
rows=5,
class=inserer_barre_edition
})]
</div>
</fieldset>
<fieldset>
<legend><:territoires_stats:legende_feed_mapping:></legend>
<div class="editer-groupe">
[(#SAISIE{selection, type_code,
label=<:territoires_stats:label_feed_type_code:>,
data=#ENV{_types_code},
cacher_option_intro=oui
})]
[(#SAISIE{input, decodage,
explication=#ENV{_explication_decodage},
label=#ENV{_label_decodage},
})]
[(#SAISIE{input, mapping_code,
explication=#ENV{_explication_mapping_code},
label=<:territoires_stats:label_feed_mapping_code:>,
obligatoire=oui,
})]
[(#SAISIE{input, mapping_valeur,
explication=#ENV{_explication_mapping_valeur},
label=<:territoires_stats:label_feed_mapping_valeur:>,
obligatoire=oui,
})]
</div>
</fieldset>
<fieldset>
<legend><:territoires_stats:legende_feed_credit_licence:></legend>
<div class="editer-groupe">
[(#SAISIE{input, version,
label=<:territoires_stats:label_feed_source_version:>,
})]
[(#SAISIE{input, license,
label=<:territoires_stats:label_feed_source_licence:>,
})]
[(#SAISIE{date, last_update,
label=<:territoires_stats:label_feed_source_date:>,
})]
[(#SAISIE{input, provider_name,
label=<:territoires_stats:label_feed_source_provider_name:>,
})]
[(#SAISIE{input, provider_url,
label=<:territoires_stats:label_feed_source_provider_url:>,
})]
[(#ENV{_source_est_fichier}|oui)
[(#SAISIE{input, build_from,
label=<:territoires_stats:label_feed_source_build_from:>,
})]
]
</div>
</fieldset>
[(#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>
......
<?php
/**
* Gestion du formulaire de d'édition d'un feed de territoires.
* Gestion du formulaire d'édition d'un feed de territoires.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/actions');
include_spip('inc/editer');
/**
* Chargement du formulaire d'édition d'un feed de territoires.
*
......@@ -18,7 +15,74 @@ include_spip('inc/editer');
* @return array Environnement du formulaire
*/
function formulaires_editer_feed_territoires_charger_dist(string $id_feed, string $redirect) {
$valeurs = [];
// Récupération des informations sur le feed
include_spip('inc/ezmashup_feed');
$feed = feed_lire('territoires_stats', $id_feed);
// Identification du feed
$valeurs = [
'title' => $feed['title'],
'description' => $feed['description'],
];
// Types de code possibles pour les territoires concernés
$type_code = $feed['tags']['_type_id'];
$types_code['iso_territoire'] = _T('territoire:champ_iso_territoire_label') . ' (iso_territoire)';
$where = [
'type_extra=' . sql_quote('code'),
'type=' . sql_quote($feed['tags']['type']),
];
if ($feed['tags']['pays']) {
$where[] = 'iso_pays=' . sql_quote($feed['tags']['pays']);
}
$ids_code = sql_allfetsel('extra', 'spip_territoires_extras', $where, 'extra');
if ($ids_code) {
foreach (array_column($ids_code, 'extra') as $_code) {
$types_code[$_code] = _T('territoire_extra:extra_' . $_code) . " ({$_code})";
}
}
$valeurs['type_code'] = $type_code;
$valeurs['_types_code'] = $types_code;
// Format et décodage de la source
$source = $feed['sources_basic']['basic_1'];
if ($type_code === 'iso_territoire') {
$valeurs['mapping_code'] = $feed['mapping']['basic_fields']['iso_territoire'];
} else {
$valeurs['mapping_code'] = $feed['mapping']['basic_fields']['code_feed'];
}
$valeurs['mapping_valeur'] = $feed['mapping']['basic_fields']['valeur'];
$format = $source['source']['format'];
if ($format === 'csv') {
$valeurs['decodage'] = $source['decoding']['delimiter'];
$valeurs['_label_decodage'] = _T('territoires_stats:label_feed_decodage_delimiteur');
$valeurs['_explication_decodage'] = _T('territoires_stats:explication_feed_decodage_delimiteur');
$valeurs['_explication_mapping_code'] = _T('territoires_stats:explication_feed_mapping_code_csv');
$valeurs['_explication_mapping_valeur'] = _T('territoires_stats:explication_feed_mapping_valeur_csv');
} else {
$valeurs['decodage'] = $source['decoding']['root_node'];
$valeurs['_label_decodage'] = _T('territoires_stats:label_feed_decodage_racine');
$valeurs['_explication_decodage'] = _T('territoires_stats:explication_feed_decodage_racine');
$valeurs['_explication_mapping_code'] = _T('territoires_stats:explication_feed_mapping_code');
$valeurs['_explication_mapping_valeur'] = _T('territoires_stats:explication_feed_mapping_valeur');
}
// Version et licence de la source
$valeurs['last_update'] = $source['source']['last_update'];
$valeurs['version'] = $source['source']['version'];
$valeurs['license'] = $source['source']['license'];
// Crédits
$valeurs['provider_name'] = $source['provider']['name'];
$valeurs['provider_url'] = $source['provider']['url'];
$valeurs['_source_est_fichier'] = false;
$valeurs['build_from'] = [];
if ($source['source']['type'] === 'file') {
$valeurs['build_from'] = $source['build_from']['file'];
$valeurs['_source_est_fichier'] = true;
}
return $valeurs;
}
......@@ -34,6 +98,64 @@ function formulaires_editer_feed_territoires_charger_dist(string $id_feed, strin
function formulaires_editer_feed_territoires_verifier_dist(string $id_feed, string $redirect) {
$erreurs = [];
// Récupération des informations sur le feed
include_spip('inc/ezmashup_feed');
$feed = feed_lire('territoires_stats', $id_feed);
$source = $feed['sources_basic']['basic_1'];
$format_source = $source['source']['format'];
// On collecte les paramètres
$decodage = _request('decodage');
$mapping_code = _request('mapping_code');
$mapping_valeur = _request('mapping_valeur');
// Vérification de la saisie des mappings qui ne doivent contenir qu'un ou plusieurs mots séparés par des '/'
if ($format_source !== 'csv') {
if (!preg_match('#^[\w/]+$#i', $mapping_code)) {
$erreurs['mapping_code'] = _T('territoires_stats:erreur_feed_mapping_code');
}
if (!preg_match('#^[\w/]+$#i', $mapping_valeur)) {
$erreurs['mapping_valeur'] = _T('territoires_stats:erreur_feed_mapping_valeur');
}
}
// Vérification du décodage en fonction du type de source
// -- si fichier csv : on attend un délimiteur parmi ',', ';', '|' et '\t' ou vide (la valeur par défaut est la virgule)
// -- sinon : on attend un index comme pour le mapping ou vide
if ($decodage) {
if ($format_source === 'csv') {
if (!in_array($decodage, [',', ';', "\t"])) {
$erreurs['decodage'] = _T('territoires_stats:erreur_feed_decodage');
}
} elseif (!preg_match('#^[\w/]+$#i', $decodage)) {
$erreurs['decodage'] = _T('territoires_stats:erreur_feed_mapping_code');
}
}
// Vérifier l'URL du provider si saisie
$url_provider = _request('provider_url');
if (
$url_provider
and include_spip('inc/distant')
and (valider_url_distante($url_provider) === false)
) {
// URL distante non valide.
// TODO : voir aussi filter_var(url, FILTER_VALIDATE_URL)
$erreurs['provider_url'] = _T('territoires_stats:erreur_feed_url_provider');
}
// Vérifier l'URL du build si saisie
if ($source['source']['type'] === 'file') {
$url_build = _request('build_from');
if (
$url_build and include_spip('inc/distant') and (valider_url_distante($url_build) === false)
) {
// URL distante non valide.
// TODO : voir aussi filter_var(url, FILTER_VALIDATE_URL)
$erreurs['provider_url'] = _T('territoires_stats:erreur_feed_url_build');
}
}
return $erreurs;
}
......@@ -46,7 +168,89 @@ function formulaires_editer_feed_territoires_verifier_dist(string $id_feed, stri
* @return array Retours des traitements
*/
function formulaires_editer_feed_territoires_traiter_dist(string $id_feed, string $redirect) {
// Initialisation du retour de la fonction
$retour = [];
// Récupération des variables constitutives du YAML
include_spip('inc/charsets');
$titre_feed = _request('title');
$desc_feed = _request('description');
$type_code = _request('type_code');
$decodage = trim(_request('decodage')) ?? '';
$mapping_code = translitteration(_request('mapping_code'));
$mapping_valeur = translitteration(_request('mapping_valeur'));
$version = _request('version') ?? '';
$licence = _request('license') ?? '';
$date_maj = _request('last_update') ?? '';
$provider = _request('provider_name') ?? '';
$url_provider = _request('provider_url') ?? '';
$url_build = _request('build_from') ?? '';
// Initialisation du YAML à partir du template
include_spip('inc/ezmashup_feed');
$ressource = [
'type' => 'config',
];
$description_yaml = feed_ressource_lire('territoires_stats', $id_feed, $ressource);
if ($description_yaml !== false) {
// Personnalisation du YAML en fonction du contexte des saisies.
// On considère que toutes les vérifications ont été faites et que donc les variables saisies sont cohérentes
// -- identification
$description_yaml['title'] = $titre_feed;
$description_yaml['description'] = $desc_feed;
// -- mapping : basic, static et unused fields
if ($type_code !== $description_yaml['tags']['_type_id']) {
// -- catégorisation : seuls le tag du type de code est modifiable
$description_yaml['tags']['_type_id'] = $type_code;
if ($type_code === 'iso_territoire') {
// Le code primaire est utilisé dans jeu de données, il n'est pas utile de passer par un code alternatif
// - le champ `code_feed` est donc inutile
$description_yaml['mapping']['basic_fields']['iso_territoire'] = $mapping_code;
unset($description_yaml['mapping']['basic_fields']['code_feed'], $description_yaml['mapping']['unused_fields']);
} else {
// Le jeu de données utilise un code alternatif au code primaire
// - le champ `code_feed` est donc nécessaire pour l'extraction mais ne sera pas conservé in fine
$description_yaml['mapping']['basic_fields']['code_feed'] = $mapping_code;
$description_yaml['mapping']['basic_fields']['iso_territoire'] = 'iso_feed';
$description_yaml['mapping']['unused_fields'] = ['code_feed'];
}
}
$description_yaml['mapping']['basic_fields']['valeur'] = $mapping_valeur;
// -- la source : pour l'instant les crédits ne sont pas supportés, elle porte toujours l'id `source_1`
// L'uri sera remplie plus avant pour traiter le cas du fichier télécharger à copier dans l'emplacement final
$id_source = 'basic_1';
if ($description_yaml['sources_basic'][$id_source]['source']['format'] === 'csv') {
$description_yaml['sources_basic'][$id_source]['decoding']['delimiter'] = $decodage;
} else {
$description_yaml['sources_basic'][$id_source]['decoding']['root_node'] = $decodage;
}
// -- Les crédits & licence
$description_yaml['sources_basic'][$id_source]['source']['version'] = $version;
$description_yaml['sources_basic'][$id_source]['source']['license'] = $licence;
$description_yaml['sources_basic'][$id_source]['source']['last_update'] = $date_maj;
$description_yaml['sources_basic'][$id_source]['provider']['name'] = $provider;
$description_yaml['sources_basic'][$id_source]['provider']['url'] = $url_provider;
$description_yaml['sources_basic'][$id_source]['build_from']['file'] = $url_build;
// Ecriture du YAML
$ressource = [
'type' => 'config',
];
if (feed_ressource_ecrire('territoires_stats', $id_feed, $ressource, $description_yaml)) {
// Insertion du YAML en base de données
feed_charger('territoires_stats');
} else {
$retour['message_erreur'] = _T('territoires_stats:erreur_ecriture_config');
}
} else {
$retour['message_erreur'] = _T('territoires_stats:erreur_lecture_config');
}
// Redirection vers la page des jeux de données si tout s'est bien passé
if (empty($retour['message_erreur'])) {
$retour['redirect'] = generer_url_ecrire('peupler_statistiques');
}
return $retour;
}
......@@ -47,10 +47,17 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'label_feed_extra_titre' => 'Titre du type de donnée',
'label_feed_mapping_code' => 'Index du code du territoire',
'label_feed_mapping_valeur' => 'Index de la valeur',
'label_feed_source_version' => 'Version du jeu de données',
'label_feed_source_licence' => 'Licence',
'label_feed_source_build_from' => 'Fichier d\'origine de la source',
'label_feed_source_provider_name' => 'Fournisseur',
'label_feed_source_provider_url' => 'URL du fournisseur',
'label_feed_source_date' => 'Date de la dernière mise à jour',
'legende_feed_identite' => 'Identification du jeu de données',
'legende_feed_unite_peuplement' => 'Territoires concernés',
'legende_feed_source' => 'Origine & signification des données',
'legende_feed_mapping' => 'Interprétation des données',
'legende_feed_credit_licence' => 'Licence & Crédits',
// M
'menu_peupler' => 'Ajouter des jeux de données',
......
......@@ -8,7 +8,7 @@
]
<:territoires_stats:icone_modifier_feed:>
<BOUCLE_info_feed(FEEDS) {feed_id}>
[<h1>(#TITLE)</h1>]
[<h1>(#FEED_ID)</h1>]
</BOUCLE_info_feed>
</div>
......
[(#AUTORISER{voir, _feeds}|sinon_interdire_acces)]
#SET{categorie, territory_data}
#SET{redirect, #URL_ECRIRE{feed_territoires_edit}|parametre_url{feed_id, #ENV{feed_id}}}
<h1 class="grostitre">
<:territoires_stats:titre_page_peupler:>
......@@ -13,7 +12,7 @@
[(#REM) <!-- Affichage du formulaire d'admin des feeds filtré sur la catégorie des statistiques des territoires --> ]
[<div class="ajax noscroll">
(#FORMULAIRE_ADMIN_FEEDS{territoires_stats, #GET{categorie}, #ENV{feed_id}, territoires_stats, #GET{redirect}})
(#FORMULAIRE_ADMIN_FEEDS{territoires_stats, #GET{categorie}, #ENV{feed_id}, territoires_stats})
</div>]
[(#AUTORISER{creer, feed, '', #NULL, #ARRAY{plugin, territoires_stats}})
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter