From 14af9847f61c8aa46f992212633af55932a155c3 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 18 Feb 2021 18:34:53 +0100 Subject: [PATCH] Import WIP + une correction dans le theme (nom de fonction en double) --- core/module/addon/addon.php | 179 ++++++++++++++--------- core/module/addon/view/import/import.css | 18 +++ core/module/addon/view/import/import.php | 31 ++++ core/module/addon/view/index/index.php | 2 +- core/module/theme/theme.php | 6 +- 5 files changed, 159 insertions(+), 77 deletions(-) create mode 100644 core/module/addon/view/import/import.css create mode 100644 core/module/addon/view/import/import.php diff --git a/core/module/addon/addon.php b/core/module/addon/addon.php index bc754c95..e442f178 100644 --- a/core/module/addon/addon.php +++ b/core/module/addon/addon.php @@ -22,6 +22,7 @@ class addon extends common { 'index' => self::GROUP_ADMIN, 'moduleDelete' => self::GROUP_ADMIN, 'export' => self::GROUP_ADMIN, + 'import' => self::GROUP_ADMIN ]; // Gestion des modules @@ -99,6 +100,13 @@ class addon extends common { ? template::button('moduleExport' . $key, [ 'class' => 'buttonBlue', 'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key,// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('download') + ]) + : '', + is_array($infoModules[$key]['dataDirectory']) && implode(', ',array_keys($inPages,$key)) !== '' + ? template::button('moduleExport' . $key, [ + 'class' => 'buttonBlue', + 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key,// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('upload') ]) : '' @@ -245,84 +253,109 @@ class addon extends common { * Export des données d'un module externes ou interne à module.json */ public function export(){ - // Lire les données du module - $infoModules = helper::getModules(); - // Créer un dossier par défaut - $tmpFolder = self::TEMP_DIR . uniqid(); - //$tmpFolder = self::TEMP_DIR . 'test'; - if (!is_dir($tmpFolder)) { - mkdir($tmpFolder); - } - // Clés moduleIds dans les pages - $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); - // Parcourir les pages utilisant le module - foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) { - foreach ($infoModules[$this->getUrl(2)]['dataDirectory'] as $moduleId) { - // Export des pages hébergeant le module - $pageContent[$pageId] = $this->getData(['page',$pageId]); - /** - * Données module.json ? - */ - if (strpos($moduleId,'module.json')) { - // Création de l'arborescence des langues - // Pas de nom dossier de langue - dossier par défaut - $t = explode ('/',$moduleId); - if ( is_array($t)) { - $lang = 'fr'; - } else { - $lang = $t[0]; - } - // Créer le dossier si inexistant - if (!is_dir($tmpFolder . '/' . $lang)) { - mkdir ($tmpFolder . '/' . $lang); - } - // Sauvegarde si données non vides - $tmpData [$pageId] = $this->getData(['module',$pageId ]); - if ($tmpData [$pageId] !== null) { - file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); - } + // Lire les données du module + $infoModules = helper::getModules(); + // Créer un dossier par défaut + $tmpFolder = self::TEMP_DIR . uniqid(); + //$tmpFolder = self::TEMP_DIR . 'test'; + if (!is_dir($tmpFolder)) { + mkdir($tmpFolder); + } + // Clés moduleIds dans les pages + $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + // Parcourir les pages utilisant le module + foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) { + foreach ($infoModules[$this->getUrl(2)]['dataDirectory'] as $moduleId) { + // Export des pages hébergeant le module + $pageContent[$pageId] = $this->getData(['page',$pageId]); + /** + * Données module.json ? + */ + if (strpos($moduleId,'module.json')) { + // Création de l'arborescence des langues + // Pas de nom dossier de langue - dossier par défaut + $t = explode ('/',$moduleId); + if ( is_array($t)) { + $lang = 'fr'; } else { - /** - * Données dans un json personnalisé, le sauvegarder - * Dossier non localisé - */ - if ( file_exists(self::DATA_DIR . '/' . $moduleId) - && !file_exists($tmpFolder . '/' . $moduleId ) ) { - copy ( self::DATA_DIR . '/' . $moduleId, $tmpFolder . '/' . $moduleId ); - } + $lang = $t[0]; + } + // Créer le dossier si inexistant + if (!is_dir($tmpFolder . '/' . $lang)) { + mkdir ($tmpFolder . '/' . $lang); + } + // Sauvegarde si données non vides + $tmpData [$pageId] = $this->getData(['module',$pageId ]); + if ($tmpData [$pageId] !== null) { + file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); + } + } else { + /** + * Données dans un json personnalisé, le sauvegarder + * Dossier non localisé + */ + if ( file_exists(self::DATA_DIR . '/' . $moduleId) + && !file_exists($tmpFolder . '/' . $moduleId ) ) { + $this->custom_copy ( self::DATA_DIR . '/' . $moduleId, $tmpFolder . '/' . $moduleId ); } } } - // Enregistrement des pages dans le dossier de langue identique à module + } + // Enregistrement des pages dans le dossier de langue identique à module - if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) { - file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageContent)); - } - - // création du zip - $fileName = $this->getUrl(2) . '.zip'; - $this->makeZip ($fileName, $tmpFolder, []); - if (file_exists($fileName)) { - header('Content-Type: application/octet-stream'); - header('Content-Disposition: attachment; filename="' . $fileName . '"'); - header('Content-Length: ' . filesize($fileName)); - readfile( $fileName); - // Valeurs en sortie - $this->addOutput([ - 'display' => self::DISPLAY_RAW - ]); - unlink($fileName); - $this->removeDir($tmpFolder); - exit(); - } else { - // Valeurs en sortie - $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', - 'notification' => 'Quelque chose s\'est mal passé', - 'state' => false - ]); - } + if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) { + file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageContent)); + } + // création du zip + $fileName = $this->getUrl(2) . '.zip'; + $this->makeZip ($fileName, $tmpFolder, []); + if (file_exists($fileName)) { + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . $fileName . '"'); + header('Content-Length: ' . filesize($fileName)); + readfile( $fileName); + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_RAW + ]); + unlink($fileName); + $this->removeDir($tmpFolder); + exit(); + } else { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'addon', + 'notification' => 'Quelque chose s\'est mal passé', + 'state' => false + ]); + } } -} + /* + * Importer des données d'un module externes ou interne à module.json + */ + public function import(){ + // Soumission du formulaire + if($this->isPost()) { + // Récupérer le fichier et le décompacter + $zipFilename = $this->getInput('addonImportFile', helper::FILTER_STRING_SHORT, true); + $tempFolder = uniqid(); + mkdir (self::TEMP_DIR . $tempFolder); + echo $zipFilename; + $zip = new ZipArchive(); + if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { + $zip->extractTo(self::TEMP_DIR . $tempFolder ); + } + + // Supprimer le dossier temporaire même si le thème est invalide + //$this->removeDir(self::TEMP_DIR . $tempFolder); + $zip->close(); + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Importer des données de module', + 'view' => 'import' + ]); + } +} \ No newline at end of file diff --git a/core/module/addon/view/import/import.css b/core/module/addon/view/import/import.css new file mode 100644 index 00000000..5a91e7a7 --- /dev/null +++ b/core/module/addon/view/import/import.css @@ -0,0 +1,18 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/core/module/addon/view/import/import.php b/core/module/addon/view/import/import.php new file mode 100644 index 00000000..7cc41dac --- /dev/null +++ b/core/module/addon/view/import/import.php @@ -0,0 +1,31 @@ + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . 'addon', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+ 'Appliquer' + ]); ?> +
+
+
+
+
+

Installer des données de module

+
+
+ 'Archive ZIP :', + 'type' => 2 + ]); ?> +
+
+
+
+
\ No newline at end of file diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php index 56c5bcf1..6da3c716 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/addon/view/index/index.php @@ -40,7 +40,7 @@ - + diff --git a/core/module/theme/theme.php b/core/module/theme/theme.php index c1441b26..8cb8b382 100755 --- a/core/module/theme/theme.php +++ b/core/module/theme/theme.php @@ -692,7 +692,7 @@ class theme extends common { */ public function export() { // Make zip - $zipFilename = $this->makezip($this->getUrl(2)); + $zipFilename = $this->zipTheme($this->getUrl(2)); // Téléchargement du ZIP header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); @@ -710,7 +710,7 @@ class theme extends common { */ public function save() { // Make zip - $zipFilename = $this->makezip($this->getUrl(2)); + $zipFilename = $this->zipTheme($this->getUrl(2)); // Téléchargement du ZIP if (!is_dir(self::FILE_DIR.'source/theme')) { mkdir(self::FILE_DIR.'source/theme'); @@ -772,7 +772,7 @@ class theme extends common { * construction du zip * @param string $modele theme ou admin */ - private function makezip($modele) { + private function zipTheme($modele) { // Creation du dossier $zipFilename = $modele . ' ' .date('d m Y').' '.date('H i s ').'.zip'; $zip = new ZipArchive();