diff --git a/core/module/addon/view/import/import.php b/core/module/addon/view/import/import.php deleted file mode 100644 index 8ccc44ce..00000000 --- a/core/module/addon/view/import/import.php +++ /dev/null @@ -1,30 +0,0 @@ - -
-
- 'buttonGrey', - 'href' => helper::baseUrl() . 'addon', - 'value' => template::ico('left') - ]); ?> -
-
- 'Appliquer' - ]); ?> -
-
-
-
-
-

Installer des données de module

-
-
- 'Archive ZIP :', - 'type' => 2 - ]); ?> -
-
-
-
-
\ No newline at end of file diff --git a/core/module/addon/addon.php b/core/module/plugin/plugin.php similarity index 73% rename from core/module/addon/addon.php rename to core/module/plugin/plugin.php index 3379395f..ebf47770 100644 --- a/core/module/addon/addon.php +++ b/core/module/plugin/plugin.php @@ -16,21 +16,21 @@ * @link http://zwiicms.fr/ */ -class addon extends common { +class plugin extends common { public static $actions = [ 'index' => self::GROUP_ADMIN, 'delete' => self::GROUP_ADMIN, - 'export' => self::GROUP_ADMIN, - 'import' => self::GROUP_ADMIN, + 'dataExport' => self::GROUP_ADMIN, + 'dataImport' => self::GROUP_ADMIN, // les données d'un module 'store' => self::GROUP_ADMIN, - 'item' => self::GROUP_ADMIN, - 'upload' => self::GROUP_ADMIN, - 'uploadItem'=> self::GROUP_ADMIN + 'item' => self::GROUP_ADMIN, // détail d'un objet + 'upload' => self::GROUP_ADMIN, // Téléverser catalogue + 'uploadItem'=> self::GROUP_ADMIN // Téléverser par archive ]; // URL des modules - const BASEURL_STORE = 'https://www.zwiicms.fr/'; + const BASEURL_STORE = 'https://store.zwiicms.fr/'; const MODULE_STORE = '?modules/'; // Gestion des modules @@ -43,6 +43,9 @@ class addon extends common { public static $storeList = []; public static $storeItem = []; + // Liste de pages + public static $pagesList = []; + /* * Effacement d'un module installé et non utilisé @@ -53,7 +56,7 @@ class addon extends common { if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); @@ -81,7 +84,7 @@ class addon extends common { } // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'notification' => $notification, 'state' => $success ]); @@ -271,7 +274,7 @@ class addon extends common { *} */ $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon/store', + 'redirect' => helper::baseUrl() . 'plugin/store', 'notification' => $moduleFile . ' téléchargé dans le dossier modules du gestionnaire de fichiers', 'state' => true ]); @@ -390,16 +393,16 @@ class addon extends common { : '', implode(', ',array_keys($inPages,$key)) !== '' ? template::button('moduleExport' . $key, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), - 'help' => 'Exporter les données du module avec sa page' + 'help' => 'Exporter les données du module' ]) : '', implode(', ',array_keys($inPages,$key)) === '' ? template::button('moduleExport' . $key, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('upload'), - 'help' => 'Importer les données du module avec sa page' + 'help' => 'Importer les données du module' ]) : '' ]; @@ -415,95 +418,114 @@ class addon extends common { /* * Export des données d'un module externes ou interne à module.json */ - public function export(){ + public function dataExport(){ // Jeton incorrect if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); } else { - // 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, 0755); - } - // 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) { - // Export des pages hébergeant le module - $pageParam[$pageId] = $this->getData(['page',$pageId]); - // Export du contenu de la page - //$pageContent[$pageId] = file_get_contents(self::DATA_DIR . self::$i18n . '/content/' . $this->getData(['page', $pageId, 'content'])); - $pageContent[$pageId] = $this->getPage($pageId, self::$i18n); - // Export de fr/module.json - $moduleId = 'fr/module.json'; - $moduleDir = str_replace('site/data/','',$infoModules[$this->getUrl(2)]['dataDirectory']); - // 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]; + // Soumission du formulaire + if($this->isPost()) { + // 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, 0755); } - // Créer le dossier temporaire si inexistant sinon le nettoie et le créer - if (!is_dir($tmpFolder . '/' . $lang)) { - mkdir ($tmpFolder . '/' . $lang, 0755, true); - } else { - $this->removeDir($tmpFolder . '/' . $lang); - mkdir ($tmpFolder . '/' . $lang, 0755, true); - } - // Créer le dossier temporaire des données du module - if ($infoModules[$this->getUrl(2)]['dataDirectory']) { - if (!is_dir($tmpFolder . '/' . $moduleDir)) { - mkdir ($tmpFolder . '/' . $moduleDir, 0755, true) ; + $page = $this->getInput('pluginExportSelectPage'); + + // 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) { + // Export des pages hébergeant le module + $pageParam[$pageId] = $this->getData(['page',$pageId]); + // Export du contenu de la page + //$pageContent[$pageId] = file_get_contents(self::DATA_DIR . self::$i18n . '/content/' . $this->getData(['page', $pageId, 'content'])); + $pageContent[$pageId] = $this->getPage($pageId, self::$i18n); + // Export de fr/module.json + $moduleId = 'fr/module.json'; + $moduleDir = str_replace('site/data/','',$infoModules[$this->getUrl(2)]['dataDirectory']); + // 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 temporaire si inexistant sinon le nettoie et le créer + if (!is_dir($tmpFolder . '/' . $lang)) { + mkdir ($tmpFolder . '/' . $lang, 0755, true); + } else { + $this->removeDir($tmpFolder . '/' . $lang); + mkdir ($tmpFolder . '/' . $lang, 0755, true); + } + // Créer le dossier temporaire des données du module + if ($infoModules[$this->getUrl(2)]['dataDirectory']) { + if (!is_dir($tmpFolder . '/' . $moduleDir)) { + mkdir ($tmpFolder . '/' . $moduleDir, 0755, true) ; + } + } + // Sauvegarde si données non vides + $tmpData [$pageId] = $this->getData(['module',$pageId ]); + if ($tmpData [$pageId] !== null) { + file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); + } + // Export des données localisées dans le dossier de données du module + if ($infoModules[$this->getUrl(2)]['dataDirectory'] && + is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])) { + $this->copyDir ($infoModules[$this->getUrl(2)]['dataDirectory'], $tmpFolder . '/' . $moduleDir); } } - // Sauvegarde si données non vides - $tmpData [$pageId] = $this->getData(['module',$pageId ]); - if ($tmpData [$pageId] !== null) { - file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); + // 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($pageParam)); + mkdir ($tmpFolder . '/' . $lang . '/content', 0755); + file_put_contents($tmpFolder . '/' . $lang . '/content/' . $this->getData(['page', $pageId, 'content']), $pageContent); } - // Export des données localisées dans le dossier de données du module - if ($infoModules[$this->getUrl(2)]['dataDirectory'] && - is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])) { - $this->copyDir ($infoModules[$this->getUrl(2)]['dataDirectory'], $tmpFolder . '/' . $moduleDir); + // création du zip + $fileName = $this->getUrl(2) . '.zip'; + $this->makeZip ($fileName, $tmpFolder, []); + if (file_exists($fileName)) { + ob_start(); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . $fileName . '"'); + header('Content-Length: ' . filesize($fileName)); + ob_clean(); + ob_end_flush(); + readfile( $fileName); + unlink($fileName); + $this->removeDir($tmpFolder); + exit(); + } else { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'notification' => 'Quelque chose s\'est mal passé', + 'state' => false + ]); } - } - // 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($pageParam)); - mkdir ($tmpFolder . '/' . $lang . '/content', 0755); - file_put_contents($tmpFolder . '/' . $lang . '/content/' . $this->getData(['page', $pageId, 'content']), $pageContent); - } - // création du zip - $fileName = $this->getUrl(2) . '.zip'; - $this->makeZip ($fileName, $tmpFolder, []); - if (file_exists($fileName)) { - ob_start(); - header('Content-Type: application/octet-stream'); - header('Content-Disposition: attachment; filename="' . $fileName . '"'); - header('Content-Length: ' . filesize($fileName)); - ob_clean(); - ob_end_flush(); - readfile( $fileName); - unlink($fileName); - $this->removeDir($tmpFolder); - exit(); } else { + + // Liste des pages contenant le module + $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + foreach( $inPages as $key=>$value){ + if ($value === $this->getUrl(2)) { + self::$pagesList[] = $key; + } + } // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', - 'notification' => 'Quelque chose s\'est mal passé', - 'state' => false + 'title' => 'Export des données de module', + 'view' => 'dataExport' ]); } } @@ -512,12 +534,12 @@ class addon extends common { /* * Importer des données d'un module externes ou interne à module.json */ - public function import(){ + public function dataImport(){ // Jeton incorrect if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); @@ -526,18 +548,32 @@ class addon extends common { // Soumission du formulaire if($this->isPost()) { // Récupérer le fichier et le décompacter - $zipFilename = $this->getInput('addonImportFile', helper::FILTER_STRING_SHORT, true); + $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); + $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); $tempFolder = uniqid(); mkdir (self::TEMP_DIR . $tempFolder, 0755); $zip = new ZipArchive(); if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { $zip->extractTo(self::TEMP_DIR . $tempFolder ); } + + // copie du contenu de la page + $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); + // Supprimer les fichiers importés + unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); + // Import des fichiers placés ailleurs que dans les dossiers localisés. + $this->copyDir (self::TEMP_DIR . $tempFolder, self::DATA_DIR ); + + // Import des données localisées page.json et module.json // Pour chaque dossier localisé - $dataTarget = array(); - $dataSource = array(); + // $dataTarget = array(); + // $dataSource = array(); + + + // Liste des pages de même nom dans l'archive et le site + /* $list = ''; foreach (self::$i18nList as $key=>$value) { // Les Pages et les modules @@ -561,20 +597,16 @@ class addon extends common { if( $list === ''){ file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); } - // copie du contenu de la page - $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); - // Supprimer les fichiers importés - unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); } } } + */ - // Import des fichiers placés ailleurs que dans les dossiers localisés. - $this->copyDir (self::TEMP_DIR . $tempFolder,self::DATA_DIR ); // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); $zip->close(); + /* if( $list !== '' ){ $success = false; strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list; @@ -582,18 +614,29 @@ class addon extends common { else{ $success = true; $notification = 'Import réussi'; - } + }*/ // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => $success, 'notification' => $notification ]); } + + // Liste des pages ne contenant pas de module + self::$pagesList = $this->getData(['page']); + foreach(self::$pagesList as $page => $pageId) { + if ($this->getData(['page',$page,'block']) === 'bar' || + $this->getData(['page',$page,'disable']) === true || + $this->getData(['page',$page,'moduleId']) !== '') { + unset(self::$pagesList[$page]); + } + } + // Valeurs en sortie $this->addOutput([ 'title' => 'Importer des données de module', - 'view' => 'import' + 'view' => 'dataImport' ]); } } diff --git a/core/module/addon/view/import/import.css b/core/module/plugin/view/dataExport/dataExport.css similarity index 100% rename from core/module/addon/view/import/import.css rename to core/module/plugin/view/dataExport/dataExport.css diff --git a/core/module/plugin/view/dataExport/dataExport.php b/core/module/plugin/view/dataExport/dataExport.php new file mode 100644 index 00000000..e9d1ee50 --- /dev/null +++ b/core/module/plugin/view/dataExport/dataExport.php @@ -0,0 +1,30 @@ + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . 'plugin', + 'value' => template::ico('left') + ]); ?> +
+
+ 'Appliquer' + ]); ?> +
+
+
+
+
+

Installer des données de module

+
+
+ 'Export depuis la page ' . template::flag('site', '20px'), + 'help' => 'Pour exporter les données de module d\'une autre langue traduite, sélectionnez-la puis revenez sur cet écran' + ]); ?> +
+
+
+
+
\ No newline at end of file diff --git a/core/module/addon/view/index/index.css b/core/module/plugin/view/dataImport/dataImport.css similarity index 100% rename from core/module/addon/view/index/index.css rename to core/module/plugin/view/dataImport/dataImport.css diff --git a/core/module/plugin/view/dataImport/dataImport.php b/core/module/plugin/view/dataImport/dataImport.php new file mode 100644 index 00000000..ea365be6 --- /dev/null +++ b/core/module/plugin/view/dataImport/dataImport.php @@ -0,0 +1,35 @@ + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . 'plugin', + 'value' => template::ico('left') + ]); ?> +
+
+ 'Appliquer' + ]); ?> +
+
+
+
+
+

Installer des données de module

+
+
+ 'Archive ZIP :', + 'type' => 2 + ]); ?> +
+
+ 'Importer le module dans la page ' . template::flag('site', '20px') + ]); ?> +
+
+
+
+
\ No newline at end of file diff --git a/core/module/addon/view/store/store.css b/core/module/plugin/view/index/index.css similarity index 100% rename from core/module/addon/view/store/store.css rename to core/module/plugin/view/index/index.css diff --git a/core/module/addon/view/index/index.help.html b/core/module/plugin/view/index/index.help.html similarity index 100% rename from core/module/addon/view/index/index.help.html rename to core/module/plugin/view/index/index.help.html diff --git a/core/module/addon/view/index/index.js.php b/core/module/plugin/view/index/index.js.php similarity index 100% rename from core/module/addon/view/index/index.js.php rename to core/module/plugin/view/index/index.js.php diff --git a/core/module/addon/view/index/index.php b/core/module/plugin/view/index/index.php similarity index 88% rename from core/module/addon/view/index/index.php rename to core/module/plugin/view/index/index.php index f5ee7fc6..e95c77ce 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -17,21 +17,21 @@
helper::baseUrl() . 'addon/store', + 'href' => helper::baseUrl() . 'plugin/store', 'value' => template::ico('shopping-basket'), "help" => 'Lister le catalogue en ligne' ]); ?>
helper::baseUrl() . 'addon/upload', + 'href' => helper::baseUrl() . 'plugin/upload', 'value' => template::ico('plus'), "help" => 'Ajouter à partir d\'une archive ZIP' ]); ?>
- + diff --git a/core/module/addon/view/item/item.css b/core/module/plugin/view/item/item.css similarity index 100% rename from core/module/addon/view/item/item.css rename to core/module/plugin/view/item/item.css diff --git a/core/module/addon/view/item/item.php b/core/module/plugin/view/item/item.php similarity index 100% rename from core/module/addon/view/item/item.php rename to core/module/plugin/view/item/item.php diff --git a/core/module/addon/view/upload/upload.css b/core/module/plugin/view/store/store.css similarity index 100% rename from core/module/addon/view/upload/upload.css rename to core/module/plugin/view/store/store.css diff --git a/core/module/addon/view/store/store.php b/core/module/plugin/view/store/store.php similarity index 87% rename from core/module/addon/view/store/store.php rename to core/module/plugin/view/store/store.php index 8646d8cf..154bc4c7 100644 --- a/core/module/addon/view/store/store.php +++ b/core/module/plugin/view/store/store.php @@ -2,7 +2,7 @@
'buttonGrey', - 'href' => helper::baseUrl() . 'addon', + 'href' => helper::baseUrl() . 'plugin', 'value' => template::ico('left') ]); ?>
diff --git a/core/module/plugin/view/upload/upload.css b/core/module/plugin/view/upload/upload.css new file mode 100644 index 00000000..52709ea6 --- /dev/null +++ b/core/module/plugin/view/upload/upload.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-2022, 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/upload/upload.php b/core/module/plugin/view/upload/upload.php similarity index 93% rename from core/module/addon/view/upload/upload.php rename to core/module/plugin/view/upload/upload.php index 57114be4..c4104450 100644 --- a/core/module/addon/view/upload/upload.php +++ b/core/module/plugin/view/upload/upload.php @@ -3,12 +3,12 @@
'buttonGrey', - 'href' => helper::baseUrl() . 'addon', + 'href' => helper::baseUrl() . 'plugin', 'value' => template::ico('left') ]); ?>
- 'https://doc.zwiicms.fr/installation-d-un-module', 'target' => '_blank', 'class' => 'buttonHelp',