From 88b1dd41bb0ef6d0e5b70a83db81e7d7ea99eb02 Mon Sep 17 00:00:00 2001 From: dingyongliang Date: Thu, 28 Dec 2023 15:46:51 +0800 Subject: [PATCH] * complete exportMiniProgram. --- module/ai/control.php | 17 +++++++- module/ai/js/miniprograms.js | 43 ++++++++++++++++++++ module/ai/js/miniprogramview.js | 39 ++++++++++++++++++ module/ai/model.php | 53 +++++++++++++++++++++++++ module/ai/view/miniprograms.html.php | 17 +++++--- module/ai/view/miniprogramview.html.php | 18 ++++++--- 6 files changed, 175 insertions(+), 12 deletions(-) diff --git a/module/ai/control.php b/module/ai/control.php index e90b6e56f6..984c0de370 100644 --- a/module/ai/control.php +++ b/module/ai/control.php @@ -489,14 +489,29 @@ class ai extends control $this->display(); } + /** + * Export a mini program as zip file. + * + * @param string $appID + * @return void + */ public function exportMiniProgram($appID) { + $php = $this->ai->createZtAppPhp($appID); + $zip = $this->ai->createZtAppZip($php); + header('Content-Type: application/zip'); + header('Content-Transfer-Encoding: binary'); + header('Content-Disposition: attachment; filename="' . basename($zip) . '"'); + header('Content-Length: ' . filesize($zip)); + readfile($zip); + unlink($zip); + exit; } public function importMiniProgram($appID) { - + } /** diff --git a/module/ai/js/miniprograms.js b/module/ai/js/miniprograms.js index 62fbfc75fd..2ba37c8e71 100644 --- a/module/ai/js/miniprograms.js +++ b/module/ai/js/miniprograms.js @@ -60,3 +60,46 @@ function unpublishMiniProgram() { window.location.href = createLink('ai', 'unpublishMiniProgram', `appID=${miniProgramID}`); } + +/** + * Export mini program data. + * @param {Event} event + */ +function exportMiniProgram(event) +{ + const $target = $(event.target); + const $tr = $target.closest('tr'); + const id = $tr.find('.c-id').text(); + const name = $tr.find('.c-name').text(); + + $target.closest('button').attr('disabled', 'disabled'); + + const xhr = new XMLHttpRequest(); + xhr.open('GET', createLink('ai', 'exportMiniProgram', `appID=${id}`, 'json'), true); + xhr.responseType = 'blob'; + xhr.setRequestHeader('Accept', 'application/zip'); + + xhr.onload = function() + { + if(xhr.status === 200) + { + const blob = xhr.response; + const url = URL.createObjectURL(blob); + + const downloadLink = document.createElement('a'); + downloadLink.href = url; + downloadLink.download = `${name}.ztapp.zip`; + downloadLink.click(); + + URL.revokeObjectURL(url); + } + $target.closest('button').removeAttr('disabled'); + }; + + xhr.onerror = function() + { + $target.closest('button').removeAttr('disabled'); + }; + + xhr.send(); +} diff --git a/module/ai/js/miniprogramview.js b/module/ai/js/miniprogramview.js index d86f2668da..4d6fe4dddb 100644 --- a/module/ai/js/miniprogramview.js +++ b/module/ai/js/miniprogramview.js @@ -49,3 +49,42 @@ function unpublishMiniProgram() { window.location.href = createLink('ai', 'unpublishMiniProgram', `appID=${miniProgramID}`); } + +/** + * Export mini program data. + * @param {Event} event + */ +function exportMiniProgram(event) +{ + const $target = $(event.target); + $target.closest('button').attr('disabled', 'disabled'); + + const xhr = new XMLHttpRequest(); + xhr.open('GET', createLink('ai', 'exportMiniProgram', `appID=${miniProgramID}`, 'json'), true); + xhr.responseType = 'blob'; + xhr.setRequestHeader('Accept', 'application/zip'); + + xhr.onload = function() + { + if(xhr.status === 200) + { + const blob = xhr.response; + const url = URL.createObjectURL(blob); + + const downloadLink = document.createElement('a'); + downloadLink.href = url; + downloadLink.download = `${miniProgramName}.ztapp.zip`; + downloadLink.click(); + + URL.revokeObjectURL(url); + } + $target.closest('button').removeAttr('disabled'); + }; + + xhr.onerror = function() + { + $target.closest('button').removeAttr('disabled'); + }; + + xhr.send(); +} diff --git a/module/ai/model.php b/module/ai/model.php index ad6695115d..a93cd6efc5 100644 --- a/module/ai/model.php +++ b/module/ai/model.php @@ -899,6 +899,59 @@ class aiModel extends model return true; } + /** + * Create a mini program php data file. + * + * @param string $appID + * @return string + */ + public function createZtAppPhp($appID) + { + $miniProgram = $this->getMiniProgramByID($appID); + $fields = $this->getMiniProgramFields($appID); + unset($miniProgram->id); + unset($miniProgram->category); + unset($miniProgram->createdBy); + unset($miniProgram->createdDate); + unset($miniProgram->editedBy); + unset($miniProgram->editedDate); + unset($miniProgram->publishedDate); + $miniProgram->published = '0'; + $miniProgram->fields = array(); + + foreach($fields as $field) + { + unset($field->id); + unset($field->appID); + $miniProgram->fields[] = $field; + } + + $appJson = json_encode($miniProgram); + $content = <<app->getAppRoot() . "tmp/{$miniProgram->name}.ztapp.php"; + file_put_contents($file, $content); + return $file; + } + + /** + * Create mini program zip. + * + * @param string $file + * @return string + */ + public function createZtAppZip($file) + { + $this->app->loadClass('pclzip', true); + $zipPath = substr($file, 0, -3) . 'zip'; + $zip = new pclzip($zipPath); + $zip->create($file, PCLZIP_OPT_REMOVE_ALL_PATH); + return $zipPath; + } + /** * Save mini program fields. * diff --git a/module/ai/view/miniprograms.html.php b/module/ai/view/miniprograms.html.php index b8223a3a02..7ed005517d 100644 --- a/module/ai/view/miniprograms.html.php +++ b/module/ai/view/miniprograms.html.php @@ -29,11 +29,16 @@ $finalList = array_merge($categoryList, $lang->ai->miniPrograms->allCategories); } ?> - -
+
+ + + + createLink('ai', 'createMiniProgram'), " " . $lang->ai->miniPrograms->create, '', "class='btn btn-primary'"); ?> +
-