From 3a4bc1045935ac47d2622b1a03aa559516e76ca2 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 31 Jan 2021 17:17:50 +0100 Subject: [PATCH] api rendering --- Admin/Routes/Web/Api.php | 11 ++++ Controller/ApiController.php | 58 ++++++++++++++++- Theme/Api/render.tpl.php | 5 ++ Theme/Api/spreadsheetAsCsv.tpl.php | 22 +++++++ Theme/Api/spreadsheetAsHtml.tpl.php | 21 +++++++ Theme/Api/wordAsHtml.tpl.php | 17 +++++ Theme/Backend/Components/Media/audio.tpl.php | 6 +- Theme/Backend/Components/Media/image.tpl.php | 6 +- Theme/Backend/Components/Media/json.tpl.php | 25 ++++++++ .../Components/Media/powerpoint.tpl.php | 19 ++++++ .../Components/Media/spreadsheet.tpl.php | 63 ++++++++++++++++--- Theme/Backend/Components/Media/video.tpl.php | 6 +- Theme/Backend/Components/Media/word.tpl.php | 9 +++ 13 files changed, 254 insertions(+), 14 deletions(-) create mode 100644 Theme/Api/spreadsheetAsCsv.tpl.php create mode 100644 Theme/Api/spreadsheetAsHtml.tpl.php create mode 100644 Theme/Api/wordAsHtml.tpl.php diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php index e8cc2d9..2dbc334 100755 --- a/Admin/Routes/Web/Api.php +++ b/Admin/Routes/Web/Api.php @@ -37,6 +37,17 @@ return [ ], ], ], + '^.*/media/export(\?+.*|$)' => [ + [ + 'dest' => '\Modules\Media\Controller\ApiController:apiMediaExport', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::MEDIA, + ], + ], + ], '^.*/media/collection(\?+.*|$)' => [ [ 'dest' => '\Modules\Media\Controller\ApiController:apiCollectionCreate', diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 6368f44..90b8bee 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -35,6 +35,10 @@ use phpOMS\Model\Message\FormValidation; use phpOMS\System\File\FileUtils; use phpOMS\System\File\Local\Directory; use phpOMS\Utils\Parser\Markdown\Markdown; +use phpOMS\Views\View; +use phpOMS\System\MimeType; +use phpOMS\Model\Html\Head; +use phpOMS\Asset\AssetType; /** * Media class. @@ -538,6 +542,52 @@ final class ApiController extends Controller $response->set('export', $view); } + /** + * Routing end-point for application behaviour. + * + * @param Media $media Media + * @param HttpRequest $request Request + * @param HttpResponse $response Response + * + * @return View + * + * @since 1.0.0 + */ + public function createView(Media $media, RequestAbstract $request, ResponseAbstract $response) : View + { + $view = new View($this->app->l11nManager, $request, $response); + $view->setData('media', $media); + + if (($type = $request->getData('type')) === null) { + $view->setTemplate('/Modules/Media/Theme/Api/render'); + } elseif ($type === 'html') { + $head = new Head(); + $css = \file_get_contents(__DIR__ . '/../../../Web/Backend/css/backend-small.css'); + if ($css === false) { + $css = ''; + } + + $css = \preg_replace('!\s+!', ' ', $css); + $head->setStyle('core', $css ?? ''); + + $head->addAsset(AssetType::CSS, 'cssOMS/styles.css'); + $view->setData('head', $head); + + switch (\strtolower($media->extension)) { + case 'xls': + case 'xlsx': + $view->setTemplate('/Modules/Media/Theme/Api/spreadsheetAsHtml'); + break; + case 'doc': + case 'docx': + $view->setTemplate('/Modules/Media/Theme/Api/wordAsHtml'); + break; + } + } + + return $view; + } + /** * Set header for report/template * @@ -548,13 +598,15 @@ final class ApiController extends Controller * * @return void * - * @api - * * @since 1.0.0 */ private function setMediaResponseHeader(View $view, Media $media, RequestAbstract $request, ResponseAbstract $response) : void { - switch (\strtolower($media->extension)) { + switch ($request->getData('type') ?? \strtolower($media->extension)) { + case 'htm': + case 'html': + $response->header->set('Content-Type', MimeType::M_HTML, true); + break; case 'pdf': $response->header->set('Content-Type', MimeType::M_PDF, true); break; diff --git a/Theme/Api/render.tpl.php b/Theme/Api/render.tpl.php index 44de2ec..399e0d8 100644 --- a/Theme/Api/render.tpl.php +++ b/Theme/Api/render.tpl.php @@ -2,4 +2,9 @@ // @todo: is this chunked/streamed output or bulk output // if it is streamed it is not working because of ob_* in the actual response rendering + +$media = $this->getData('media'); + +$fp = \fopen(($media->isAbsolute ? '' : __DIR__ . '/../../../../') . $media->getPath(), 'r'); \fpassthru($fp); +\fclose($fp); diff --git a/Theme/Api/spreadsheetAsCsv.tpl.php b/Theme/Api/spreadsheetAsCsv.tpl.php new file mode 100644 index 0000000..2b43eb8 --- /dev/null +++ b/Theme/Api/spreadsheetAsCsv.tpl.php @@ -0,0 +1,22 @@ +getData('media'); + +$reader = IOFactory::createReaderforFile(($media->isAbsolute ? '' : __DIR__ . '/../../../../') . $media->getPath()); +$reader->setReadDataOnly(true); +$spreadsheet = $reader->load(($media->isAbsolute ? '' : __DIR__ . '/../../../../') . $media->getPath()); + +$writer = new Csv($spreadsheet); +$writer->setDelimiter(';'); +$writer->setEnclosure('"'); +$writer->setLineEnding("\n"); +$writer->setUseBOM(true); + +$writer->save('php://output'); diff --git a/Theme/Api/spreadsheetAsHtml.tpl.php b/Theme/Api/spreadsheetAsHtml.tpl.php new file mode 100644 index 0000000..fe95030 --- /dev/null +++ b/Theme/Api/spreadsheetAsHtml.tpl.php @@ -0,0 +1,21 @@ +getData('media'); + +$reader = IOFactory::createReaderforFile(($media->isAbsolute ? '' : __DIR__ . '/../../../../') . $media->getPath()); +$reader->setReadDataOnly(true); +$spreadsheet = $reader->load(($media->isAbsolute ? '' : __DIR__ . '/../../../../') . $media->getPath()); + +$writer = new Html($spreadsheet); +$writer->writeAllSheets(); + +$writer->save('php://output'); + +echo ''; diff --git a/Theme/Api/wordAsHtml.tpl.php b/Theme/Api/wordAsHtml.tpl.php new file mode 100644 index 0000000..798ba13 --- /dev/null +++ b/Theme/Api/wordAsHtml.tpl.php @@ -0,0 +1,17 @@ +getData('media'); + +$reader = IOFactory::createReader('Word2007'); +$doc = $reader->load(($media->isAbsolute ? '' : __DIR__ . '/../../../../') . $media->getPath()); + +$writer = new HTML($doc); + +$writer->save('php://output'); diff --git a/Theme/Backend/Components/Media/audio.tpl.php b/Theme/Backend/Components/Media/audio.tpl.php index 2362971..76a6fda 100644 --- a/Theme/Backend/Components/Media/audio.tpl.php +++ b/Theme/Backend/Components/Media/audio.tpl.php @@ -1,7 +1,11 @@ +
diff --git a/Theme/Backend/Components/Media/image.tpl.php b/Theme/Backend/Components/Media/image.tpl.php index ea1c0e7..a95158b 100644 --- a/Theme/Backend/Components/Media/image.tpl.php +++ b/Theme/Backend/Components/Media/image.tpl.php @@ -1,7 +1,11 @@ +
- <?= $this->printHtml($this->media->name); ?> + <?= $this->printHtml($this->media->name); ?>
\ No newline at end of file diff --git a/Theme/Backend/Components/Media/json.tpl.php b/Theme/Backend/Components/Media/json.tpl.php index e69de29..de10688 100644 --- a/Theme/Backend/Components/Media/json.tpl.php +++ b/Theme/Backend/Components/Media/json.tpl.php @@ -0,0 +1,25 @@ +getFileContent(($this->media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath()), true); +?> +
+
+
+ +
+ +
+
+
+ +
+
printHtml(
+                    $this->getFileContent(($this->media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath())
+                ); ?>
+
+
+
+
diff --git a/Theme/Backend/Components/Media/powerpoint.tpl.php b/Theme/Backend/Components/Media/powerpoint.tpl.php index e69de29..8f227f8 100644 --- a/Theme/Backend/Components/Media/powerpoint.tpl.php +++ b/Theme/Backend/Components/Media/powerpoint.tpl.php @@ -0,0 +1,19 @@ +load(($this->media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath()); + +$writer = new Html($presentation); +?> +
+
+ save('php://output'); ?> +
+
diff --git a/Theme/Backend/Components/Media/spreadsheet.tpl.php b/Theme/Backend/Components/Media/spreadsheet.tpl.php index f541de8..c63390d 100644 --- a/Theme/Backend/Components/Media/spreadsheet.tpl.php +++ b/Theme/Backend/Components/Media/spreadsheet.tpl.php @@ -1,18 +1,65 @@ media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath()); -$reader->setReadDataOnly(true); -$spreadsheet = $reader->load(($this->media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath()); - -$writer = new Html($spreadsheet); -$writer->writeAllSheets(); +use phpOMS\Uri\UriFactory; +use phpOMS\Utils\IO\Csv\CsvSettings; ?>
- save('php://output'); ?> +
+ +
+ +
+ +
+ +
+ media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath()); + $reader->setReadDataOnly(true); + $spreadsheet = $reader->load(($this->media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath()); + + $writer = new Csv($spreadsheet); + $writer->setDelimiter(';'); + $writer->setEnclosure('"'); + $writer->setLineEnding("\n"); + $writer->setUseBOM(true); + + \ob_start(); + $writer->save('php://output'); + $data = \ob_get_clean(); + $csv = \explode("\n", \trim($data, "\n")); + ?> + + '; + foreach ($lineCsv as $cell) { + if ($cell === null) { + break; + } + + echo '
' . \htmlspecialchars($cell); + } + } + ?> +
+
+
\ No newline at end of file diff --git a/Theme/Backend/Components/Media/video.tpl.php b/Theme/Backend/Components/Media/video.tpl.php index 0dae646..1268b72 100644 --- a/Theme/Backend/Components/Media/video.tpl.php +++ b/Theme/Backend/Components/Media/video.tpl.php @@ -1,7 +1,11 @@ +
diff --git a/Theme/Backend/Components/Media/word.tpl.php b/Theme/Backend/Components/Media/word.tpl.php index e69de29..8b25e3f 100644 --- a/Theme/Backend/Components/Media/word.tpl.php +++ b/Theme/Backend/Components/Media/word.tpl.php @@ -0,0 +1,9 @@ + +
+
+ +
+