From 7d0b79c23ce69594de9204ac9b797196dfee15d6 Mon Sep 17 00:00:00 2001 From: Markus Weigelt Date: Tue, 3 Dec 2024 17:13:06 +0100 Subject: [PATCH 1/6] Add tool to select available 3d viewers to render model --- Classes/Controller/ToolboxController.php | 86 +++++++++++++++++-- Resources/Private/Templates/Toolbox/Main.html | 12 +++ 2 files changed, 90 insertions(+), 8 deletions(-) diff --git a/Classes/Controller/ToolboxController.php b/Classes/Controller/ToolboxController.php index cb93c6d62..59e2d4535 100644 --- a/Classes/Controller/ToolboxController.php +++ b/Classes/Controller/ToolboxController.php @@ -13,9 +13,14 @@ use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Common\Helper; +use Kitodo\Dlf\Middleware\Embedded3dViewer; use Psr\Http\Message\ResponseInterface; +use TYPO3\CMS\Core\Configuration\Loader\YamlFileLoader; +use TYPO3\CMS\Core\Resource\Exception\InsufficientFolderAccessPermissionsException; +use TYPO3\CMS\Core\Resource\StorageRepository; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; +use TYPO3\CMS\Core\Utility\PathUtility; /** * Controller class for plugin 'Toolbox'. @@ -108,6 +113,10 @@ private function renderTools(): void case 'scoretool': $this->renderToolByName('renderScoreTool'); break; + case 'tx_dlf_viewerselectiontool': + case 'viewerselectiontool': + $this->renderToolByName('renderViewerSelectionTool'); + break; default: $this->logger->warning('Incorrect tool configuration: "' . $this->settings['tools'] . '". Tool "' . $tool . '" does not exist.'); } @@ -130,6 +139,30 @@ private function renderToolByName(string $tool): void $this->view->assign($tool, true); } + /** + * Get the URL of the model. + * + * Gets the URL of the model by parameter or from the configured file group of the document. + * + * @access private + * + * @return string + */ + private function getModelUrl(): string + { + $modelUrl = ''; + if (!empty($this->requestData['model'])) { + $modelUrl = $this->requestData['model']; + } elseif (!($this->isDocMissingOrEmpty() || empty($this->settings['fileGrpsModelDownload']))) { + $this->setPage(); + if (isset($this->requestData['page'])) { + $file = $this->getFile($this->requestData['page'], GeneralUtility::trimExplode(',', $this->settings['fileGrpsModelDownload'])); + $modelUrl = $file['url'] ?? ''; + } + } + return $modelUrl; + } + /** * Get image's URL and MIME type information's. * @@ -362,18 +395,55 @@ private function renderImageManipulationTool(): void */ private function renderModelDownloadTool(): void { - if ( - $this->isDocMissingOrEmpty() - || empty($this->settings['fileGrpsModelDownload']) - ) { - // Quit without doing anything if required variables are not set. + $modelUrl = $this->getModelUrl(); + if ($modelUrl) { + $this->logger->debug("Model URL could not be determined"); return; } + $this->view->assign('modelDownloadUrl', $modelUrl); + } - $this->setPage(); - if (isset($this->requestData['page'])) { - $this->view->assign('modelDownload', $this->getFile($this->requestData['page'], GeneralUtility::trimExplode(',', $this->settings['fileGrpsModelDownload']))); + /** + * Renders the viewer selection tool + * Renders the viewer selection tool (used in template) + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) + * + * @access private + * + * @return void + * @throws InsufficientFolderAccessPermissionsException + */ + private function renderViewerSelectionTool(): void + { + $model = $this->getModelUrl(); + if (!$model) { + $this->logger->debug("Model URL could not be determined"); + return; + } + + $pathInfo = PathUtility::pathinfo($model); + $modelFormat = strtolower($pathInfo["extension"]); + $viewers = []; + /** @var StorageRepository $storageRepository */ + $storageRepository = GeneralUtility::makeInstance(StorageRepository::class); + $defaultStorage = $storageRepository->getDefaultStorage(); + if ($defaultStorage->hasFolder(Embedded3dViewer::VIEWER_FOLDER)) { + $viewerFolders = $defaultStorage->getFoldersInFolder($defaultStorage->getFolder(Embedded3dViewer::VIEWER_FOLDER)); + if (count($viewerFolders) > 0) { + /** @var YamlFileLoader $yamlFileLoader */ + $yamlFileLoader = GeneralUtility::makeInstance(YamlFileLoader::class); + foreach ($viewerFolders as $viewerFolder) { + if ($viewerFolder->hasFile(Embedded3dViewer::VIEWER_CONFIG_YML)) { + $fileIdentifier = $viewerFolder->getFile(Embedded3dViewer::VIEWER_CONFIG_YML)->getIdentifier(); + $viewerConfig = $yamlFileLoader->load($defaultStorage->getName() . $fileIdentifier)["viewer"]; + if (!empty($viewerConfig["supportedModelFormats"]) && in_array($modelFormat, array_map('strtolower', $viewerConfig["supportedModelFormats"]))) { + $viewers[] = (object)['id' => $viewerFolder->getName(), 'name' => $viewerConfig["name"] ?? $viewerFolder->getName()]; + } + } + } + $this->view->assign('viewers', $viewers); + } } } diff --git a/Resources/Private/Templates/Toolbox/Main.html b/Resources/Private/Templates/Toolbox/Main.html index cb934f7b3..0d94a9d68 100644 --- a/Resources/Private/Templates/Toolbox/Main.html +++ b/Resources/Private/Templates/Toolbox/Main.html @@ -87,6 +87,18 @@ + + + + + + +
  • From 1bf71ce8d7ab8c6e03250ab515343c687041cbd5 Mon Sep 17 00:00:00 2001 From: Markus Weigelt Date: Tue, 3 Dec 2024 18:12:32 +0100 Subject: [PATCH 2/6] Add message for default viewer --- Resources/Private/Language/de.locallang.xlf | 4 ++++ Resources/Private/Language/locallang.xlf | 3 +++ 2 files changed, 7 insertions(+) diff --git a/Resources/Private/Language/de.locallang.xlf b/Resources/Private/Language/de.locallang.xlf index d1b7392a9..35e461974 100644 --- a/Resources/Private/Language/de.locallang.xlf +++ b/Resources/Private/Language/de.locallang.xlf @@ -461,6 +461,10 @@ + + + + diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf index d1901621e..737c34de8 100644 --- a/Resources/Private/Language/locallang.xlf +++ b/Resources/Private/Language/locallang.xlf @@ -257,6 +257,9 @@ + + + From acb0900c9c73bee80523ead8f26342796e8d86f0 Mon Sep 17 00:00:00 2001 From: Markus Weigelt Date: Tue, 3 Dec 2024 18:17:00 +0100 Subject: [PATCH 3/6] Add viewer selection tool and improve model download --- Resources/Private/Templates/Toolbox/Main.html | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/Resources/Private/Templates/Toolbox/Main.html b/Resources/Private/Templates/Toolbox/Main.html index 0d94a9d68..64cb963a5 100644 --- a/Resources/Private/Templates/Toolbox/Main.html +++ b/Resources/Private/Templates/Toolbox/Main.html @@ -75,27 +75,36 @@ - +
  • - - - - - + + + + +
  • - - +
    + + + + + + + + + From 5198826b3cff9870ad30ab3b4bab2b6862c04064 Mon Sep 17 00:00:00 2001 From: Markus Weigelt Date: Wed, 4 Dec 2024 14:31:19 +0100 Subject: [PATCH 4/6] Update documentation and tiny refactoring --- Classes/Controller/ToolboxController.php | 2 +- Documentation/Developers/Embedded3DViewer.rst | 6 ++- Documentation/Plugins/Index.rst | 54 +++++++++++++++++++ Resources/Private/Templates/Toolbox/Main.html | 4 +- 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/Classes/Controller/ToolboxController.php b/Classes/Controller/ToolboxController.php index 59e2d4535..428ee2d96 100644 --- a/Classes/Controller/ToolboxController.php +++ b/Classes/Controller/ToolboxController.php @@ -400,7 +400,7 @@ private function renderModelDownloadTool(): void $this->logger->debug("Model URL could not be determined"); return; } - $this->view->assign('modelDownloadUrl', $modelUrl); + $this->view->assign('modelUrl', $modelUrl); } diff --git a/Documentation/Developers/Embedded3DViewer.rst b/Documentation/Developers/Embedded3DViewer.rst index 86dc83c77..6a195d90e 100644 --- a/Documentation/Developers/Embedded3DViewer.rst +++ b/Documentation/Developers/Embedded3DViewer.rst @@ -8,6 +8,8 @@ The `model-viewer `_ is installed as the build-in stand :local: :depth: 2 +.. _Embedded 3D Viewer Setup: + Setup ======= @@ -25,11 +27,13 @@ Configuration By default, the viewers from the folder ``dlf_3d_viewers`` are all active and can be accessed and tested via URL. -For this, only the parameter ``tx_dlf[viewer]`` with the name of the viewer and the encoded URL to the model via the parameter ``tx_dlf[model]`` need to be passed to the URL under which the plugin ``plugin.tx_dlf_embedded3dViewer`` is rendered. +For this, only the parameter ``tx_dlf[viewer]`` with the encoded subfolder name of the viewer needs to be passed to the URL where the plugin ``plugin.tx_dlf_embedded3dViewer`` is rendered. .. note:: For example in the DFG Viewer, this is the page whose ID is set via the constant ``config.kitodoPageView``. +To render the model, the encoded URL to the METS document should be set using the parameter ``tx_dlf[id]``. Alternatively, it is possible to define the model directly with an encoded URL via the parameter ``tx_dlf[model]``. + Automatic selection of the viewer ------- diff --git a/Documentation/Plugins/Index.rst b/Documentation/Plugins/Index.rst index b2b898218..f8503e33f 100644 --- a/Documentation/Plugins/Index.rst +++ b/Documentation/Plugins/Index.rst @@ -1024,6 +1024,60 @@ The fulltext is fetched and rendered by JavaScript into the `
    - +
  • - + From 6860751445f63a617450d9085ce6008a1cff761b Mon Sep 17 00:00:00 2001 From: Markus Weigelt Date: Thu, 5 Dec 2024 15:54:28 +0100 Subject: [PATCH 5/6] Space after cast statement --- Classes/Controller/ToolboxController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/Controller/ToolboxController.php b/Classes/Controller/ToolboxController.php index 428ee2d96..7c1224dd8 100644 --- a/Classes/Controller/ToolboxController.php +++ b/Classes/Controller/ToolboxController.php @@ -438,7 +438,7 @@ private function renderViewerSelectionTool(): void $fileIdentifier = $viewerFolder->getFile(Embedded3dViewer::VIEWER_CONFIG_YML)->getIdentifier(); $viewerConfig = $yamlFileLoader->load($defaultStorage->getName() . $fileIdentifier)["viewer"]; if (!empty($viewerConfig["supportedModelFormats"]) && in_array($modelFormat, array_map('strtolower', $viewerConfig["supportedModelFormats"]))) { - $viewers[] = (object)['id' => $viewerFolder->getName(), 'name' => $viewerConfig["name"] ?? $viewerFolder->getName()]; + $viewers[] = (object) ['id' => $viewerFolder->getName(), 'name' => $viewerConfig["name"] ?? $viewerFolder->getName()]; } } } From d67d750cf8cb5d13df808c40eb60261eaf7576fd Mon Sep 17 00:00:00 2001 From: Markus Weigelt Date: Fri, 10 Jan 2025 11:31:10 +0100 Subject: [PATCH 6/6] Update Classes/Controller/ToolboxController.php Co-authored-by: Sebastian Meyer --- Classes/Controller/ToolboxController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/Controller/ToolboxController.php b/Classes/Controller/ToolboxController.php index 7c1224dd8..3656ae136 100644 --- a/Classes/Controller/ToolboxController.php +++ b/Classes/Controller/ToolboxController.php @@ -396,7 +396,7 @@ private function renderImageManipulationTool(): void private function renderModelDownloadTool(): void { $modelUrl = $this->getModelUrl(); - if ($modelUrl) { + if ($modelUrl === '') { $this->logger->debug("Model URL could not be determined"); return; }