From 34197fe8a7edf4f51b488ea9931555beaf32f32d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Ku=C3=9Fmann?= Date: Wed, 31 Jul 2024 11:01:33 +0200 Subject: [PATCH] chore: preparations for typo3 v12 --- .code-quality/phpstan-baseline.neon | 24 ------- .code-quality/phpstan.neon | 5 +- Classes/Backend/Utility/HookUtility.php | 54 -------------- Classes/Bootstrap/Typo3Configurator.php | 27 +++++++ .../Scraper/Html/AbstractHtmlScraper.php | 12 ---- Classes/Content/Scraper/Html/Image.php | 9 +++ Classes/Middleware/ContentPostProcAll.php | 9 ++- Classes/System/Configuration/Provider.php | 7 -- .../Configuration/TypoScriptConfiguration.php | 21 +++++- Classes/System/Log/Logger.php | 17 ----- Classes/Typo3/Hook/AbstractHook.php | 66 ------------------ Classes/Typo3/Hook/ContentPostProcAll.php | 58 --------------- Configuration/Services.yaml | 8 +++ .../AdministratorManual/AsdisConfig1.png | Bin 30845 -> 0 bytes Documentation/Pages/AdministratorManual.rst | 19 ----- Tests/Content/Scraper/Html/ImageTest.php | 4 +- composer.json | 4 +- ext_conf_template.txt | 2 - ext_emconf.php | 4 +- ext_localconf.php | 6 -- 20 files changed, 80 insertions(+), 276 deletions(-) delete mode 100644 Classes/Backend/Utility/HookUtility.php create mode 100644 Classes/Bootstrap/Typo3Configurator.php delete mode 100644 Classes/Typo3/Hook/AbstractHook.php delete mode 100644 Classes/Typo3/Hook/ContentPostProcAll.php delete mode 100644 Documentation/Images/AdministratorManual/AsdisConfig1.png delete mode 100644 ext_conf_template.txt diff --git a/.code-quality/phpstan-baseline.neon b/.code-quality/phpstan-baseline.neon index e8005e0d4..c6a8535a8 100644 --- a/.code-quality/phpstan-baseline.neon +++ b/.code-quality/phpstan-baseline.neon @@ -8,14 +8,6 @@ parameters: message: "#^Comparison operation \"\\<\" between int\\<1, max\\> and 1 is always false\\.$#" count: 1 path: ../Classes/System/Configuration/TypoScriptConfiguration.php - - - message: "#^Call to an undefined static method TYPO3\\\\CMS\\\\Core\\\\Utility\\\\GeneralUtility\\:\\:sysLog\\(\\)\\.$#" - count: 1 - path: ../Classes/System/Log/Logger.php - - - message: "#^Relative file path \"tslib/class\\.tslib_fe\\.php\" is not allowed, use absolute one with __DIR__$#" - count: 4 - path: ../Classes/Backend/Utility/HookUtility.php - message: "#^Use value object over return of values$#" count: 2 @@ -28,26 +20,10 @@ parameters: message: "#^Anonymous variable in a `\\$GLOBALS\\['TYPO3_REQUEST'\\]\\-\\>\\.\\.\\.\\(\\)` method call can lead to false dead methods\\. Make sure the variable type is known$#" count: 1 path: ../Classes/System/Configuration/TypoScriptConfiguration.php - - - message: "#^Anonymous variables in a \"\\$GLOBALS\\['TSFE'\\]\\-\\>\\.\\.\\.\" property fetch can lead to false dead property\\. Make sure the variable type is known$#" - count: 1 - path: ../Classes/System/Configuration/TypoScriptConfiguration.php - - - message: "#^Anonymous variables in a \"\\$GLOBALS\\['TSFE'\\]\\-\\>tmpl\\-\\>\\.\\.\\.\" property fetch can lead to false dead property\\. Make sure the variable type is known$#" - count: 1 - path: ../Classes/System/Configuration/TypoScriptConfiguration.php - - - message: "#^Anonymous variable in a `\\$GLOBALS\\['TSFE'\\]\\-\\>\\.\\.\\.\\(\\)` method call can lead to false dead methods\\. Make sure the variable type is known$#" - count: 2 - path: ../Classes/Typo3/Hook/ContentPostProcAll.php - message: "#^Anonymous variable in a `\\$this\\[\\$found\\]\\-\\>\\.\\.\\.\\(\\)` method call can lead to false dead methods\\. Make sure the variable type is known$#" count: 3 path: ../Classes/Domain/Model/Asset/Collection.php - - - message: "#^On passing a constant, the method should have an enum type\\. See https\\://phpstan\\.org/writing\\-php\\-code/phpdoc\\-types\\#literals\\-and\\-constants$#" - count: 1 - path: ../Classes/Api/Url.php - message: "#^Unable to resolve the template type T in call to method static method TYPO3\\\\CMS\\\\Core\\\\Utility\\\\GeneralUtility\\:\\:makeInstance\\(\\)$#" count: 1 diff --git a/.code-quality/phpstan.neon b/.code-quality/phpstan.neon index 22d8534ca..264032be9 100644 --- a/.code-quality/phpstan.neon +++ b/.code-quality/phpstan.neon @@ -8,9 +8,10 @@ parameters: paths: - "../Classes/" + ignoreErrors: + - identifier: missingType.iterableValue + - identifier: missingType.generics inferPrivatePropertyTypeFromConstructor: true - checkMissingIterableValueType: false - checkGenericClassInNonGenericObjectType: false services: - diff --git a/Classes/Backend/Utility/HookUtility.php b/Classes/Backend/Utility/HookUtility.php deleted file mode 100644 index 66d98f1fd..000000000 --- a/Classes/Backend/Utility/HookUtility.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * All rights reserved - * - * This script is part of the TYPO3 project. The TYPO3 project is - * free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * The GNU General Public License can be found at - * http://www.gnu.org/copyleft/gpl.html. - * - * This script is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * This copyright notice MUST APPEAR in all copies of the script! - ***************************************************************/ - -class HookUtility -{ - /** - * Register hooks - */ - public static function registerHooks(): void - { - $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['asdis']); - switch ($extConf['hook']) { - case 'contentPostProc-all': - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-all'][] = ContentPostProcAll::class . '->process'; - break; - case 'contentPostProc-output': - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-output'][] = ContentPostProcAll::class . '->process'; - break; - case 'contentPostProc-all_and_output': - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-all'][] = ContentPostProcAll::class . '->processCache'; - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-output'][] = ContentPostProcAll::class . '->processNoCache'; - break; - } - - unset($extConf); - } -} diff --git a/Classes/Bootstrap/Typo3Configurator.php b/Classes/Bootstrap/Typo3Configurator.php new file mode 100644 index 000000000..2083ac36d --- /dev/null +++ b/Classes/Bootstrap/Typo3Configurator.php @@ -0,0 +1,27 @@ +')) { + /** + * We must force templateParsing - otherwise the TypoScript (which configures this + * extension) is not available in the frontend, so we can't get the TypoScript here: + * @see \Aoe\Asdis\System\Configuration\TypoScriptConfiguration::getTypoScriptConfigurationArray + */ + $context = GeneralUtility::makeInstance(Context::class); + $context->setAspect('typoscript', GeneralUtility::makeInstance(TypoScriptAspect::class, true)); + } + } +} diff --git a/Classes/Content/Scraper/Html/AbstractHtmlScraper.php b/Classes/Content/Scraper/Html/AbstractHtmlScraper.php index 2bbde5a74..3e0a7bd2e 100644 --- a/Classes/Content/Scraper/Html/AbstractHtmlScraper.php +++ b/Classes/Content/Scraper/Html/AbstractHtmlScraper.php @@ -21,18 +21,6 @@ public function __construct(XmlTagAttribute $xmlTagAttributeExtractor, Factory $ $this->assetFactory = $assetFactory; } - /* - public function injectXmlTagAttributeExtractor(XmlTagAttribute $xmlTagAttributeExtractor): void - { - $this->xmlTagAttributeExtractor = $xmlTagAttributeExtractor; - } - - public function injectAssetFactory(Factory $assetFactory): void - { - $this->assetFactory = $assetFactory; - } - */ - protected function getAssets(string $tagName, string $attributeName, string $content, array $requiredOtherAttributes = []): ?Collection { $attributes = $this->xmlTagAttributeExtractor->getAttributeFromTag( diff --git a/Classes/Content/Scraper/Html/Image.php b/Classes/Content/Scraper/Html/Image.php index 35d637ee2..c1dee39da 100644 --- a/Classes/Content/Scraper/Html/Image.php +++ b/Classes/Content/Scraper/Html/Image.php @@ -17,6 +17,15 @@ public function scrape(string $content): ?Collection ->merge($this->getAssets('image', 'href', $content)) ->merge($this->getAssets('link', 'href', $content, [ 'type' => 'image/gif', + ])) + ->merge($this->getAssets('link', 'href', $content, [ + 'type' => 'image/webp', + ])) + ->merge($this->getAssets('link', 'href', $content, [ + 'type' => 'image/png', + ])) + ->merge($this->getAssets('link', 'href', $content, [ + 'type' => 'image/jpeg', ])); } } diff --git a/Classes/Middleware/ContentPostProcAll.php b/Classes/Middleware/ContentPostProcAll.php index 0f0abe5db..43633b416 100644 --- a/Classes/Middleware/ContentPostProcAll.php +++ b/Classes/Middleware/ContentPostProcAll.php @@ -45,7 +45,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $status = $response->getStatusCode(); try { - $this->setPageObject($GLOBALS['TSFE']); + $this->setPageObject($this->getTsfe()); $this->scrapeAndReplace(); $header['Content-Length'] = strlen($this->page->getPageObject()->content); @@ -58,6 +58,13 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface return $response; } + protected function getTsfe(): TypoScriptFrontendController + { + /** @var ServerRequestInterface $typo3Request */ + $typo3Request = $GLOBALS['TYPO3_REQUEST']; + return $typo3Request->getAttribute('frontend.controller'); + } + protected function scrapeAssets(): void { $this->page->scrapeAssets(); diff --git a/Classes/System/Configuration/Provider.php b/Classes/System/Configuration/Provider.php index daf48ff76..1189d7215 100644 --- a/Classes/System/Configuration/Provider.php +++ b/Classes/System/Configuration/Provider.php @@ -16,13 +16,6 @@ public function __construct(TypoScriptConfiguration $typoScriptConfiguration) $this->typoScriptConfiguration = $typoScriptConfiguration; } - /* - public function injectTypoScriptConfiguration(TypoScriptConfiguration $typoScriptConfiguration): void - { - $this->typoScriptConfiguration = $typoScriptConfiguration; - } - */ - /** * Tells if the assets on the current page should be replaced. */ diff --git a/Classes/System/Configuration/TypoScriptConfiguration.php b/Classes/System/Configuration/TypoScriptConfiguration.php index 8d08d0d39..12a619cd2 100644 --- a/Classes/System/Configuration/TypoScriptConfiguration.php +++ b/Classes/System/Configuration/TypoScriptConfiguration.php @@ -5,9 +5,11 @@ use Aoe\Asdis\System\Configuration\Exception\InvalidTypoScriptSetting; use Aoe\Asdis\System\Configuration\Exception\SiteNotFoundException; use Aoe\Asdis\System\Configuration\Exception\TypoScriptSettingNotExists; +use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Core\SingletonInterface; use TYPO3\CMS\Core\Site\Entity\Site; use TYPO3\CMS\Core\Site\SiteFinder; +use TYPO3\CMS\Core\TypoScript\FrontendTypoScript; use TYPO3\CMS\Core\TypoScript\TemplateService; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\RootlineUtility; @@ -69,10 +71,25 @@ public function getSetting($key, $validateType = '', $hasSubkeys = false) */ protected function getTypoScriptConfigurationArray() { - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.5.0', '<')) { - return $GLOBALS['TSFE']->tmpl->setup['config.']['tx_asdis.']; + if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '12.4.0', '>')) { + if (isset($GLOBALS['TYPO3_REQUEST']) && + $GLOBALS['TYPO3_REQUEST'] instanceof ServerRequestInterface && + $GLOBALS['TYPO3_REQUEST']->getAttribute('frontend.typoscript') instanceof FrontendTypoScript) { + /** + * We can get the TypoScript in the frontend, because we force templateParsing (without + * forcing of templateParsing, we can't get the complete TypoScript in frontend) here: + * @see \Aoe\Asdis\Bootstrap\Typo3Configurator::forceTemplateParsingInFrontend + */ + $fullTypoScript = $GLOBALS['TYPO3_REQUEST']->getAttribute('frontend.typoscript')->getSetupArray(); + return $fullTypoScript['config.']['tx_asdis.']; + } + + return []; } + /** + * This code is for TYPO3v11 - we can remove it, when we don't support TYPO3v11 anymore! + */ $site = $this->getCurrentSite(); /** @var RootlineUtility $rootlineUtility */ diff --git a/Classes/System/Log/Logger.php b/Classes/System/Log/Logger.php index 181d452da..975a0d790 100644 --- a/Classes/System/Log/Logger.php +++ b/Classes/System/Log/Logger.php @@ -7,7 +7,6 @@ use TYPO3\CMS\Core\Log\LogManager; use TYPO3\CMS\Core\SingletonInterface; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\VersionNumberUtility; /** * System logger. @@ -18,26 +17,10 @@ class Logger implements SingletonInterface public function logException(string $context, Exception $e): void { - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.5.0', '<')) { - $this->syslog( - 'Exception occured ' . PHP_EOL . - ' Code: ' . $e->getCode() . PHP_EOL . - ' Message: "' . $e->getMessage() . '"' . PHP_EOL . - ' Trace:' . PHP_EOL . $e->getTraceAsString(), - 4 - ); - return; - } - $this->logger = GeneralUtility::makeInstance(LogManager::class)->getLogger(self::class); $this->logger->error( $context . ': ' . $e->getMessage(), $e->getTrace() ); } - - private function syslog(string $message, int $severity): void - { - GeneralUtility::sysLog($message, 'asdis', $severity); - } } diff --git a/Classes/Typo3/Hook/AbstractHook.php b/Classes/Typo3/Hook/AbstractHook.php deleted file mode 100644 index b4ab27714..000000000 --- a/Classes/Typo3/Hook/AbstractHook.php +++ /dev/null @@ -1,66 +0,0 @@ -configurationProvider = GeneralUtility::makeInstance(Provider::class); - $this->logger = GeneralUtility::makeInstance(Logger::class); - } - - protected function getConfigurationProvider(): Provider - { - return $this->configurationProvider; - } - - protected function getLogger(): Logger - { - return $this->logger; - } - - protected function scrapeAssets(): void - { - $this->page->scrapeAssets(); - } - - protected function replaceAssets(): void - { - $this->page->replaceAssets(); - } - - /** - * Scrapes and replaces the assets of the current page. - */ - protected function scrapeAndReplace(): void - { - $this->scrapeAssets(); - $this->replaceAssets(); - } - - protected function setPageObject(TypoScriptFrontendController $pObj): void - { - /** @var Page $page */ - $page = GeneralUtility::makeInstance(Page::class); - $page->setAssets(GeneralUtility::makeInstance(Collection::class)); - $page->setPageObject($pObj); - $this->page = $page; - } -} diff --git a/Classes/Typo3/Hook/ContentPostProcAll.php b/Classes/Typo3/Hook/ContentPostProcAll.php deleted file mode 100644 index ea456a51d..000000000 --- a/Classes/Typo3/Hook/ContentPostProcAll.php +++ /dev/null @@ -1,58 +0,0 @@ -getConfigurationProvider()->isDefaultHookHandlingDisabled()) { - return; - } - - if ($pObj === null) { - if (isset($params['pObj']) && ($params['pObj'] instanceof TypoScriptFrontendController)) { - $pObj = $params['pObj']; - } else { - $pObj = $GLOBALS['TSFE']; - } - } - - try { - $this->setPageObject($pObj); - $this->scrapeAndReplace(); - } catch (Exception $exception) { - $this->getLogger() - ->logException(__METHOD__, $exception); - } - } - - /** - * Call main process hook function only if there are no INTincScripts to include. - * This function is called as contentPostProc-all hook. - */ - public function processCache(array &$params, TypoScriptFrontendController $pObj = null): void - { - if ($GLOBALS['TSFE']->isINTincScript()) { - return; - } - - $this->process($params, $pObj); - } - - /** - * Call main process hook function only if there are INTincScripts to include. - * This function is called as contentPostProc-output hook. - */ - public function processNoCache(array &$params, TypoScriptFrontendController $pObj = null): void - { - if (!$GLOBALS['TSFE']->isINTincScript()) { - return; - } - - $this->process($params, $pObj); - } -} diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml index 4546f71d8..677c5fd15 100644 --- a/Configuration/Services.yaml +++ b/Configuration/Services.yaml @@ -57,3 +57,11 @@ services: Aoe\Asdis\Content\Scraper\Html\Srcset: public: true + + # EventListeners + Aoe\Asdis\Bootstrap\Typo3Configurator: + tags: + - name: event.listener + identifier: 'asdis/typo3-configurator' + method: 'forceTemplateParsingInFrontend' + event: TYPO3\CMS\Core\Core\Event\BootCompletedEvent \ No newline at end of file diff --git a/Documentation/Images/AdministratorManual/AsdisConfig1.png b/Documentation/Images/AdministratorManual/AsdisConfig1.png deleted file mode 100644 index ce28dc45f17c226b9d39ed72856d06a2b42768d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30845 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 diff --git a/Documentation/Pages/AdministratorManual.rst b/Documentation/Pages/AdministratorManual.rst index aff613cfd..7092d150c 100644 --- a/Documentation/Pages/AdministratorManual.rst +++ b/Documentation/Pages/AdministratorManual.rst @@ -6,25 +6,6 @@ .. include:: ../Includes.txt -.. _admin-manual: - -Administrator Manual -==================== - -The first thing you have to decide, when installing asdis, is the exact moment you want to replace the URLs to your CDN. - -Your options are: - -- Before Storing in cache (contentPostProc-all) (recommended) - -- Before outputting the content to the browser (contentPostProc-output) - -- Non INTincScripts before storing in cache (contentPostProc-all) + INTincScripts before outputting the content to the browser (contentPostProc-output) - -The description in your backend explains your options very well: - -.. image:: /Images/AdministratorManual/AsdisConfig1.png - ---------- Activation ---------- diff --git a/Tests/Content/Scraper/Html/ImageTest.php b/Tests/Content/Scraper/Html/ImageTest.php index 04265a2e2..641e0ca17 100644 --- a/Tests/Content/Scraper/Html/ImageTest.php +++ b/Tests/Content/Scraper/Html/ImageTest.php @@ -17,14 +17,14 @@ public function testScrape(): void $assetFactory = $this->getMockBuilder(Factory::class)->getMock(); $assetFactory - ->expects($this->exactly(3)) + ->expects($this->exactly(6)) ->method('createAssetsFromPaths') ->with(['uploads/tx_templavoila/example.gif']) ->willReturn(new Collection()); $attributeExtractor = $this->getMockBuilder(XmlTagAttribute::class)->getMock(); $attributeExtractor - ->expects($this->exactly(3)) + ->expects($this->exactly(6)) ->method('getAttributeFromTag') ->willReturn([ 'paths' => ['uploads/tx_templavoila/example.gif'], diff --git a/composer.json b/composer.json index 701db7ba9..e39f1c932 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,7 @@ "TYPO3_PATH_ROOT=.Build/Web .Build/bin/phpunit --colors -c .Build/vendor/typo3/testing-framework/Resources/Core/Build/UnitTests.xml Tests" ], "code-style": [ - "[ -e ./.Build/bin/rector ] || composer install", + "[ -e ./.Build/bin/rector ] || composer update", "./.Build/bin/ecs check --config .code-quality/ecs.php", "./.Build/bin/rector process --dry-run --config .code-quality/rector.php" ], @@ -78,7 +78,7 @@ "./.Build/bin/phpstan analyse -c .code-quality/phpstan.neon --memory-limit=1G --generate-baseline" ], "code-compatibility": [ - "[ -e ./.Build/vendor/symplify/easy-coding-standard/vendor/squizlabs/php_codesniffer/bin/phpcs ] || composer install", + "[ -e ./.Build/vendor/symplify/easy-coding-standard/vendor/squizlabs/php_codesniffer/bin/phpcs ] || composer update", "[ -d ./reports/php_checkstyle ] || mkdir -p reports/php_checkstyle/", "./.code-quality/configure-checkstyle.sh", "./.Build/vendor/symplify/easy-coding-standard/vendor/squizlabs/php_codesniffer/bin/phpcs -d memory_limit=1G --standard=PHPCompatibility --colors --ignore=*/.Build/* -p . --runtime-set testVersion 8.0", diff --git a/ext_conf_template.txt b/ext_conf_template.txt deleted file mode 100644 index 68e66975a..000000000 --- a/ext_conf_template.txt +++ /dev/null @@ -1,2 +0,0 @@ -# cat=basic; type=options[Before Storing in cache (contentPostProc-all)=contentPostProc-all,Before outputting the content to the browser (contentPostProc-output)=contentPostProc-output,Non INTincScripts before storing in cache (contentPostProc-all) + INTincScripts before outputting the content to the browser (contentPostProc-output)=contentPostProc-all_and_output]; label=Which Hook should be used: The "contentPostProc-output" hook is called before the page will be outputted to the browser. The result of replacing the assets will not be cached. But therefore you can replace much more assets than before storing the content within the cache. That is because of the fact, that some other extensions changing the output within this hook too and adds some additional assets to the output. The "contentPostProc-all" is used before the content is is stored within the cache. Be careful with using the "contentPostProc-output" hook since this is much more expensive for the site performance. Another option is to use a combination of both hooks. Here the "contentPostProc-all" hook is used for pages without INTincScripts. However, pages with INTincScripts scripts still contain unreplaced markers so their actual content can not be processed at that time. So for pages with INTincScripts scripts the "contentPostProc-output" hook is used. -hook=contentPostProc-all diff --git a/ext_emconf.php b/ext_emconf.php index 8d4005960..021e246c1 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -19,10 +19,10 @@ 'clearCacheOnLoad' => 0, 'lockType' => '', 'author_company' => 'AOE GmbH', - 'version' => '11.0.17', + 'version' => '11.1.0', 'constraints' => [ 'depends' => [ - 'typo3' => '8.7.30-11.5.99', + 'typo3' => '11.5.0-12.9.99', ], 'conflicts' => [], 'suggests' => [], diff --git a/ext_localconf.php b/ext_localconf.php index 62146e548..66fb2e712 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -1,7 +1,6 @@