Sauvegarde des modules

This commit is contained in:
fredtempez 2022-01-31 14:24:45 +01:00
parent 0e8c03e79b
commit ae09556e8d
3 changed files with 110 additions and 28 deletions

View File

@ -1209,7 +1209,7 @@ class common {
* @param string folder path à zipper
* @param array filter dossiers à exclure
*/
public function makeZip ($fileName, $folder, $filter ) {
public function makeZip ($fileName, $folder, $filter = [] ) {
$zip = new ZipArchive();
$zip->open($fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
//$directory = 'site/';

View File

@ -21,6 +21,7 @@ class plugin extends common {
public static $actions = [
'index' => self::GROUP_ADMIN,
'delete' => self::GROUP_ADMIN,
'save' => self::GROUP_ADMIN, // Sauvegarde le module dans un fichier ZIP ou dans le gestionnaire
'dataExport' => self::GROUP_ADMIN, // Fonction muette d'exportation
'dataImport' => self::GROUP_ADMIN, // les données d'un module
'store' => self::GROUP_ADMIN,
@ -34,8 +35,9 @@ class plugin extends common {
const MODULE_STORE = '?modules/';
// Gestion des modules
public static $modInstal = [];
public static $modOrphans = [];
public static $modulesData = [];
public static $modulesOrphan = [];
public static $modulesInstalled = [];
// pour tests
public static $valeur = [];
@ -236,7 +238,7 @@ class plugin extends common {
}
/***
* Installation d'un module par le catalogue
* Installation d'un module depuis le catalogue
*/
public function uploadItem() {
// Jeton incorrect
@ -366,8 +368,6 @@ class plugin extends common {
*/
public function index() {
// Tableau des langues rédigées
foreach (self::$i18nList as $key => $value) {
if ($this->getData(['config','i18n', $key]) === 'site' ||
@ -375,13 +375,11 @@ class plugin extends common {
$i18nSites[$key] = $value;
}
}
// Lister les modules installés
$infoModules = helper::getModules();
// Parcourir les langues du site traduit et recherche les modules affectés à des pages
foreach ($i18nSites as $keyi18n=>$vauei18n) {
foreach ($i18nSites as $keyi18n=>$valuei18n) {
// Clés moduleIds dans les pages de la langue
$pages = json_decode(file_get_contents(self::DATA_DIR . $keyi18n . '/' . 'page.json'), true);
@ -401,12 +399,11 @@ class plugin extends common {
// Recherche des modules orphelins dans toutes les langues
$orphans = array_flip(array_keys ($infoModules));
$orphans = $installed = array_flip(array_keys ($infoModules));
foreach ($i18nSites as $keyi18n=>$valuei18n) {
// Générer la liste des modules orphelins
foreach ($infoModules as $key=>$value) {
//echo $key . '<p>';
//echo array_search($key, $pagesModules[$keyi18n]);
// Supprimer les éléments affectés
if (array_search($key, $pagesModules[$keyi18n]) ) {
unset($orphans [$key]);
}
@ -419,14 +416,11 @@ class plugin extends common {
if (isset($orphans)) {
foreach ($orphans as $key) {
// Construire le tableau de sortie
self::$modOrphans [] = [
self::$modulesOrphan [] = [
$infoModules [$key] ['realName'],
$key,
$infoModules [$key] ['version'],
'',
'',
'',
'',
$infoModules[$key] ['delete'] === true
? template::button('moduleDelete' . $key, [
'class' => 'moduleDelete buttonRed',
@ -440,17 +434,43 @@ class plugin extends common {
}
}
// Modules installés non orphelins
// Mise en forme du tableau des modules utilisés
if (isset($installed)) {
foreach (array_flip($installed) as $key) {
// Construire le tableau de sortie
self::$modulesInstalled [] = [
$infoModules [$key] ['realName'],
$key,
$infoModules [$key] ['version'],
'',
template::button('moduleSave' . $key, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/filemanager/' .$key . '/' . $_SESSION['csrf'],
'value' => template::ico('download-cloud'),
'help' => 'Sauvegarder le module dans le gestionnaire de fichiers'
]),
template::button('moduleDownload' . $key, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/download/' .$key . '/' . $_SESSION['csrf'],
'value' => template::ico('download'),
'help' => 'Sauvegarder et télécharger le module'
])
];
}
}
// Mise en forme du tableau des modules employés dans les pages
// Avec les commandes de sauvegarde et de restauration
foreach ($pagesInfos as $keyi18n=>$valueI18n) {
foreach ($valueI18n as $keyPage=>$value) {
// Construire le tableau de sortie
self::$modInstal[] = [
self::$modulesData[] = [
$infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']] ['realName'],
$pagesInfos[$keyi18n][$keyPage]['moduleId'],
$infoModules[$pagesInfos [$keyi18n][$keyPage]['moduleId']] ['version'],
template::flag($keyi18n, '20px'),
$pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')',
'<a href ="' . helper::baseUrl() . $keyPage . '" target="_blank">' . $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')</a>',
template::button('moduleExport' . $keyPage, [
'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
'value' => template::ico('download'),
@ -473,6 +493,64 @@ class plugin extends common {
}
/**
* Sauvergarde un module sans les données
*/
public function save() {
// Jeton incorrect
if ($this->getUrl(4) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'state' => false,
'notification' => 'Action non autorisée'
]);
} else {
// Créer un dossier temporaire
$tmpFolder = self::TEMP_DIR . uniqid();
if (!is_dir($tmpFolder)) {
mkdir($tmpFolder, 0755);
}
//Nom de l'archive
$fileName = $this->getUrl(3) . '.zip';
$this->makeZip ($tmpFolder . '/' . $fileName, 'module/' . $this->getUrl(3));
switch ($this->getUrl(2)) {
case 'filemanager':
if (!file_exists(self::FILE_DIR . 'source/modules')) {
mkdir(self::FILE_DIR . 'source/modules');
}
$success = copy($tmpFolder . '/' . $fileName , self::FILE_DIR . 'source/modules/' . $this->getUrl(3) . '.zip' );
// Nettoyage
unlink($tmpFolder . '/' . $fileName);
$this->removeDir($tmpFolder);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'plugin',
'notification' => $success ? $this->getUrl(3) . '.zip copié dans le dossier Module du gestionnaire de fichier' : 'Erreur de copie',
'state' => $success
]);
break;
case 'download':
default:
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize($tmpFolder . '/' . $fileName));
ob_clean();
ob_end_flush();
readfile( $tmpFolder . '/' .$fileName);
unlink($tmpFolder . '/' . $fileName);
$this->removeDir($tmpFolder);
exit();
break;
}
}
}
/*
* Export des données d'un module
*/
@ -487,7 +565,7 @@ class plugin extends common {
]);
} else {
// Créer un dossier par défaut
// Créer un dossier temporaire
$tmpFolder = self::TEMP_DIR . uniqid();
if (!is_dir($tmpFolder)) {
mkdir($tmpFolder, 0755);
@ -515,7 +593,7 @@ class plugin extends common {
if ($success)
{
$fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '-' . $this->getUrl(4) . '.zip';
$this->makeZip ($fileName, $tmpFolder, []);
$this->makeZip ($fileName, $tmpFolder);
if (file_exists($fileName)) {
ob_start();
header('Content-Type: application/octet-stream');

View File

@ -8,7 +8,7 @@
</div>
<div class="col1">
<?php echo template::button('configModulesHelp', [
'href' => 'https://doc.zwiicms.fr/modules-utilisation-generique',
'href' => 'https://doc.zwiicms.fr/gestion-des-modules',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp',
@ -29,14 +29,18 @@
"help" => 'Ajouter à partir d\'une archive ZIP'
]); ?>
</div>
</div
<?php if($module::$modOrphans): ?>>
<h3>Modules installés non utilisés par une page : </h3>
<?php echo template::table([2, 2, 1, 2, 2, 1, 1, 1], $module::$modOrphans, [ 'Module', 'moduleId', 'Version', '', '', '', '', 'Supprimer']); ?>
</div>
<?php if($module::$modulesOrphan): ?>
<h3>Suppression des modules orphelins</h3>
<?php echo template::table([2, 2, 1, 6, 1], $module::$modulesOrphan, [ 'Module', 'moduleId', 'Version', '', '']); ?>
<?php endif; ?>
<?php if($module::$modInstal): ?>
<h3>Modules utilisés : </h3>
<?php echo template::table([2, 2, 1, 1, 4, 1, 1], $module::$modInstal, [ 'Module', 'moduleId', 'Version', 'Langue', 'Page (id)', '', '']); ?>
<?php if($module::$modulesInstalled): ?>
<h3>Sauvegarde des modules</h3>
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesInstalled, [ 'Module', 'moduleId', 'Version', '', '', '']); ?>
<?php endif; ?>
<?php if($module::$modulesData): ?>
<h3>Sauvegarde des données des modules installés</h3>
<?php echo template::table([2, 2, 1, 1, 4, 1, 1], $module::$modulesData, [ 'Module', 'moduleId', 'Version', 'Langue', 'Page (id)', '', '']); ?>
<?php else: ?>
<?php echo template::speech('Aucun module installé.'); ?>
<?php endif; ?>