From 81ff7f18a0de248369403e0fd6bfca2e7e03b308 Mon Sep 17 00:00:00 2001 From: Alexander Schnitzler <git@alexanderschnitzler.de> Date: Sat, 26 Sep 2020 19:31:23 +0200 Subject: [PATCH] [TASK] Fix phpstan checkFunctionArgumentTypes errors in ext:fluid This patch fixes incompatible type usage in function arguments and is preparatory work for introducing native type hints and strict mode in all core files. Resolves: #92167 Releases: master, 10.4 Change-Id: Ie0e82554801f505b19621434d527f341d07a9a12 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/65911 Tested-by: TYPO3com <noreply@typo3.com> Tested-by: Daniel Goerz <daniel.goerz@posteo.de> Tested-by: Benni Mack <benni@typo3.org> Reviewed-by: Daniel Goerz <daniel.goerz@posteo.de> Reviewed-by: Oliver Klee <typo3-coding@oliverklee.de> Reviewed-by: Benni Mack <benni@typo3.org> --- .../fluid/Classes/Core/Rendering/RenderingContext.php | 5 ++++- .../Classes/Core/Widget/AbstractWidgetViewHelper.php | 2 +- .../fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php | 3 +-- .../fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php | 7 ++++--- .../fluid/Classes/ViewHelpers/CObjectViewHelper.php | 4 ++-- .../ViewHelpers/Form/AbstractFormFieldViewHelper.php | 2 +- .../fluid/Classes/ViewHelpers/Form/SelectViewHelper.php | 8 ++++---- typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php | 1 + .../fluid/Classes/ViewHelpers/Format/DateViewHelper.php | 4 ++-- .../sysext/fluid/Classes/ViewHelpers/MediaViewHelper.php | 5 ++--- .../fluid/Classes/ViewHelpers/Widget/LinkViewHelper.php | 2 +- .../fluid/Classes/ViewHelpers/Widget/UriViewHelper.php | 2 +- 12 files changed, 24 insertions(+), 21 deletions(-) diff --git a/typo3/sysext/fluid/Classes/Core/Rendering/RenderingContext.php b/typo3/sysext/fluid/Classes/Core/Rendering/RenderingContext.php index f16b59a50a05..189469c083b9 100644 --- a/typo3/sysext/fluid/Classes/Core/Rendering/RenderingContext.php +++ b/typo3/sysext/fluid/Classes/Core/Rendering/RenderingContext.php @@ -26,6 +26,7 @@ use TYPO3Fluid\Fluid\Core\Compiler\TemplateCompiler; use TYPO3Fluid\Fluid\Core\Parser\Configuration; use TYPO3Fluid\Fluid\Core\Parser\InterceptorInterface; use TYPO3Fluid\Fluid\Core\Parser\TemplateParser; +use TYPO3Fluid\Fluid\Core\Parser\TemplateProcessorInterface; use TYPO3Fluid\Fluid\Core\Variables\StandardVariableProvider; use TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInvoker; use TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperVariableContainer; @@ -87,7 +88,9 @@ class RenderingContext extends \TYPO3Fluid\Fluid\Core\Rendering\RenderingContext $objectManager = GeneralUtility::makeInstance(ObjectManager::class); if (method_exists($this, 'setTemplateProcessors')) { - $this->setTemplateProcessors(array_map([$objectManager, 'get'], $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['preProcessors'])); + /** @var TemplateProcessorInterface[] $processors */ + $processors = array_map([$objectManager, 'get'], $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['preProcessors']); + $this->setTemplateProcessors($processors); } $this->setExpressionNodeTypes($GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['expressionNodeTypes']); $this->setTemplatePaths($objectManager->get(TemplatePaths::class)); diff --git a/typo3/sysext/fluid/Classes/Core/Widget/AbstractWidgetViewHelper.php b/typo3/sysext/fluid/Classes/Core/Widget/AbstractWidgetViewHelper.php index b82470007820..9b9c318d8c62 100644 --- a/typo3/sysext/fluid/Classes/Core/Widget/AbstractWidgetViewHelper.php +++ b/typo3/sysext/fluid/Classes/Core/Widget/AbstractWidgetViewHelper.php @@ -171,7 +171,7 @@ abstract class AbstractWidgetViewHelper extends AbstractViewHelper { $this->widgetContext->setWidgetConfiguration($this->getWidgetConfiguration()); $this->initializeWidgetIdentifier(); - $this->widgetContext->setControllerObjectName(get_class($this->controller)); + $this->widgetContext->setControllerObjectName($this->controller === null ? 'null' : get_class($this->controller)); $extensionName = $this->renderingContext->getControllerContext()->getRequest()->getControllerExtensionName(); $pluginName = $this->renderingContext->getControllerContext()->getRequest()->getPluginName(); $this->widgetContext->setParentExtensionName($extensionName); diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php index cd5eaaa77fda..d91c1db0cbea 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php @@ -73,9 +73,8 @@ class PageInfoViewHelper extends AbstractBackendViewHelper $id = GeneralUtility::_GP('id'); $pageRecord = BackendUtility::readPageAccess($id, $GLOBALS['BE_USER']->getPagePermsClause(Permission::PAGE_SHOW)); // Add icon with context menu, etc: - /** @var IconFactory $iconFactory */ $iconFactory = GeneralUtility::makeInstance(IconFactory::class); - if ($pageRecord['uid']) { + if (is_array($pageRecord) && $pageRecord['uid']) { // If there IS a real page $altText = BackendUtility::getRecordIconAltText($pageRecord, 'pages'); $theIcon = '<span title="' . $altText . '">' . $iconFactory->getIconForRecord('pages', $pageRecord, Icon::SIZE_SMALL)->render() . '</span>'; diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php index e7e5760499b5..581525dc3507 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php @@ -72,15 +72,16 @@ class PagePathViewHelper extends AbstractBackendViewHelper $id = GeneralUtility::_GP('id'); $pageRecord = BackendUtility::readPageAccess($id, $GLOBALS['BE_USER']->getPagePermsClause(Permission::PAGE_SHOW)); // Is this a real page - if ($pageRecord['uid']) { - $title = $pageRecord['_thePathFull']; + if ($pageRecord['_thePathFull'] ?? false) { + $title = (string)$pageRecord['_thePathFull']; } else { - $title = $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']; + $title = (string)$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']; } // Setting the path of the page $pagePath = htmlspecialchars(static::getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.path')) . ': <span class="typo3-docheader-pagePath">'; // crop the title to title limit (or 50, if not defined) $cropLength = empty($GLOBALS['BE_USER']->uc['titleLen']) ? 50 : $GLOBALS['BE_USER']->uc['titleLen']; + $cropLength = (int)$cropLength; $croppedTitle = GeneralUtility::fixed_lgd_cs($title, -$cropLength); if ($croppedTitle !== $title) { $pagePath .= '<abbr title="' . htmlspecialchars($title) . '">' . htmlspecialchars($croppedTitle) . '</abbr>'; diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/CObjectViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/CObjectViewHelper.php index a5a4ae71154d..5c31b5e0b6d1 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/CObjectViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/CObjectViewHelper.php @@ -155,7 +155,7 @@ class CObjectViewHelper extends AbstractViewHelper $contentObjectRenderer->setCurrentVal($data[$currentValueKey]); } $pathSegments = GeneralUtility::trimExplode('.', $typoscriptObjectPath); - $lastSegment = array_pop($pathSegments); + $lastSegment = (string)array_pop($pathSegments); $setup = static::getConfigurationManager()->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT); foreach ($pathSegments as $segment) { if (!array_key_exists($segment . '.', $setup)) { @@ -226,7 +226,7 @@ class CObjectViewHelper extends AbstractViewHelper $site = reset($sites); } $language = $globalRequest->getAttribute('language') ?? $site->getDefaultLanguage(); - $pageArguments = $globalRequest->getAttribute('routing') ?? new PageArguments(0, 0, []); + $pageArguments = $globalRequest->getAttribute('routing') ?? new PageArguments(0, '0', []); $tsfe = GeneralUtility::makeInstance( TypoScriptFrontendController::class, GeneralUtility::makeInstance(Context::class), diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Form/AbstractFormFieldViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Form/AbstractFormFieldViewHelper.php index ab320384e944..cc1f792b30a3 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/Form/AbstractFormFieldViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/Form/AbstractFormFieldViewHelper.php @@ -230,7 +230,7 @@ abstract class AbstractFormFieldViewHelper extends AbstractFormViewHelper */ protected function getLastSubmittedFormData() { - $propertyPath = rtrim(preg_replace('/(\\]\\[|\\[|\\])/', '.', $this->getNameWithoutPrefix()), '.'); + $propertyPath = rtrim(preg_replace('/(\\]\\[|\\[|\\])/', '.', $this->getNameWithoutPrefix()) ?? '', '.'); $value = ObjectAccess::getPropertyPath( $this->renderingContext->getControllerContext()->getRequest()->getOriginalRequest()->getArguments(), $propertyPath diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Form/SelectViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Form/SelectViewHelper.php index d702109c4dc6..f91f0087c57e 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/Form/SelectViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/Form/SelectViewHelper.php @@ -243,15 +243,15 @@ class SelectViewHelper extends AbstractFormFieldViewHelper if (method_exists($key, '__toString')) { $key = (string)$key; } else { - throw new Exception('Identifying value for object of class "' . get_class($value) . '" was an object.', 1247827428); + throw new Exception('Identifying value for object of class "' . (is_object($value) ? get_class($value) : gettype($value)) . '" was an object.', 1247827428); } } } elseif ($this->persistenceManager->getIdentifierByObject($value) !== null) { // @todo use $this->persistenceManager->isNewObject() once it is implemented $key = $this->persistenceManager->getIdentifierByObject($value); - } elseif (method_exists($value, '__toString')) { + } elseif (is_object($value) && method_exists($value, '__toString')) { $key = (string)$value; - } else { + } elseif (is_object($value)) { throw new Exception('No identifying value for object of class "' . get_class($value) . '" found.', 1247826696); } if ($this->hasArgument('optionLabelField')) { @@ -263,7 +263,7 @@ class SelectViewHelper extends AbstractFormFieldViewHelper throw new Exception('Label value for object of class "' . get_class($value) . '" was an object without a __toString() method.', 1247827553); } } - } elseif (method_exists($value, '__toString')) { + } elseif (is_object($value) && method_exists($value, '__toString')) { $value = (string)$value; } elseif ($this->persistenceManager->getIdentifierByObject($value) !== null) { // @todo use $this->persistenceManager->isNewObject() once it is implemented diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php index edb3cf27825d..bb6e54b64f51 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php @@ -414,6 +414,7 @@ class FormViewHelper extends AbstractFormViewHelper { if (count($arguments)) { foreach ($arguments as $argumentName => $argumentValue) { + $argumentName = (string)$argumentName; if (is_array($argumentValue)) { $prefix = $level == 0 ? $argumentName : $currentPrefix . '[' . $argumentName . ']'; $this->postProcessUriArgumentsForRequestHash($argumentValue, $results, $prefix, $level + 1); diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Format/DateViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Format/DateViewHelper.php index d9f152045ce0..78b068220083 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/Format/DateViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/Format/DateViewHelper.php @@ -155,7 +155,7 @@ class DateViewHelper extends AbstractViewHelper if (!$date instanceof \DateTimeInterface) { try { - $base = $base instanceof \DateTimeInterface ? $base->format('U') : strtotime((MathUtility::canBeInterpretedAsInteger($base) ? '@' : '') . $base); + $base = $base instanceof \DateTimeInterface ? (int)$base->format('U') : (int)strtotime((MathUtility::canBeInterpretedAsInteger($base) ? '@' : '') . $base); $dateTimestamp = strtotime((MathUtility::canBeInterpretedAsInteger($date) ? '@' : '') . $date, $base); $date = new \DateTime('@' . $dateTimestamp); $date->setTimezone(new \DateTimeZone(date_default_timezone_get())); @@ -165,7 +165,7 @@ class DateViewHelper extends AbstractViewHelper } if (strpos($format, '%') !== false) { - return strftime($format, $date->format('U')); + return strftime($format, (int)$date->format('U')); } return $date->format($format); } diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/MediaViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/MediaViewHelper.php index 940d2bf781b9..48e41dd8b7ca 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/MediaViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/MediaViewHelper.php @@ -20,7 +20,6 @@ use TYPO3\CMS\Core\Resource\FileInterface; use TYPO3\CMS\Core\Resource\FileReference; use TYPO3\CMS\Core\Resource\Rendering\RendererRegistry; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Extbase\Domain\Model\AbstractFileFolder; use TYPO3\CMS\Extbase\Service\ImageService; use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper; @@ -109,8 +108,8 @@ class MediaViewHelper extends AbstractTagBasedViewHelper $file = $file->getOriginalResource(); } - if (!($file instanceof FileInterface || $file instanceof AbstractFileFolder)) { - throw new \UnexpectedValueException('Supplied file object type ' . get_class($file) . ' must be FileInterface or AbstractFileFolder.', 1454252193); + if (!$file instanceof FileInterface) { + throw new \UnexpectedValueException('Supplied file object type ' . get_class($file) . ' must be FileInterface.', 1454252193); } $fileRenderer = RendererRegistry::getInstance()->getRenderer($file); diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Widget/LinkViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Widget/LinkViewHelper.php index c3b0e17979b0..ecbd5f994981 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/Widget/LinkViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/Widget/LinkViewHelper.php @@ -97,7 +97,7 @@ class LinkViewHelper extends AbstractTagBasedViewHelper $arguments['type'] = 7076; $arguments['fluid-widget-id'] = $this->renderingContext->getControllerContext()->getRequest()->getWidgetContext()->getAjaxWidgetIdentifier(); $arguments['action'] = $action; - return '?' . http_build_query($arguments, null, '&'); + return '?' . http_build_query($arguments, '', '&'); } /** diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Widget/UriViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Widget/UriViewHelper.php index c3fc99292f6e..680e6f7e106b 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/Widget/UriViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/Widget/UriViewHelper.php @@ -87,7 +87,7 @@ class UriViewHelper extends AbstractViewHelper $arguments['type'] = 7076; $arguments['fluid-widget-id'] = $controllerContext->getRequest()->getWidgetContext()->getAjaxWidgetIdentifier(); $arguments['action'] = $action; - return '?' . http_build_query($arguments, null, '&'); + return '?' . http_build_query($arguments, '', '&'); } /** -- GitLab