From 81fafbbc34c4c3289b4876c80cd7a7b2337d1032 Mon Sep 17 00:00:00 2001 From: Arber Sala Date: Fri, 12 Apr 2024 16:49:55 +0100 Subject: [PATCH] [FEATURE] added backend preview for form_formframework --- .../Classes/Hooks/FormPagePreviewRenderer.php | 175 ++++++++++++++++++ .../TCA/Overrides/tt_content.php | 2 + 2 files changed, 177 insertions(+) create mode 100644 local_packages/success/Classes/Hooks/FormPagePreviewRenderer.php diff --git a/local_packages/success/Classes/Hooks/FormPagePreviewRenderer.php b/local_packages/success/Classes/Hooks/FormPagePreviewRenderer.php new file mode 100644 index 0000000..314cc19 --- /dev/null +++ b/local_packages/success/Classes/Hooks/FormPagePreviewRenderer.php @@ -0,0 +1,175 @@ +getRecord(); + $itemContent = $this->linkEditContent('' . htmlspecialchars($item->getContext()->getContentTypeLabels()['form_formframework']) . '', $row) . '
'; + + $flexFormData = GeneralUtility::makeInstance(FlexFormService::class) + ->convertFlexFormContentToArray($row['pi_flexform']); + + $persistenceIdentifier = $flexFormData['settings']['persistenceIdentifier'] ?? ''; + if (!empty($persistenceIdentifier)) { + try { + $formPersistenceManager = GeneralUtility::makeInstance(FormPersistenceManagerInterface::class); + + try { + if ( + $formPersistenceManager->hasValidFileExtension($persistenceIdentifier) + || PathUtility::isExtensionPath($persistenceIdentifier) + ) { + $formDefinition = $formPersistenceManager->load($persistenceIdentifier); + $formLabel = $formDefinition['label']; + return $this->renderFormFromDefinition($formDefinition); + } else { + $formLabel = sprintf( + $this->getLanguageService()->sL(self::L10N_PREFIX . 'tt_content.preview.inaccessiblePersistenceIdentifier'), + $persistenceIdentifier + ); + } + } catch (ParseErrorException $e) { + $formLabel = sprintf( + $this->getLanguageService()->sL(self::L10N_PREFIX . 'tt_content.preview.invalidPersistenceIdentifier'), + $persistenceIdentifier + ); + } catch (PersistenceManagerException $e) { + $formLabel = sprintf( + $this->getLanguageService()->sL(self::L10N_PREFIX . 'tt_content.preview.inaccessiblePersistenceIdentifier'), + $persistenceIdentifier + ); + } catch (Exception $e) { + $formLabel = sprintf( + $this->getLanguageService()->sL(self::L10N_PREFIX . 'tt_content.preview.notExistingdPersistenceIdentifier'), + $persistenceIdentifier + ); + } + } catch (NoSuchFileException $e) { + $this->addInvalidFrameworkConfigurationFlashMessage($persistenceIdentifier, $e); + $formLabel = sprintf( + $this->getLanguageService()->sL(self::L10N_PREFIX . 'tt_content.preview.notExistingdPersistenceIdentifier'), + $persistenceIdentifier + ); + } catch (ParseErrorException $e) { + $this->addInvalidFrameworkConfigurationFlashMessage($persistenceIdentifier, $e); + $formLabel = sprintf( + $this->getLanguageService()->sL(self::L10N_PREFIX . 'tt_content.preview.invalidFrameworkConfiguration'), + $persistenceIdentifier + ); + } catch (\Exception $e) { + // Top level catch - FAL throws top level exceptions on missing files, eg. in getFileInfoByIdentifier() of LocalDriver + $this->addInvalidFrameworkConfigurationFlashMessage($persistenceIdentifier, $e); + $formLabel = sprintf( + $this->getLanguageService()->sL(self::L10N_PREFIX . 'tt_content.preview.invalidFrameworkConfiguration.text'), + $persistenceIdentifier, + $e->getMessage() + ); + } + } else { + $formLabel = $this->getLanguageService()->sL(self::L10N_PREFIX . 'tt_content.preview.noPersistenceIdentifier'); + } + + $itemContent .= $this->linkEditContent( + htmlspecialchars($formLabel), + $row + ) . '
'; + + return $itemContent; + } + + protected function addInvalidFrameworkConfigurationFlashMessage(string $persistenceIdentifier, \Exception $e): void + { + $messageText = sprintf( + $this->getLanguageService()->sL(self::L10N_PREFIX . 'tt_content.preview.invalidFrameworkConfiguration.text'), + $persistenceIdentifier, + $e->getMessage() + ); + + GeneralUtility::makeInstance(FlashMessageService::class) + ->getMessageQueueByIdentifier('core.template.flashMessages') + ->enqueue( + GeneralUtility::makeInstance( + FlashMessage::class, + $messageText, + $this->getLanguageService()->sL(self::L10N_PREFIX . 'tt_content.preview.invalidFrameworkConfiguration.title'), + ContextualFeedbackSeverity::ERROR, + true + ) + ); + } + + protected function renderFormFromDefinition(array $formDefinition): string + { + $finishers = $formDefinition['finishers']; + $pages = $formDefinition['renderables']; + $html = '
OverlineHeader

Subheader

'; + + foreach ($pages as $page) { + $html .= '
Page'; + foreach ($page['renderables'] as $item) { + $html .= '
' . $item['label'] . ': ' . $item['type'] . '
'; + } + $html .= '
'; + } + + $html .= '
Finishers: '; + + foreach ($finishers as $finisher) { + $html .= '
' . $finisher['identifier'] . '
 '; + } + + $html .= '
'; + + return $html; + } + + protected function getLanguageService(): LanguageService + { + return $GLOBALS['LANG']; + } + + function setLogger(LoggerInterface $logger): void + { + + } +} diff --git a/local_packages/success/Configuration/TCA/Overrides/tt_content.php b/local_packages/success/Configuration/TCA/Overrides/tt_content.php index 0b75b99..75099d2 100644 --- a/local_packages/success/Configuration/TCA/Overrides/tt_content.php +++ b/local_packages/success/Configuration/TCA/Overrides/tt_content.php @@ -736,3 +736,5 @@ ]; $GLOBALS['TCA']['tt_content']['ctrl']['typeicon_classes']['success_topbar'] = 'content-header'; + +$GLOBALS['TCA']['tt_content']['types']['form_formframework']['previewRenderer'] = \Surfcamp\Success\Hooks\FormPagePreviewRenderer::class;