From 39e6e3810701e060ff7e6cb94f621b904d3a02f1 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Thu, 25 Mar 2021 17:56:31 +0100 Subject: [PATCH] Store Fonction importModule pour le store et l'import de zip --- core/module/addon/addon.php | 143 +++++++++++++++---------- core/module/addon/view/store/store.php | 2 +- 2 files changed, 87 insertions(+), 58 deletions(-) diff --git a/core/module/addon/addon.php b/core/module/addon/addon.php index 3b1d0290..43f6b368 100644 --- a/core/module/addon/addon.php +++ b/core/module/addon/addon.php @@ -25,7 +25,8 @@ class addon extends common { 'import' => self::GROUP_ADMIN, 'store' => self::GROUP_ADMIN, 'item' => self::GROUP_ADMIN, - 'upload' => self::GROUP_ADMIN + 'upload' => self::GROUP_ADMIN, + 'storeDownload'=> self::GROUP_ADMIN ]; // Gestion des modules @@ -220,7 +221,7 @@ class addon extends common { $url = 'http://zwiicms.fr/?modules/list'; $store = json_decode(helper::urlGetContents($url), true); if ($store) { - // Modules installés + // Modules installés $infoModules = helper::getModules(); // Clés moduleIds dans les pages $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); @@ -235,15 +236,24 @@ class addon extends common { mb_detect_encoding(strftime('%d %B %Y', $store[$key]['fileDate']), 'UTF-8', true) ? strftime('%d %B %Y', $store[$key]['fileDate']) : utf8_encode(strftime('%d %B %Y', $store[$key]['fileDate'])), - implode(', ',array_keys($inPages,$key)) === '' - ? template::button('moduleExport' . $key, [ - 'class' => 'buttonBlue', - 'href' => helper::baseUrl(). $this->getUrl(0) . '/installModule/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('download') - ]) - : '' + template::button('moduleExport' . $key, [ + 'class' => 'buttonBlue', + 'href' => helper::baseUrl(). $this->getUrl(0) . '/storeDownload/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('download') + ]) + ]; + /** + * implode(', ',array_keys($inPages,$key)) === '' + * ? template::button('moduleExport' . $key, [ + * 'class' => 'buttonBlue', + * 'href' => helper::baseUrl(). $this->getUrl(0) . '/installModule/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + * 'value' => template::ico('download') + * ]) + * : '' + * ]; + */ - ]; + } } @@ -321,7 +331,7 @@ class addon extends common { // Valeurs en sortie $this->addOutput([ - 'title' => 'Gestion des modules', + 'title' => 'Modules installés', 'view' => 'index' ]); } @@ -448,52 +458,7 @@ class addon extends common { 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); - $zip = new ZipArchive(); - if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { - $zip->extractTo(self::TEMP_DIR . $tempFolder ); - } - // Import des données localisées page.json et module.json - // Pour chaque dossier localisé - $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 - foreach (['page','module'] as $fileTarget){ - if (file_exists(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json')) { - // Le dossier de langue existe - // faire la fusion - $dataSource = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'), true); - // Des pages de même nom que celles de l'archive existent - if( $fileTarget === 'page' ){ - foreach( $dataSource as $keydataSource=>$valuedataSource ){ - foreach( $this->getData(['page']) as $keypage=>$valuepage ){ - if( $keydataSource === $keypage){ - $list === '' ? $list .= ' '.$this->getData(['page', $keypage, 'title']) : $list .= ', '.$this->getData(['page', $keypage, 'title']); - } - } - } - } - $dataTarget = json_decode(file_get_contents(self::DATA_DIR . $key . '/' . $fileTarget . '.json'), true); - $data [$fileTarget] = array_merge($dataTarget[$fileTarget], $dataSource); - if( $list === ''){ - file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); - } - // 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->custom_copy (self::TEMP_DIR . $tempFolder,self::DATA_DIR ); - - // Supprimer le dossier temporaire - $this->removeDir(self::TEMP_DIR . $tempFolder); - $zip->close(); + $list = $this->importModule($zipFilename); 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; @@ -515,5 +480,69 @@ class addon extends common { 'view' => 'import' ]); } + + } + + + /** + * Téléchargement d'un module à partir du store + */ + public function storeDownload() { + + } + + + /** + * Installation d'un module + * @param moduleName url du module à installer + */ + private function installModule($moduleName) { + $tempFolder = uniqid(); + mkdir (self::TEMP_DIR . $tempFolder); + $zip = new ZipArchive(); + if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { + $zip->extractTo(self::TEMP_DIR . $tempFolder ); + } + // Import des données localisées page.json et module.json + // Pour chaque dossier localisé + $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 + foreach (['page','module'] as $fileTarget){ + if (file_exists(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json')) { + // Le dossier de langue existe + // faire la fusion + $dataSource = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'), true); + // Des pages de même nom que celles de l'archive existent + if( $fileTarget === 'page' ){ + foreach( $dataSource as $keydataSource=>$valuedataSource ){ + foreach( $this->getData(['page']) as $keypage=>$valuepage ){ + if( $keydataSource === $keypage){ + $list === '' ? $list .= ' '.$this->getData(['page', $keypage, 'title']) : $list .= ', '.$this->getData(['page', $keypage, 'title']); + } + } + } + } + $dataTarget = json_decode(file_get_contents(self::DATA_DIR . $key . '/' . $fileTarget . '.json'), true); + $data [$fileTarget] = array_merge($dataTarget[$fileTarget], $dataSource); + if( $list === ''){ + file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); + } + // 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->custom_copy (self::TEMP_DIR . $tempFolder,self::DATA_DIR ); + + // Supprimer le dossier temporaire + $this->removeDir(self::TEMP_DIR . $tempFolder); + $zip->close(); + return($list); } } diff --git a/core/module/addon/view/store/store.php b/core/module/addon/view/store/store.php index 8e746ba5..0d7a05b5 100644 --- a/core/module/addon/view/store/store.php +++ b/core/module/addon/view/store/store.php @@ -15,7 +15,7 @@ - + \ No newline at end of file