From 83b8ca2cdf5d465f3cc7d7e6a4e92123eb9f8017 Mon Sep 17 00:00:00 2001 From: Benni Mack <benni@typo3.org> Date: Thu, 7 Jul 2022 23:36:59 +0200 Subject: [PATCH] [BUGFIX] Re-apply stdWrap for typolink.parameter values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Due to a regression in TYPO3 v11.5.11, using typolink.parameter with stdWrap might also return more than just the URL. This change reverts this behavior by overlaying the decoded typolink string with the original decoded typolink string. Resolves: #97869 Related: #90404 Related: #80896 Releases: main, 11.5 Change-Id: I22010983886a8da8a339aa6376d36303f3b729b2 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/75046 Tested-by: core-ci <typo3@b13.com> Tested-by: Felix Nagel Tested-by: Stefan Bürk <stefan@buerk.tech> Tested-by: Oliver Bartsch <bo@cedev.de> Tested-by: Benni Mack <benni@typo3.org> Reviewed-by: Felix Nagel Reviewed-by: Stefan Bürk <stefan@buerk.tech> Reviewed-by: Oliver Bartsch <bo@cedev.de> Reviewed-by: Benni Mack <benni@typo3.org> --- .../frontend/Classes/Typolink/LinkFactory.php | 6 ++++- .../ContentObjectRendererTest.php | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/typo3/sysext/frontend/Classes/Typolink/LinkFactory.php b/typo3/sysext/frontend/Classes/Typolink/LinkFactory.php index cb3a53b43594..8bb1361bd3a9 100644 --- a/typo3/sysext/frontend/Classes/Typolink/LinkFactory.php +++ b/typo3/sysext/frontend/Classes/Typolink/LinkFactory.php @@ -58,7 +58,11 @@ class LinkFactory implements LoggerAwareInterface if (isset($linkConfiguration['parameter.'])) { // Evaluate "parameter." stdWrap but keep additional information (like target, class and title) $linkParameterParts = $this->typoLinkCodecService->decode($linkConfiguration['parameter'] ?? ''); - $linkParameterParts['url'] = $contentObjectRenderer->stdWrap($linkParameterParts['url'], $linkConfiguration['parameter.']); + $modifiedLinkParameterString = $contentObjectRenderer->stdWrap($linkParameterParts['url'], $linkConfiguration['parameter.']); + // As the stdWrap result might contain target etc. as well again (".field = header_link") + // the result is then taken from the stdWrap and overridden if the value is not empty. + $modifiedLinkParameterParts = $this->typoLinkCodecService->decode($modifiedLinkParameterString); + $linkParameterParts = array_replace($linkParameterParts, array_filter($modifiedLinkParameterParts, 'trim')); $linkParameter = $this->typoLinkCodecService->encode($linkParameterParts); } else { $linkParameter = trim((string)($linkConfiguration['parameter'] ?? '')); diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php index d29bef5df5bf..b11afa82ec3a 100644 --- a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php +++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php @@ -2657,6 +2657,33 @@ class ContentObjectRendererTest extends UnitTestCase ], '<a href="http://typo3.com" class="url-class">TYPO3</a>', ], + 'Link url using stdWrap with class attribute in parameter and overridden target' => [ + 'TYPO3', + [ + 'parameter' => 'http://typo3.org default-target url-class', + 'parameter.' => [ + 'cObject' => 'TEXT', + 'cObject.' => [ + 'value' => 'http://typo3.com new-target different-url-class', + ], + ], + ], + '<a href="http://typo3.com" target="new-target" rel="noreferrer" class="different-url-class">TYPO3</a>', + ], + 'Link url using stdWrap with class attribute in parameter and overridden target and returnLast' => [ + 'TYPO3', + [ + 'parameter' => 'http://typo3.org default-target url-class', + 'parameter.' => [ + 'cObject' => 'TEXT', + 'cObject.' => [ + 'value' => 'http://typo3.com new-target different-url-class', + ], + ], + 'returnLast' => 'url', + ], + 'http://typo3.com', + ], ]; } -- GitLab