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.
svp_typologie/formulaires/importer_typologie.php

139 lines
4.6 KiB
PHP

<?php
/**
* Gestion du formulaire d'importation d'une typologie de plugin
* (liste des types ou liste des affectations plugin-type de plugin).
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Chargement des données : le formulaire sert à tout type d'importation. Il est donc nécessaire de construire le
* choix d'exportation entre les types de plugins ou leurs affectations.
*
* @param string $typologie Typologie de plugin concernée. Prend les valeurs `categorie`, `tag`...
*
* @return array Tableau des données à charger par le formulaire (affichage) :
* - `_vues` : (affichage) choix d'exportation entre les types de plugin ou leurs affectations.
*/
function formulaires_importer_typologie_charger(string $typologie) : array {
// Initialisation du tableau des variables fournies au formulaire.
$valeurs = [];
// Choix des natures de données à importer ou exporter.
$valeurs['_vues'] = [
'liste' => _T("svptype:{$typologie}_import_vue_liste_label"),
'affectation' => _T("svptype:{$typologie}_import_vue_affectation_label")
];
return $valeurs;
}
/**
* Vérification des saisies : il est indispensable de choisir un fichier d'import de type JSON.
*
* @param string $typologie Typologie de plugin concernée. Prend les valeurs `categorie`, `tag`...
*
* @return array Tableau des erreurs concernant le fichier ou tableau vide si aucune erreur.
*/
function formulaires_importer_typologie_verifier(string $typologie) : array {
// Initialisation des messages d'erreur
$erreurs = [];
$champ = 'vue_import';
if (empty(_request($champ))) {
// Aucune vue choisie.
$erreurs[$champ] = _T('info_obligatoire');
}
$champ = 'fichier_import';
if (empty($_FILES[$champ]['name'])) {
// Aucun fichier choisi.
$erreurs[$champ] = _T('info_obligatoire');
} elseif (
empty($_FILES[$champ]['type'])
or ($_FILES[$champ]['type'] != 'application/json')
) {
$erreurs[$champ] = _T('svptype:import_message_nok_json');
}
return $erreurs;
}
/**
* Exécution du formulaire : le fichier choisi est décodé et les types de plugin ou les affectations sont chargés
* en base si il ne sont pas déjà présents.
*
* @param string $typologie Typologie de plugin concernée. Prend les valeurs `categorie`, `tag`...
*
* @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_importer_typologie_traiter(string $typologie) : array {
// Initialisation du retour de traitement du formulaire (message, editable).
$retour = [];
$resultat_import = false;
$erreur_json = '';
// Récupération des saisies
$vue = _request('vue_import');
if ($_FILES['fichier_import']['name'] != '') {
// Récupération du fichier, décodage du contenu JSON et importation en base.
// -- Création du répertoire d'upload
$dir = sous_repertoire(_DIR_TMP, 'svptype');
// -- Détermination du nom du fichier temporaire de façon à ce qu'il soit unique.
$hash = md5('import-' . $GLOBALS['visiteur_session']['id_auteur'] . time());
$fichier = $dir . $hash . '-' . $_FILES['fichier_import']['name'];
// -- Déplacement du fichier téléchargé dans la destination choisie.
if (move_uploaded_file($_FILES['fichier_import']['tmp_name'], $fichier)) {
// -- Lecture et suppression du fichier temporaire
include_spip('inc/flock');
lire_fichier($fichier, $contenu);
@unlink($fichier);
// -- Décodage du contenu JSON en tableau PHP.
try {
$liste = json_decode($contenu, true);
} catch (Exception $erreur) {
$erreur_json = $erreur->getMessage();
}
// -- Importation du tableau représentant la typologie.
if ($liste) {
include_spip('inc/svptype_typologie');
$suffixe = $vue == 'liste' ? '' : "_{$vue}";
$importer = "typologie_plugin_importer{$suffixe}";
$resultat_import = $importer($typologie, $liste);
}
}
}
// Retour du formulaire.
if ($resultat_import) {
$retour['message_ok'] = _T('svptype:import_message_ok', ['nb' => $resultat_import]);
// On redirige vers la liste des types ou des plugins suivants le choix afin de voir les ajouts.
include_spip('inc/utils');
$redirect = parametre_url(
parametre_url(
generer_url_ecrire('svptype_typologie'),
'typologie',
$typologie
),
'vue',
$vue
);
} else {
$retour['message_erreur'] = _T('svptype:import_message_nok')
. ($erreur_json ? "({$erreur_json})" : '');
// On reste sur la page d'importation pour visualiser l'erreur.
$redirect = '';
}
$retour['redirect'] = $redirect;
$retour['editable'] = true;
return $retour;
}