From f1f9b8b3098ecb96cdf1d986fac4804dc4dbe0be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BCrk?= Date: Sat, 14 Dec 2024 21:50:32 +0100 Subject: [PATCH] [BUGFIX] Ender preview translated flag information in TYPO3 v12 TYPO3 v12 removed the `contentPostProc-all` aling with other hooks in favour of new PSR-14 `AfterCacheableContentIsGeneratedEvent`. The `DeeplPreviewFlagGeneratePageHook` is not called in TYPO3 v12 anymore and the translated preview flag is not displayed. Changed behavour between TYPO3 v11 and v12 was not intented and simply an oversight to mitigate when adding TYPO3 v12 support. Sadly, this has not been detected for quite a while now. This change introduces a event listener for the TYPO3 v12 event, rendering the same flag to restore the missing and wanted preview flag while keeping the hook implementation for TYPO3 v11 instances. Choosen strategy follows the recommended way to migrate from the hook to the event when dual TYPO3 version support is required. Used command(s): ```base Build/Scripts/runTests.sh -t 12 -p 8.1 -s composerUpdate Build/Scripts/runTests.sh -t 12 -p 8.1 -s phpstanGenerateBaseline ``` [1] https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/12.0/Breaking-97862-HooksRelatedToGeneratingPageContentRemoved.html [2] https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/12.0/Feature-97862-NewPSR-14EventsForManipulatingFrontendPageGenerationAndCacheBehaviour.html --- Build/phpstan/Core12/phpstan-baseline.neon | 5 -- Build/phpstan/Core12/phpstan.neon | 4 + ...derTranslatedFlagInFrontendPreviewMode.php | 77 +++++++++++++++++++ Configuration/Services.php | 13 ++++ ext_localconf.php | 9 ++- 5 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 Classes/Event/Listener/RenderTranslatedFlagInFrontendPreviewMode.php diff --git a/Build/phpstan/Core12/phpstan-baseline.neon b/Build/phpstan/Core12/phpstan-baseline.neon index c65db8c2..5e2a265a 100644 --- a/Build/phpstan/Core12/phpstan-baseline.neon +++ b/Build/phpstan/Core12/phpstan-baseline.neon @@ -60,11 +60,6 @@ parameters: count: 1 path: ../../../Classes/Hooks/ButtonBarHook.php - - - message: "#^There is no aspect \"frontend\\.preview\" configured so we can't figure out the exact type to return when calling TYPO3\\\\CMS\\\\Core\\\\Context\\\\Context\\:\\:getPropertyFromAspect$#" - count: 1 - path: ../../../Classes/Hooks/DeeplPreviewFlagGeneratePageHook.php - - message: "#^Parameter \\#1 \\$uid of method WebVision\\\\Deepltranslate\\\\Core\\\\Domain\\\\Repository\\\\GlossaryEntryRepository\\:\\:findEntryByUid\\(\\) expects int, int\\|string given\\.$#" count: 1 diff --git a/Build/phpstan/Core12/phpstan.neon b/Build/phpstan/Core12/phpstan.neon index 316d163a..85b91ad8 100644 --- a/Build/phpstan/Core12/phpstan.neon +++ b/Build/phpstan/Core12/phpstan.neon @@ -16,3 +16,7 @@ parameters: - ../../../.Build/* - ../../../Tests/Functional/Updates/Fixtures/Extension/test_extension/ext_emconf.php - ../../../Tests/Functional/Fixtures/Extensions/test_services_override/ext_emconf.php + + typo3: + contextApiGetAspectMapping: + 'frontend.preview': TYPO3\CMS\Frontend\Aspect\PreviewAspect diff --git a/Classes/Event/Listener/RenderTranslatedFlagInFrontendPreviewMode.php b/Classes/Event/Listener/RenderTranslatedFlagInFrontendPreviewMode.php new file mode 100644 index 00000000..eaffb0b0 --- /dev/null +++ b/Classes/Event/Listener/RenderTranslatedFlagInFrontendPreviewMode.php @@ -0,0 +1,77 @@ +getTypoScriptFrontendController($event); + $context = $controller->getContext(); + if ( + !$this->isInPreviewMode($context) + || $this->processWorkspacePreview($context) + || ($controller->config['config']['disablePreviewNotification'] ?? false) + || ( + isset($controller->page['tx_wvdeepltranslate_translated_time']) + && $controller->page['tx_wvdeepltranslate_translated_time'] === 0 + ) + ) { + // Preview flag must not be inserted. Return early. + return; + } + + $messagePreviewLabel = ($controller->config['config']['deepl_message_preview'] ?? '') + ?: 'Translated with DeepL'; + + $styles = []; + $styles[] = 'position: fixed'; + $styles[] = 'top: 65px'; + $styles[] = 'right: 15px'; + $styles[] = 'padding: 8px 18px'; + $styles[] = 'background: #006494'; + $styles[] = 'border: 1px solid #006494'; + $styles[] = 'font-family: sans-serif'; + $styles[] = 'font-size: 14px'; + $styles[] = 'font-weight: bold'; + $styles[] = 'color: #fff'; + $styles[] = 'z-index: 20000'; + $styles[] = 'user-select: none'; + $styles[] = 'pointer-events: none'; + $styles[] = 'text-align: center'; + $styles[] = 'border-radius: 2px'; + $message = '
' . htmlspecialchars($messagePreviewLabel) . '
'; + + $controller->content = str_ireplace('', $message . '', $controller->content); + } + + private function isInPreviewMode(Context $context): bool + { + return $context->hasAspect('frontend.preview') + && $context->getPropertyFromAspect('frontend.preview', 'isPreview', false); + } + + private function processWorkspacePreview(Context $context): bool + { + return $context->hasAspect('workspace') + && $context->getPropertyFromAspect('workspace', 'isOffline', false); + } + + private function getTypoScriptFrontendController(AfterCacheableContentIsGeneratedEvent $event): TypoScriptFrontendController + { + return $event->getController(); + } +} diff --git a/Configuration/Services.php b/Configuration/Services.php index 84366ade..d122d354 100644 --- a/Configuration/Services.php +++ b/Configuration/Services.php @@ -19,6 +19,7 @@ use WebVision\Deepltranslate\Core\Controller\Backend\AjaxController; use WebVision\Deepltranslate\Core\Controller\GlossarySyncController; use WebVision\Deepltranslate\Core\Event\Listener\GlossarySyncButtonProvider; +use WebVision\Deepltranslate\Core\Event\Listener\RenderTranslatedFlagInFrontendPreviewMode; use WebVision\Deepltranslate\Core\Event\Listener\UsageToolBarEventListener; use WebVision\Deepltranslate\Core\Form\Item\SiteConfigSupportedLanguageItemsProcFunc; use WebVision\Deepltranslate\Core\Form\User\HasFormalitySupport; @@ -161,6 +162,18 @@ ] ); + if ((new Typo3Version())->getMajorVersion() >= 12) { + // @todo Unnest this in next major when TYPO3 v11 support has been removed. + $services + ->set(RenderTranslatedFlagInFrontendPreviewMode::class) + ->tag( + 'event.listener', + [ + 'identifier' => 'deepltranslate-core/render-translated-flag-in-frontend-preview-mode', + ] + ); + } + /** * Check if WidgetRegistry is defined, which means that EXT:dashboard is available. * Registration directly in Services.yaml will break without EXT:dashboard installed! diff --git a/ext_localconf.php b/ext_localconf.php index 0ffb892b..76dff73f 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -3,6 +3,8 @@ defined('TYPO3') or die(); (static function (): void { + $typo3version = new \TYPO3\CMS\Core\Information\Typo3Version(); + //allowLanguageSynchronizationHook manipulates l10n_state $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = \WebVision\Deepltranslate\Core\Hooks\AllowLanguageSynchronizationHook::class; @@ -24,8 +26,11 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['checkModifyAccessList']['deepl'] = \WebVision\Deepltranslate\Core\Hooks\TCEmainHook::class; - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-all']['deepl-1675946132'] = - \WebVision\Deepltranslate\Core\Hooks\DeeplPreviewFlagGeneratePageHook::class . '->renderDeeplPreviewFlag'; + if ($typo3version->getMajorVersion() < 12) { + // @todo Remove when TYPO3 v11 support is removed. + $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-all']['deepl-1675946132'] = + \WebVision\WvDeepltranslate\Hooks\DeeplPreviewFlagGeneratePageHook::class . '->renderDeeplPreviewFlag'; + } //xclass localizationcontroller for localizeRecords() and process() action $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][\TYPO3\CMS\Backend\Controller\Page\LocalizationController::class] = [