From 6de9a0c13fd2bae03481a3339cb8892eaaf71d6e Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Wed, 27 Jan 2021 20:24:39 +0100 Subject: [PATCH] draft better media template --- Controller/ApiController.php | 112 ++++++++++++++++ Controller/BackendController.php | 124 +++++++++++++++--- Theme/Api/render.tpl.php | 5 + .../Backend/Components/Media/ElementView.php | 58 ++++++++ .../Media/{BaseView.php => ListView.php} | 2 +- Theme/Backend/Components/Media/audio.tpl.php | 8 ++ Theme/Backend/Components/Media/csv.tpl.php | 39 ++++++ .../Backend/Components/Media/default.tpl.php | 0 Theme/Backend/Components/Media/image.tpl.php | 7 + Theme/Backend/Components/Media/json.tpl.php | 0 .../Backend/Components/Media/markdown.tpl.php | 27 ++++ Theme/Backend/Components/Media/pdf.tpl.php | 22 ++++ .../Components/Media/powerpoint.tpl.php | 0 .../Components/Media/spreadsheet.tpl.php | 18 +++ Theme/Backend/Components/Media/text.tpl.php | 7 + Theme/Backend/Components/Media/video.tpl.php | 8 ++ Theme/Backend/Components/Media/word.tpl.php | 0 Theme/Backend/media-single.tpl.php | 13 +- 18 files changed, 427 insertions(+), 23 deletions(-) create mode 100644 Theme/Api/render.tpl.php create mode 100644 Theme/Backend/Components/Media/ElementView.php rename Theme/Backend/Components/Media/{BaseView.php => ListView.php} (97%) create mode 100644 Theme/Backend/Components/Media/audio.tpl.php create mode 100644 Theme/Backend/Components/Media/csv.tpl.php create mode 100644 Theme/Backend/Components/Media/default.tpl.php create mode 100644 Theme/Backend/Components/Media/image.tpl.php create mode 100644 Theme/Backend/Components/Media/json.tpl.php create mode 100644 Theme/Backend/Components/Media/markdown.tpl.php create mode 100644 Theme/Backend/Components/Media/pdf.tpl.php create mode 100644 Theme/Backend/Components/Media/powerpoint.tpl.php create mode 100644 Theme/Backend/Components/Media/spreadsheet.tpl.php create mode 100644 Theme/Backend/Components/Media/text.tpl.php create mode 100644 Theme/Backend/Components/Media/video.tpl.php create mode 100644 Theme/Backend/Components/Media/word.tpl.php diff --git a/Controller/ApiController.php b/Controller/ApiController.php index c123bd3..6368f44 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -512,4 +512,116 @@ final class ApiController extends Controller $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Media', 'Media successfully created.', $ids); } + + /** + * Routing end-point for application behaviour. + * + * @param HttpRequest $request Request + * @param HttpResponse $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiMediaExport(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + /** @var Media $media */ + $media = MediaMapper::get((int) $request->getData('id')); + + $view = $this->createView($media, $request, $response); + $this->setMediaResponseHeader($view, $media, $request, $response); + $view->setData('path', __DIR__ . '/../../../'); + + $response->set('export', $view); + } + + /** + * Set header for report/template + * + * @param View $view Media view + * @param string $name Template name + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + private function setMediaResponseHeader(View $view, Media $media, RequestAbstract $request, ResponseAbstract $response) : void + { + switch (\strtolower($media->extension)) { + case 'pdf': + $response->header->set('Content-Type', MimeType::M_PDF, true); + break; + case 'c': + case 'cpp': + case 'h': + case 'php': + case 'js': + case 'css': + case 'rs': + case 'py': + case 'r': + $response->header->set('Content-Type', MimeType::M_TXT, true); + break; + case 'txt': + case 'cfg': + case 'log': + $response->header->set('Content-Type', MimeType::M_TXT, true); + break; + case 'md': + $response->header->set('Content-Type', MimeType::M_TXT, true); + break; + case 'csv': + $response->header->set('Content-Type', MimeType::M_CSV, true); + break; + case 'xls': + $response->header->set('Content-Type', MimeType::M_XLS, true); + break; + case 'xlsx': + $response->header->set('Content-Type', MimeType::M_XLSX, true); + break; + case 'doc': + $response->header->set('Content-Type', MimeType::M_DOC, true); + break; + case 'docx': + $response->header->set('Content-Type', MimeType::M_DOCX, true); + break; + case 'ppt': + $response->header->set('Content-Type', MimeType::M_PPT, true); + break; + case 'pptx': + $response->header->set('Content-Type', MimeType::M_PPTX, true); + break; + case 'json': + $response->header->set('Content-Type', MimeType::M_CSV, true); + break; + case 'jpg': + case 'jpeg': + $response->header->set('Content-Type', MimeType::M_JPG, true); + break; + case 'gif': + $response->header->set('Content-Type', MimeType::M_GIF, true); + break; + case 'png': + $response->header->set('Content-Type', MimeType::M_PNG, true); + break; + case 'mp3': + $response->header->set('Content-Type', MimeType::M_MP3, true); + break; + case 'mp4': + $response->header->set('Content-Type', MimeType::M_MP4, true); + break; + case 'mpeg': + $response->header->set('Content-Type', MimeType::M_MPEG, true); + break; + default: + $response->header->set('Content-Type', MimeType::M_BIN, true); + } + } } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index e10173a..61145d8 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -21,6 +21,8 @@ use Modules\Media\Models\Media; use Modules\Media\Models\MediaMapper; use Modules\Media\Models\NullMedia; use Modules\Media\Views\MediaView; +use Modules\Media\Theme\Backend\Components\Media\ElementView; +use Modules\Media\Theme\Backend\Components\Media\ListView; use phpOMS\Contract\RenderableInterface; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; @@ -174,26 +176,11 @@ final class BackendController extends Controller $view->setTemplate('/Modules/Media/Theme/Backend/media-single'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000401001, $request, $response)); - $id = (int) $request->getData('id'); - $media = MediaMapper::get($id); - if ($media->extension === 'collection') { - $media = MediaMapper::getByVirtualPath( - $media->getVirtualPath() . ($media->getVirtualPath() !== '/' ? '/' : '') . $media->name - ); - - $collection = CollectionMapper::get((int) $request->getData('id')); - $media = \array_merge($media, $collection->getSources()); - - $view->addData('path', $collection->getVirtualPath() . '/' . $collection->name); - $view->setTemplate('/Modules/Media/Theme/Backend/media-list'); - } - - if ($id == 0) { + $id = $request->getData('id', 'int'); + if ($id === 0) { $path = \urldecode($request->getData('path')); - - if ($media instanceof NullMedia - && \is_file(__DIR__ . '/../Files' . $path) - ) { + $media = new NullMedia(); + if (\is_file(__DIR__ . '/../Files' . $path)) { $name = \explode('.', \basename($path)); $media->name = $name[0]; @@ -202,6 +189,32 @@ final class BackendController extends Controller $media->setPath('/Modules/Media/Files/' . \ltrim($path, '\\/')); $media->isAbsolute = false; } + } else { + $media = MediaMapper::get($id); + if ($media->extension === 'collection') { + $media = MediaMapper::getByVirtualPath( + $media->getVirtualPath() . ($media->getVirtualPath() !== '/' ? '/' : '') . $media->name + ); + + $collection = CollectionMapper::get($id); + $media = \array_merge($media, $collection->getSources()); + + $view->addData('path', $collection->getVirtualPath() . '/' . $collection->name); + $view->setTemplate('/Modules/Media/Theme/Backend/media-list'); + } else { + $sub = $request->getData('sub') ?? ''; + if (($media->extension === 'collection' + && !\is_file($media->getPath() . $sub)) + || (\is_dir($media->getPath()) + && (\is_dir($media->getPath() . $sub)) + )) { + $listView = new ListView($this->app->l11nManager, $request, $response); + $listView->setTemplate('/modules/Media/Theme/Backend/Components/Media/list'); + $view->addData('view', $listView); + } else { + $view->addData('view', $this->createMediaView($media, $request, $response)); + } + } } $view->addData('media', $media); @@ -209,6 +222,79 @@ final class BackendController extends Controller return $view; } + /** + * Create media view + * + * @param Media $media Media + * + * @return View + * + * @since 1.0.0 + */ + private function createMediaView(Media $media, RequestAbstract $request, ResponseAbstract $response) : View + { + $view = new ElementView($this->app->l11nManager, $request, $response); + switch (\strtolower($media->extension)) { + case 'pdf': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/pdf'); + break; + case 'c': + case 'cpp': + case 'h': + case 'php': + case 'js': + case 'css': + case 'rs': + case 'py': + case 'r': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/text'); + break; + case 'txt': + case 'cfg': + case 'log': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/text'); + break; + case 'md': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/markdown'); + break; + case 'csv': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/csv'); + break; + case 'xls': + case 'xlsx': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/spreadsheet'); + break; + case 'doc': + case 'docx': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/word'); + break; + case 'ppt': + case 'pptx': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/powerpoint'); + break; + case 'json': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/json'); + break; + case 'jpg': + case 'jpeg': + case 'gif': + case 'png': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/image'); + break; + case 'mp3': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/audio'); + break; + case 'mp4': + case 'mpeg': + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/video'); + break; + default: + $view->setTemplate('/Modules/Media/Theme/Backend/Components/Media/default'); + } + + return $view; + } + /** * Routing end-point for application behaviour. * diff --git a/Theme/Api/render.tpl.php b/Theme/Api/render.tpl.php new file mode 100644 index 0000000..44de2ec --- /dev/null +++ b/Theme/Api/render.tpl.php @@ -0,0 +1,5 @@ +media = $data[0]; + return parent::render(); + } +} diff --git a/Theme/Backend/Components/Media/BaseView.php b/Theme/Backend/Components/Media/ListView.php similarity index 97% rename from Theme/Backend/Components/Media/BaseView.php rename to Theme/Backend/Components/Media/ListView.php index 4ffdeae..c80903a 100755 --- a/Theme/Backend/Components/Media/BaseView.php +++ b/Theme/Backend/Components/Media/ListView.php @@ -28,7 +28,7 @@ use phpOMS\Views\View; * @since 1.0.0 * @codeCoverageIgnore */ -class BaseView extends View +class ListView extends View { /** * Media files diff --git a/Theme/Backend/Components/Media/audio.tpl.php b/Theme/Backend/Components/Media/audio.tpl.php new file mode 100644 index 0000000..2362971 --- /dev/null +++ b/Theme/Backend/Components/Media/audio.tpl.php @@ -0,0 +1,8 @@ +
+
+ +
+
\ No newline at end of file diff --git a/Theme/Backend/Components/Media/csv.tpl.php b/Theme/Backend/Components/Media/csv.tpl.php new file mode 100644 index 0000000..14b91f2 --- /dev/null +++ b/Theme/Backend/Components/Media/csv.tpl.php @@ -0,0 +1,39 @@ + +
+
+
+ +
+ +
+ media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath(), 'r'); + + echo ''; + $delim = CsvSettings::getFileDelimiter($f, 3); + while (($line = \fgetcsv($f, 0, $delim)) !== false) { + echo ''; + foreach ($line as $cell) { + echo '
' . \htmlspecialchars($cell); + } + } + + \fclose($f); + echo '
'; + ?> +
+ +
+
printHtml(
+                    $this->getFileContent(($this->media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath())
+                ); ?>
+
+
+
+
\ No newline at end of file diff --git a/Theme/Backend/Components/Media/default.tpl.php b/Theme/Backend/Components/Media/default.tpl.php new file mode 100644 index 0000000..e69de29 diff --git a/Theme/Backend/Components/Media/image.tpl.php b/Theme/Backend/Components/Media/image.tpl.php new file mode 100644 index 0000000..ea1c0e7 --- /dev/null +++ b/Theme/Backend/Components/Media/image.tpl.php @@ -0,0 +1,7 @@ +
+
+
+ <?= $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 new file mode 100644 index 0000000..e69de29 diff --git a/Theme/Backend/Components/Media/markdown.tpl.php b/Theme/Backend/Components/Media/markdown.tpl.php new file mode 100644 index 0000000..3479190 --- /dev/null +++ b/Theme/Backend/Components/Media/markdown.tpl.php @@ -0,0 +1,27 @@ + +
+
+
+ +
+ +
+
getFileContent(($this->media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath()) + ); ?>
+
+ +
+
printHtml(
+                    $this->getFileContent(($this->media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath())
+                ); ?>
+
+
+
+
\ No newline at end of file diff --git a/Theme/Backend/Components/Media/pdf.tpl.php b/Theme/Backend/Components/Media/pdf.tpl.php new file mode 100644 index 0000000..0f8aa10 --- /dev/null +++ b/Theme/Backend/Components/Media/pdf.tpl.php @@ -0,0 +1,22 @@ + + +
+
+ +
+
\ No newline at end of file diff --git a/Theme/Backend/Components/Media/powerpoint.tpl.php b/Theme/Backend/Components/Media/powerpoint.tpl.php new file mode 100644 index 0000000..e69de29 diff --git a/Theme/Backend/Components/Media/spreadsheet.tpl.php b/Theme/Backend/Components/Media/spreadsheet.tpl.php new file mode 100644 index 0000000..f541de8 --- /dev/null +++ b/Theme/Backend/Components/Media/spreadsheet.tpl.php @@ -0,0 +1,18 @@ +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(); +?> +
+
+ save('php://output'); ?> +
+
\ No newline at end of file diff --git a/Theme/Backend/Components/Media/text.tpl.php b/Theme/Backend/Components/Media/text.tpl.php new file mode 100644 index 0000000..0de3085 --- /dev/null +++ b/Theme/Backend/Components/Media/text.tpl.php @@ -0,0 +1,7 @@ +
+
+
printHtml(
+            $this->getFileContent(($this->media->isAbsolute ? '' : __DIR__ . '/../../../../../../') . $this->media->getPath())
+        ); ?>
+
+
\ No newline at end of file diff --git a/Theme/Backend/Components/Media/video.tpl.php b/Theme/Backend/Components/Media/video.tpl.php new file mode 100644 index 0000000..0dae646 --- /dev/null +++ b/Theme/Backend/Components/Media/video.tpl.php @@ -0,0 +1,8 @@ +
+
+ +
+
\ No newline at end of file diff --git a/Theme/Backend/Components/Media/word.tpl.php b/Theme/Backend/Components/Media/word.tpl.php new file mode 100644 index 0000000..e69de29 diff --git a/Theme/Backend/media-single.tpl.php b/Theme/Backend/media-single.tpl.php index 537824b..aa98cde 100755 --- a/Theme/Backend/media-single.tpl.php +++ b/Theme/Backend/media-single.tpl.php @@ -22,6 +22,7 @@ include __DIR__ . '/template-functions.php'; /** @var \Modules\Media\Models\Media $media */ $media = $this->getData('media'); +$view = $this->getData('view'); /** @var \Modules\Media\Views\MediaView $this */ echo $this->getData('nav')->render(); @@ -74,6 +75,13 @@ echo $this->getData('nav')->render(); +
+
+ render($media); ?> +
+
+ + - isAbsolute ? '' : __DIR__ . '/../../../../') . $media->getPath())) : ?>
@@ -180,4 +186,5 @@ echo $this->getData('nav')->render(); - \ No newline at end of file + +--> \ No newline at end of file