You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
territoires/formulaires/peupler_territoires.php

284 lines
9.7 KiB
PHTML

<?php
/**
* Gestion du formulaire de chargement ou de vidage des territoires.
*
3 years ago
* @package SPIP\TERRITOIRES\UI
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Chargement des données : le formulaire propose les actions possibles sur les territoires,
* à savoir, charger ou vider.
*
* @uses territoires_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_territoire'] = 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
include_spip('inc/territoires_utils');
$options = array(
'exclure' => 'alternates,subdivisions',
'index' => 'pays'
);
$valeurs['_pays'] = territoires_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;
}
}
// Acquérir la liste des pays dont les infra subdivisions sont disponibles et dont les subdivisions sont déjà
// chargées.
$options = array(
'exclure' => 'alternates,infrasubdivisions',
'index' => 'pays'
);
$infrasubdivisions = territoires_acquerir('infrasubdivision', array(), $options);
// -- indiquer les territoires déjà chargés
foreach ($infrasubdivisions as $_code => $_pays) {
if (territoire_est_peuple('subdivision', $_code)) {
$valeurs['_pays_infra'][$_code] = $_pays;
$un_territoire_charge = true;
if (territoire_est_peuple('infrasubdivision', $_code)) {
$valeurs['_pays_infra'][$_code] .= ' - <em>[' . _T('territoires:info_territoire_peuple') . ']</em>';
}
}
}
// Ne pas sélectionner un type ou un pays par défaut
set_request('types', array());
set_request('pays', array());
set_request('pays_infra', 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_territoire')) {
$erreurs['action_territoire'] = _T('info_obligatoire');
}
if (!_request('pays') and !_request('pays_infra') and !_request('types')) {
$erreurs['types'] = _T('info_obligatoire');
$erreurs['pays'] = ' ';
$erreurs['pays_infra'] = ' ';
}
return $erreurs;
}
/**
* 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()
*
* @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.
include_spip('inc/territoire');
$action = _request('action_territoire');
$types = _request('types');
$pays = _request('pays');
if ($pays) {
$types[] = 'subdivision';
}
$pays_infra = _request('pays_infra');
if ($pays_infra) {
$types[] = 'infrasubdivision';
}
// Détermination des options de l'action
$options = array();
$forcer = _request('forcer');
if (
$forcer
or ($action === 'depeupler')
) {
$options['force'] = true;
}
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)
$actionner = "territoire_${action}";
$statut = array();
foreach ($types as $_type) {
// Traitement du type en prenant en compte le cas particulier des subdivisions et infra subdivisions.
if ($_type === 'subdivision') {
foreach ($pays as $_pays) {
$statut[] = $actionner($_type, $_pays, $options);
}
} elseif ($_type === 'infrasubdivision') {
foreach ($pays_infra as $_pays) {
if ($action === 'peupler') {
$actionner .= '_asynchrone';
}
$statut[] = $actionner($_type, $_pays, $options);
}
} else {
$statut[] = $actionner($_type, '', $options);
}
// Formater le message correspondant au traitement du type
$retour = formulaires_peupler_territoires_notifier($_type, $retour, $action, $statut);
}
// 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 ou la lancement du job 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.
* - `sync` : indique si le peuplement est synchrone ou asynchrone
* - `job` : id du job si asynchrone
*
* @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 formulaires_peupler_territoires_notifier($type, $messages, $action, $statuts) {
$variables = array(
'ok' => array(),
'nok' => array(),
'sha' => array(),
);
$statut_global = array(
'ok' => false,
'nok' => false,
'sha' => false,
'sync' => true,
);
// 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_est_subdivision($type)) {
$variables['sha'][] = $_statut['pays'];
}
$statut_global['sha'] = true;
} elseif (!$_statut['ok']) {
if (type_est_subdivision($type)) {
$variables['nok'][] = $_statut['pays'];
}
$statut_global['nok'] = true;
} else {
if (type_est_subdivision($type)) {
$variables['ok'][] = $_statut['pays'];
}
$statut_global['ok'] = true;
if (!$_statut['sync']) {
$statut_global['sync'] = false;
}
}
}
// Traitement des succès
if ($statut_global['ok']) {
$messages['message_ok'] .= _T("territoires:msg_${action}_${type}_succes", array('pays' => implode(', ', $variables['ok'])));
if (!$statut_global['sync']) {
$messages['message_ok'] .= '<br />' . _T("territoires:msg_succes_asynchrone");
}
}
// 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;
}