TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:09 +02:00
commit af8cc155b5
6818 changed files with 642608 additions and 0 deletions
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _breaking-109153-1781184782:
=================================================================
Breaking: #109153 - Obsolete pages-only new record wizard removed
=================================================================
See :issue:`109153`
Description
===========
The page creation wizard introduced with :issue:`108915` replaced the legacy
"pages only" position selection flow of the records module. Its now unused
predecessors have been removed:
* The backend route :php:`db_new_pages` (path ``/record/new-page``).
* The page TSconfig option
:typoscript:`mod.wizards.newRecord.pages.show.pageSelectPosition`.
Impact
======
Linking to the :php:`db_new_pages` route raises an error. The page TSconfig
option :typoscript:`mod.wizards.newRecord.pages.show.pageSelectPosition` no longer
has any effect.
Affected installations
======================
Instances with third-party extensions that link to the :php:`db_new_pages`
route, or set the :typoscript:`pageSelectPosition` page TSconfig option.
Such extensions are quite rare, and a left over page TSconfig shouldn't harm.
Migration
=========
Use the page creation wizard instead. New pages are created through the
:php:`db_new` route and the ``typo3-backend-new-page-wizard-button`` component,
which guide position and page type selection. No replacement for
:php:`PagePositionMap` or the :typoscript:`pageSelectPosition` option is needed.
.. index:: Backend, PHP-API, TSConfig, NotScanned, ext:backend
@@ -0,0 +1,315 @@
.. include:: /Includes.rst.txt
.. _breaking-109783-1776735296:
====================================================
Breaking: #109783 - Deprecated functionality removed
====================================================
See :issue:`109783`
Description
===========
The following PHP classes that have previously been marked as deprecated with v14 have been removed:
- :php:`\TYPO3\CMS\Backend\Form\Container\OuterWrapContainer` :ref:`(Deprecation entry) <deprecation-109192-1741560000>`
- :php:`\TYPO3\CMS\Backend\Form\FieldInformation\TcaDescription` :ref:`(Deprecation entry) <deprecation-109280-1742109280>`
- :php:`\TYPO3\CMS\Backend\Form\FormResultCompiler` :ref:`(Deprecation entry) <deprecation-109230-1773404000>`
- :php:`\TYPO3\CMS\Backend\Template\Components\MetaInformation` :ref:`(Deprecation entry) <deprecation-107813-1730000000>`
- :php:`\TYPO3\CMS\Core\Console\CommandNameAlreadyInUseException` :ref:`(Deprecation entry) <deprecation-108667-1768743166>`
- :php:`\TYPO3\CMS\Core\Localization\Parser\AbstractXmlParser` :ref:`(Deprecation entry) <deprecation-107436-1736639846>`
- :php:`\TYPO3\CMS\Core\Localization\Parser\XliffParser` :ref:`(Deprecation entry) <deprecation-107436-1736639846>`
- :php:`\TYPO3\CMS\Form\Mvc\Configuration\InheritancesResolverService` :ref:`(Deprecation entry) <deprecation-97857-1761224875>`
- :php:`\TYPO3\CMS\Form\Storage\FileMountStorageAdapter` :ref:`(Deprecation entry) <deprecation-108653-1741600000>`
- :php:`\TYPO3\CMS\Frontend\Resource\FilePathSanitizer` :ref:`(Deprecation entry) <deprecation-107537-1760305681>`
- :php:`\TYPO3\CMS\Form\Domain\Model\FormElements\DatePicker` :ref:`(Deprecation entry) <deprecation-109152-1741600000>`
- :php:`\TYPO3\CMS\Form\ViewHelpers\Form\DatePickerViewHelper` :ref:`(Deprecation entry) <deprecation-109152-1741600000>`
- :php:`\TYPO3\CMS\Form\ViewHelpers\Form\TimePickerViewHelper` :ref:`(Deprecation entry) <deprecation-109152-1741600000>`
- :php:`\TYPO3\CMS\Lowlevel\Integrity\DatabaseIntegrityCheck` :ref:`(Deprecation entry) <deprecation-107931-1775647667>`
- :php:`\TYPO3\CMS\Fluid\ViewHelpers\Debug\RenderViewHelper` :ref:`(Deprecation entry) <deprecation-107208-1754387701>`
- :php:`\TYPO3\CMS\Install\Attribute\UpgradeWizard` :ref:`(Deprecation entry) <deprecation-106947-1750759241>`
- :php:`\TYPO3\CMS\Install\Updates\AbstractListTypeToCTypeUpdate` :ref:`(Deprecation entry) <deprecation-106947-1750759241>`
- :php:`\TYPO3\CMS\Install\Updates\Confirmation` :ref:`(Deprecation entry) <deprecation-106947-1750759241>`
- :php:`\TYPO3\CMS\Install\Updates\DatabaseUpdatedPrerequisite` :ref:`(Deprecation entry) <deprecation-106947-1750759241>`
- :php:`\TYPO3\CMS\Install\Updates\ReferenceIndexUpdatedPrerequisite` :ref:`(Deprecation entry) <deprecation-106947-1750759241>`
- :php:`\TYPO3\CMS\Scheduler\AbstractAdditionalFieldProvider` :ref:`(Deprecation entry) <deprecation-98453-1738408355>`
- :php:`\TYPO3\CMS\Core\Upgrades\AbstractListTypeToCTypeUpdate` :ref:`(Deprecation entry) <deprecation-105076-1726923626>`
The following PHP methods have been set to :php:`private` and can no longer be called from outside the class:
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::resolveBackPath()` :ref:`(Deprecation entry) <deprecation-106618-1745587818>`
The following PHP interfaces that have previously been marked as deprecated with v14 have been removed:
- :php:`\TYPO3\CMS\Core\Localization\Parser\LocalizationParserInterface` :ref:`(Deprecation entry) <deprecation-107436-1736639846>`
- :php:`\TYPO3\CMS\Install\Updates\ChattyInterface` :ref:`(Deprecation entry) <deprecation-106947-1750759241>`
- :php:`\TYPO3\CMS\Install\Updates\ConfirmableInterface` :ref:`(Deprecation entry) <deprecation-106947-1750759241>`
- :php:`\TYPO3\CMS\Install\Updates\PrerequisiteInterface` :ref:`(Deprecation entry) <deprecation-106947-1750759241>`
- :php:`\TYPO3\CMS\Install\Updates\RepeatableInterface` :ref:`(Deprecation entry) <deprecation-106947-1750759241>`
- :php:`\TYPO3\CMS\Install\Updates\UpgradeWizardInterface` :ref:`(Deprecation entry) <deprecation-106947-1750759241>`
- :php:`\TYPO3\CMS\Scheduler\AdditionalFieldProviderInterface` :ref:`(Deprecation entry) <deprecation-98453-1738408355>`
The following PHP class aliases that have previously been marked as deprecated with v14 have been removed:
- :php:`\TYPO3\CMS\Core\Service\FlexFormService` :ref:`(Breaking entry) <breaking-107945-1761875852>`
- :php:`\TYPO3\CMS\Extbase\Annotation\FileUpload` :ref:`(Deprecation entry) <deprecation-107229-1760116732>`
- :php:`\TYPO3\CMS\Extbase\Annotation\IgnoreValidation` :ref:`(Deprecation entry) <deprecation-107229-1760116732>`
- :php:`\TYPO3\CMS\Extbase\Annotation\ORM\Cascade` :ref:`(Deprecation entry) <deprecation-107229-1760116732>`
- :php:`\TYPO3\CMS\Extbase\Annotation\ORM\Lazy` :ref:`(Deprecation entry) <deprecation-107229-1760116732>`
- :php:`\TYPO3\CMS\Extbase\Annotation\ORM\Transient` :ref:`(Deprecation entry) <deprecation-107229-1760116732>`
- :php:`\TYPO3\CMS\Extbase\Annotation\Validate` :ref:`(Deprecation entry) <deprecation-107229-1760116732>`
- :php:`\TYPO3\CMS\Frontend\Content\ContentSlideMode` :ref:`(Feature introduction) <feature-104974-1726401724>`
- :php:`\TYPO3\CMS\Install\Command\LanguagePackCommand` :ref:`(Deprecation entry) <deprecation-109027-1771514240>`
- :php:`\TYPO3\CMS\Install\Service\Event\ModifyLanguagePackRemoteBaseUrlEvent` :ref:`(Deprecation entry) <deprecation-109027-1771514240>`
- :php:`\TYPO3\CMS\Install\Service\Event\ModifyLanguagePacksEvent` :ref:`(Deprecation entry) <deprecation-109027-1771514240>`
- :php:`\TYPO3\CMS\Setup\Form\Element\AvatarElement` :ref:`(Important entry) <important-109517-1744105200>`
- :php:`\TYPO3\CMS\Setup\UserFunctions\UserSettingsItemsProcFunc` :ref:`(Important entry) <important-109517-1744105200>`
The following PSR-14 events that have previously been marked as deprecated with v14 have been removed:
- :php:`\TYPO3\CMS\Backend\View\Event\AbstractSectionMarkupGeneratedEvent` :ref:`(Deprecation entry) <deprecation-109529-1775733107>`
- :php:`\TYPO3\CMS\Backend\View\Event\AfterSectionMarkupGeneratedEvent` :ref:`(Deprecation entry) <deprecation-109529-1775733107>`
- :php:`\TYPO3\CMS\Backend\View\Event\BeforeSectionMarkupGeneratedEvent` :ref:`(Deprecation entry) <deprecation-109529-1775733107>`
- :php:`\TYPO3\CMS\Setup\Event\AddJavaScriptModulesEvent` :ref:`(Deprecation entry) <deprecation-109517-1744105201>`
The following PHP class methods that have previously been marked as deprecated with v14 have been removed:
- :php:`\TYPO3\CMS\Backend\Form\FormResultCollection->getHiddenFieldsHtml()` :ref:`(Deprecation entry) <deprecation-109102-1740480000>`
- :php:`\TYPO3\CMS\Backend\Template\Components\ButtonBar->makeButton()` :ref:`(Deprecation entry) <deprecation-107823-1761297638>`
- :php:`\TYPO3\CMS\Backend\Template\Components\ButtonBar->makeDropDownButton()` :ref:`(Deprecation entry) <deprecation-107823-1761297638>`
- :php:`\TYPO3\CMS\Backend\Template\Components\ButtonBar->makeFullyRenderedButton()` :ref:`(Deprecation entry) <deprecation-107823-1761297638>`
- :php:`\TYPO3\CMS\Backend\Template\Components\ButtonBar->makeGenericButton()` :ref:`(Deprecation entry) <deprecation-107823-1761297638>`
- :php:`\TYPO3\CMS\Backend\Template\Components\ButtonBar->makeInputButton()` :ref:`(Deprecation entry) <deprecation-107823-1761297638>`
- :php:`\TYPO3\CMS\Backend\Template\Components\ButtonBar->makeLinkButton()` :ref:`(Deprecation entry) <deprecation-107823-1761297638>`
- :php:`\TYPO3\CMS\Backend\Template\Components\ButtonBar->makeShortcutButton()` :ref:`(Deprecation entry) <deprecation-107823-1761297638>`
- :php:`\TYPO3\CMS\Backend\Template\Components\ButtonBar->makeSplitButton()` :ref:`(Deprecation entry) <deprecation-107823-1761297638>`
- :php:`\TYPO3\CMS\Backend\Template\Components\DocHeaderComponent->setMetaInformation()` :ref:`(Deprecation entry) <deprecation-107813-1730000000>`
- :php:`\TYPO3\CMS\Backend\Template\Components\DocHeaderComponent->setMetaInformationForResource()` :ref:`(Deprecation entry) <deprecation-107813-1730000000>`
- :php:`\TYPO3\CMS\Backend\Template\Components\Menu\Menu->makeMenuItem()` :ref:`(Deprecation entry) <deprecation-107823-1761297638>`
- :php:`\TYPO3\CMS\Backend\Template\Components\MenuRegistry->makeMenu()` :ref:`(Deprecation entry) <deprecation-107823-1761297638>`
- :php:`\TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumn->getAfterSectionMarkup()` :ref:`(Deprecation entry) <deprecation-109529-1775733107>`
- :php:`\TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumn->getBeforeSectionMarkup()` :ref:`(Deprecation entry) <deprecation-109529-1775733107>`
- :php:`\TYPO3\CMS\Core\Authentication\BackendUserAuthentication->recordEditAccessInternals()` :ref:`(Deprecation entry) <deprecation-108568-1734962478>`
- :php:`\TYPO3\CMS\Core\DataHandling\PageDoktypeRegistry->add()` :ref:`(Deprecation entry) <deprecation-108557-1768610680>`
- :php:`\TYPO3\CMS\Core\DataHandling\PageDoktypeRegistry->addAllowedRecordTypes()` :ref:`(Deprecation entry) <deprecation-108557-1768610680>`
- :php:`\TYPO3\CMS\Core\DataHandling\PageDoktypeRegistry->doesDoktypeOnlyAllowSpecifiedRecordTypes()` :ref:`(Deprecation entry) <deprecation-108557-1768610680>`
- :php:`\TYPO3\CMS\Core\Imaging\GraphicalFunctions->gif_or_jpg()` :ref:`(Deprecation entry) <deprecation-93981-1751961645>`
- :php:`\TYPO3\CMS\Core\Log\Writer\DatabaseWriter->getLogTable()` :ref:`(Deprecation entry) <deprecation-109295-1742407200>`
- :php:`\TYPO3\CMS\Core\Log\Writer\DatabaseWriter->setLogTable()` :ref:`(Deprecation entry) <deprecation-109295-1742407200>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->addInlineLanguageDomain()` :ref:`(Deprecation entry) <deprecation-108963-1770907005>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getBodyContent()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getDocType()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getFavIcon()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getHeadTag()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getHtmlTag()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getIconMimeType()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getInlineLanguageLabelFiles()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getInlineLanguageLabels()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getLanguage()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getMetaTag()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getMoveJsFromHeaderToFooter()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getTemplateFile()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->getTitle()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->removeMetaTag()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Core\Resource\Collection\FileCollectionRegistry->addTypeToTCA()` :ref:`(Deprecation entry) <deprecation-107287-1734253200>`
- :php:`\TYPO3\CMS\Core\Resource\Index\ExtractorRegistry->registerExtractionService()` :ref:`(Breaking entry) <breaking-107783-1760945127>`
- :php:`\TYPO3\CMS\Frontend\ContentObject\AbstractContentObject->getPageRenderer()` :ref:`(Deprecation entry) <deprecation-109329-1774349266>`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->readFlexformIntoConf()` :ref:`(Deprecation entry) <deprecation-109575>`
- :php:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder::build()` :ref:`(Deprecation entry) <deprecation-106405-1742674605>`
- :php:`\TYPO3\CMS\Scheduler\Task\AbstractTask->getTaskClassName()` :ref:`(Deprecation entry) <deprecation-98453-1738408355>`
- :php:`\TYPO3\CMS\Scheduler\Task\AbstractTask->getTaskDescription()` :ref:`(Deprecation entry) <deprecation-98453-1738408355>`
- :php:`\TYPO3\CMS\Scheduler\Task\AbstractTask->getTaskTitle()` :ref:`(Deprecation entry) <deprecation-98453-1738408355>`
The following PHP static class methods that have previously been marked as deprecated for v14 have been removed:
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getCommonSelectFields()` :ref:`(Deprecation entry) <deprecation-106393-1742454612>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getExistingPageTranslations()` :ref:`(Deprecation entry) <deprecation-108810-1738253894>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getItemLabel()` :ref:`(Deprecation entry) <deprecation-106393-1742454612>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getLabelFromItemlist()` :ref:`(Deprecation entry) <deprecation-109519-1775665165>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getLabelFromItemListMerged()` :ref:`(Deprecation entry) <deprecation-109519-1775665165>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getLabelsFromItemsList()` :ref:`(Deprecation entry) <deprecation-109519-1775665165>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getRecordLocalization()` :ref:`(Deprecation entry) <deprecation-108810-1738253894>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getTCEFORM_TSconfig()` :ref:`(Deprecation entry) <deprecation-108761-1769281290>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getTSCpid()` :ref:`(Deprecation entry) <deprecation-108761-1769281290>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getTSCpidCached()` :ref:`(Deprecation entry) <deprecation-108761-1769281290>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::isRootLevelRestrictionIgnored()` :ref:`(Deprecation entry) <deprecation-106393-1742454612>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::isTableLocalizable()` :ref:`(Deprecation entry) <deprecation-106393-1742454612>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::isTableWorkspaceEnabled()` :ref:`(Deprecation entry) <deprecation-106393-1742454612>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::isWebMountRestrictionIgnored()` :ref:`(Deprecation entry) <deprecation-106393-1742454612>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::resolveFileReferences()` :ref:`(Deprecation entry) <deprecation-106393-1742454612>`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::translationCount()` :ref:`(Deprecation entry) <deprecation-108810-1738253894>`
- :php:`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToUserSettings()` :ref:`(Deprecation entry) <deprecation-108843-1738600000>`
- :php:`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue()` :ref:`(Deprecation entry) <deprecation-107047-1751984220>`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::createVersionNumberedFilename()` :ref:`(Deprecation entry) <deprecation-107537-1760337101>`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv()` :ref:`(Deprecation entry) <deprecation-109551-1775924599>`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::setIndpEnv()` :ref:`(Deprecation entry) <deprecation-109551-1775924599>`
- :php:`\TYPO3\CMS\Core\Utility\PathUtility::getPublicResourceWebPath()` :ref:`(Deprecation entry) <deprecation-107537-1761162068>`
- :php:`\TYPO3\CMS\Core\Utility\PathUtility::getRelativePath()` :ref:`(Deprecation entry) <deprecation-107413-1725875222>`
- :php:`\TYPO3\CMS\Core\Utility\PathUtility::getRelativePathTo()` :ref:`(Deprecation entry) <deprecation-107413-1725875222>`
The following methods changed signature according to previous deprecations in v14:
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->render()` - argument :php:`$request` is now mandatory :ref:`(Deprecation entry) <deprecation-109286-1773844395>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->renderResponse()` - argument :php:`$request` is now mandatory and the first argument. The transitional :php:`ServerRequestInterface|int $requestOrCode` union has been removed :ref:`(Deprecation entry) <deprecation-109286-1773844395>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->setDocType()` - argument :php:`$request` is now mandatory :ref:`(Deprecation entry) <deprecation-109286-1773844395>`
- :php:`\TYPO3\CMS\Core\Page\PageRenderer->setLanguage()` - argument :php:`$request` is now mandatory :ref:`(Deprecation entry) <deprecation-109286-1773844395>`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::isOnCurrentHost()` - argument :php:`$request` is now mandatory :ref:`(Deprecation entry) <deprecation-109523-1775680564>`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::locationHeaderUrl()` - argument :php:`$request` is now mandatory :ref:`(Deprecation entry) <deprecation-109548-1775851081>`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::sanitizeLocalUrl()` - argument :php:`$request` is now mandatory :ref:`(Deprecation entry) <deprecation-109544-1775761298>`
- :php:`\TYPO3\CMS\Extbase\Attribute\ORM\Cascade->__construct()` - argument :php:`$value` is now a :php:`?string` :ref:`(Deprecation entry) <deprecation-97559-1760453281>`
- :php:`\TYPO3\CMS\Extbase\Attribute\IgnoreValidation->__construct()` - accepts no arguments any more :ref:`(Deprecation entry) <deprecation-97559-1760453281>`
- :php:`\TYPO3\CMS\Extbase\Attribute\Validate->__construct()` - argument :php:`$validator` is not a :php:`string`, argument :php:`$param` has been removed :ref:`(Deprecation entry) <deprecation-97559-1760453281>`
- :php:`\TYPO3\CMS\Filelist\FileList->start()` - argument :php:`$sortDirection` no longer accepts a :php:`bool`, a :php:`\TYPO3\CMS\Filelist\Type\SortDirection` enum is now required :ref:`(Deprecation entry) <deprecation-107225-1754640245>`
The following public class properties have been dropped:
- :php:`\TYPO3\CMS\Backend\Form\FormResult->hiddenFieldsHtml` :ref:`(Deprecation entry) <deprecation-109102-1740480000>`
- :php:`\TYPO3\CMS\Core\Authentication\BackendUserAuthentication->errorMsg` :ref:`(Deprecation entry) <deprecation-108568-1734962478>`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->checkPid_badDoktypeList` :ref:`(Deprecation entry) <deprecation-109575>`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->currentRecordNumber` :ref:`(Deprecation entry) <deprecation-109575>`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->lastTypoLinkResult` :ref:`(Deprecation entry) <deprecation-109575>`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->parentRecord` :ref:`(Deprecation entry) <deprecation-109575>`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->parentRecordNumber` :ref:`(Deprecation entry) <deprecation-109575>`
The following protected class properties have been dropped:
- :php:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder->contentObjectRenderer` :ref:`(Deprecation entry) <deprecation-106405-1742674605>`
- :php:`\TYPO3\CMS\Backend\ElementBrowser\AbstractElementBrowser->bparams`. The legacy pipe-delimited :php:`bparams` element browser request parameter is no longer evaluated. FormEngine now passes the individual :php:`fieldReference`, :php:`allowedTypes` and further parameters, which are handled by the typed :php:`\TYPO3\CMS\Backend\ElementBrowser\ElementBrowserParameters`. Its :php:`fromBparams()` and :php:`toBparams()` conversion methods have been removed as well.
The following class constants have been dropped:
- :php:`\TYPO3\CMS\Fluid\ViewHelpers\Be\InfoboxViewHelper::STATE_NOTICE` :ref:`(Deprecation entry) <deprecation-107648-1744465200>`
- :php:`\TYPO3\CMS\Fluid\ViewHelpers\Be\InfoboxViewHelper::STATE_INFO` :ref:`(Deprecation entry) <deprecation-107648-1744465200>`
- :php:`\TYPO3\CMS\Fluid\ViewHelpers\Be\InfoboxViewHelper::STATE_OK` :ref:`(Deprecation entry) <deprecation-107648-1744465200>`
- :php:`\TYPO3\CMS\Fluid\ViewHelpers\Be\InfoboxViewHelper::STATE_WARNING` :ref:`(Deprecation entry) <deprecation-107648-1744465200>`
- :php:`\TYPO3\CMS\Fluid\ViewHelpers\Be\InfoboxViewHelper::STATE_ERROR` :ref:`(Deprecation entry) <deprecation-107648-1744465200>`
The following TypoScript options have been dropped or adapted:
- :typoscript:`plugin.tx_form.settings.yamlConfigurations` and :typoscript:`module.tx_form.settings.yamlConfigurations` :ref:`(Deprecation entry) <deprecation-109412-1742000001>`
- :typoscript:`getData` type :typoscript:`cobj:parentRecordNumber` :ref:`(Deprecation entry) <deprecation-109575>`
The following user TSconfig options have been removed:
- :typoscript:`auth.BE.redirectToURL` :ref:`(Deprecation entry) <deprecation-106969-1750853865>`
- :typoscript:`options.pageTree.doktypesToShowInNewPageDragArea` :ref:`(Deprecation entry) <deprecation-109196-1742122800>`
The following form yaml configurations that have previously been marked as deprecated for v14 have been removed:
- :yaml:`fieldExplanationText` :ref:`(Deprecation entry) <deprecation-107068-1759214357>`
- :yaml:`__inheritances` :ref:`(Deprecation entry) <deprecation-97857-1761224875>`
- :yaml:`persistenceManager.allowedFileMounts` :ref:`(Deprecation entry) <deprecation-108653-1741600000>`
The following global option handling have been dropped and are ignored:
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']` :ref:`(Deprecation entry) <deprecation-108524-1766073657>`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections'][/*...*/]['tableoptions']` :ref:`(Deprecation entry) <deprecation-105297-1728836814>`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections'][/*...*/]['defaultTableOptions']['collate']` :ref:`(Deprecation entry) <deprecation-105297-1728836814>`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['fallbackToLegacyHash']`; the transitional fallback to the legacy md5-based cHash validation has been removed, only the HMAC-SHA3 cHash is accepted :ref:`(Breaking entry) <breaking-106307-1763824774>`
- :php:`$GLOBALS['TYPO3_USER_SETTINGS']`; backend user profile settings are now configured via TCA (the :php:`be_users` ``user_settings`` column) using :php:`ExtensionManagementUtility::addUserSetting()` :ref:`(Deprecation entry) <deprecation-108843-1738600000>`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['addAllowedPaths']`; additional public folders are now exposed via resource definitions instead :ref:`(Deprecation entry) <deprecation-109409-1774774806>`
The following extension file loading has been removed:
- :file:`ext_tables.php` files in extensions are no longer considered during bootstrap :ref:`(Deprecation entry) <deprecation-109438-1774951763>`
- :file:`ext_emconf.php` files in extensions are no longer evaluated for package metadata. In TYPO3 classic (non-Composer) mode the :file:`composer.json` must declare the extension version and the :php:`providesPackages` definition in the :php:`extra/typo3/cms` section. These two fields are now mandatory, also for extensions that no longer ship an :file:`ext_emconf.php`, otherwise loading the extension throws an exception. :ref:`(Deprecation entry) <deprecation-108345-1774126701>`
The following TCA options are not evaluated anymore:
- :php:`passwordRules` option of the :php:`passwordGenerator` field control; use :php:`passwordPolicy` instead :ref:`(Deprecation entry) <deprecation-69190-1770668741>`
The following extbase attribute usages have been removed:
- :php:`#[IgnoreValidation]` for parameters at method level :ref:`(Deprecation entry) <deprecation-108227-1763668119>`
- :php:`#[Validate]` for parameters at method level :ref:`(Deprecation entry) <deprecation-108227-1763668119>`
The following fallbacks have been removed:
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->getRequest()` no longer falls back to :php:`$GLOBALS['TYPO3_REQUEST']`; code must call :php:`setRequest()` after instantiation :ref:`(Deprecation entry) <deprecation-109575>`
- Page layout content area columns without an :html:`identifier` no longer fall back to a generated hash based on the page layout identifier and :html:`colPos`; a missing identifier now throws a :php:`\RuntimeException` :ref:`(Feature introduction) <feature-104974-1726401724>`
- Manually creating and adding a :php:`\TYPO3\CMS\Backend\Template\Components\Buttons\Action\ShortcutButton` to the button bar is no longer detected and no longer suppresses the automatic shortcut button; controllers must use :php:`\TYPO3\CMS\Backend\Template\Components\DocHeaderComponent->setShortcutContext()` instead :ref:`(Deprecation entry) <deprecation-108008-1762896168>`
- A legacy :file:`typo3conf/LocalConfiguration.php` and :file:`typo3conf/AdditionalConfiguration.php` are no longer automatically migrated to :file:`config/system/settings.php` and :file:`config/system/additional.php` on first request. The configuration files have to reside at their final location. :ref:`(Breaking entry) <breaking-98319-1664641595>`
- The redis cache backend no longer accepts an array for the ``password`` option as a workaround to configure a username and password at once. Use the separate ``username`` and ``password`` options instead. :ref:`(Deprecation entry) <deprecation-107725-1760807740>`
- The redis session backend no longer accepts an array for the ``password`` option as a workaround to configure a username and password at once. Use the separate ``username`` and ``password`` options instead. :ref:`(Deprecation entry) <deprecation-107802-1770827443>`
- Flex form pageTsConfig (:typoscript:`TCEFORM`) and exclude-field addressing no longer resolves comma-separated :php:`dataStructureKey` values (the legacy :php:`list_type,CType` form); the data structure key is used as-is :ref:`(Breaking entry) <breaking-107047-1751982363>`
The following upgrade wizards have been removed:
- :php:`\TYPO3\CMS\Core\Upgrades\SysFileMimeTypeMigration` (identifier ``sysFileMimeTypeMigration``)
- :php:`\TYPO3\CMS\Core\Upgrades\PagesRecyclerDoktypeMigration` (identifier ``pagesRecyclerDoktypeMigration``)
- :php:`\TYPO3\CMS\Core\Upgrades\NullToDefaultUpdateWizard` (identifier ``nullToDefaultUpdateWizard``)
- :php:`\TYPO3\CMS\Frontend\Upgrades\SynchronizeColPosAndCTypeWithDefaultLanguage` (identifier ``synchronizeColPosAndCTypeWithDefaultLanguage``)
- :php:`\TYPO3\CMS\IndexedSearch\Upgrades\IndexedSearchCTypeMigration` (identifier ``indexedSearchCTypeMigration``)
The following JavaScript modules have been removed:
- The legacy CKEditor5 alias modules :js:`@typo3/ckeditor5-bundle.js` and :js:`@typo3/ckeditor5-inspector.js` have been removed. Use the :js:`@ckeditor/ckeditor5-*` modules directly. The inspector is available as :js:`@ckeditor/ckeditor5-inspector`. :ref:`(Deprecation entry) <deprecation-102099>`
The following JavaScript method behaviours have changed:
- :js:`@typo3/backend/form-engine` no longer adds the :html:`doSave` hidden field to the form on save actions. Third-party code must no longer rely on the :html:`doSave` POST parameter. :ref:`(Deprecation entry) <deprecation-109029-1771804800>`
- :js:`@typo3/backend/tab` no longer dispatches the legacy :js:`show.bs.tab` and :js:`shown.bs.tab` events on tab switches. Listen for :js:`typo3:tab:show` (:js:`TabShowEvent`) and :js:`typo3:tab:shown` (:js:`TabShownEvent`) instead. :ref:`(Deprecation entry) <deprecation-109171-1741254000>`
The following JavaScript methods have been removed:
- :js:`createAbstractViewFormElementToolbar()`,
:js:`wireAbstractViewFormElementToolbarEventListeners()`,
:js:`eachTemplateProperty()`, :js:`renderCheckboxTemplate()`,
:js:`renderSimpleTemplate()`, :js:`renderSimpleTemplateWithValidators()`,
:js:`renderSelectTemplates()`, :js:`renderFileUploadTemplates()` of
:js:`@typo3/form/backend/form-editor/stage-component`
:ref:`(Deprecation entry) <deprecation-109306-1774010043>`
- :js:`markFieldAsChanged()` of :js:`@typo3/backend/form-engine-validation`. Call :js:`markFieldAsChanged()` of :js:`@typo3/backend/form-engine` instead. :ref:`(Deprecation entry) <deprecation-106527-1744189076>`
The following localization XLIFF files/labels have been removed:
- Several deprecated files (`see commit <https://review.typo3.org/c/Packages/TYPO3.CMS/+/94158>`__)
have been removed and are too many to list. These can be identified in TYPO3 v14 source
files by searching for the XML attribute `x-unused-since`. :ref:`(Deprecation entry) <deprecation-107938-1762181263>`
The following template files have been removed:
- :file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/SimpleTemplate.fluid.html` :ref:`(Deprecation entry) <deprecation-109306-1774010043>`
- :file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/SelectTemplate.fluid.html` :ref:`(Deprecation entry) <deprecation-109306-1774010043>`
- :file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/FileUploadTemplate.fluid.html` :ref:`(Deprecation entry) <deprecation-109306-1774010043>`
- :file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/ContentElement.fluid.html` :ref:`(Deprecation entry) <deprecation-109306-1774010043>`
- :file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/Fieldset.fluid.html` :ref:`(Deprecation entry) <deprecation-109306-1774010043>`
- :file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/StaticText.fluid.html` :ref:`(Deprecation entry) <deprecation-109306-1774010043>`
- :file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/Page.fluid.html` :ref:`(Deprecation entry) <deprecation-109306-1774010043>`
- :file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/SummaryPage.fluid.html` :ref:`(Deprecation entry) <deprecation-109306-1774010043>`
- :file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/_ElementToolbar.fluid.html` :ref:`(Deprecation entry) <deprecation-109306-1774010043>`
- :file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/_UnknownElement.fluid.html` :ref:`(Deprecation entry) <deprecation-109306-1774010043>`
The following CSS classes have been removed:
- :css:`.table-sorting-button` and :css:`.table-sorting-icon`. These backend table sorting helper classes were not used by the core.
The following Fluid rendering mechanisms have been removed:
- :php:`HeaderAssets` and :php:`FooterAssets` Fluid template sections are no longer auto-rendered :ref:`(Deprecation entry) <deprecation-107057-1756471326>`
The following asset ViewHelper arguments and options have been removed:
- The :html:`useNonce` argument of the :html:`f:asset.script` and :html:`f:asset.css` ViewHelpers has been removed. Use the :html:`csp` argument instead. :ref:`(Deprecation entry) <deprecation-100887-1774712028>`
- The :php:`useNonce` option key for JavaScript and stylesheet assets added via :php:`\TYPO3\CMS\Core\Page\AssetCollector` has been removed. Use the :php:`csp` option instead. :ref:`(Deprecation entry) <deprecation-100887-1774712028>`
The following FormEngine result array keys have been removed:
- :php:`additionalHiddenFields`, hidden fields are now added to the :php:`html` key directly :ref:`(Deprecation entry) <deprecation-109102-1740480000>`
The following cache action array keys have been removed:
- :php:`href` in cache actions registered via :php:`\TYPO3\CMS\Backend\Backend\Event\ModifyClearCacheActionsEvent`; use :php:`endpoint` instead :ref:`(Deprecation entry) <deprecation-109107-1772108218>`
The following features are now always enabled:
- :php:`extbase.consistentDateTimeHandling` - Extbase DateTime persistence is aligned with FormEngine and DataHandler, the feature flag has been dropped :ref:`(Feature introduction) <important-106467-1743452295>`
Impact
======
Using above removed functionality will most likely raise PHP fatal level errors,
may change website output or crashes browser JavaScript.
.. index:: Backend, CLI, Database, FlexForm, Fluid, Frontend, JavaScript, LocalConfiguration, PHP-API, RTE, TCA, TSConfig, TypoScript, PartiallyScanned
@@ -0,0 +1,67 @@
.. include:: /Includes.rst.txt
.. _breaking-109811-1759230001:
============================================================
Breaking: #109811 - Removed "afterFormStateInitialized" hook
============================================================
See :issue:`109811`
Description
===========
The hook
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/form']['afterFormStateInitialized']`
has been removed in favor of the PSR-14 event
:php:`\TYPO3\CMS\Form\Event\AfterFormStateInitializedEvent`.
In addition, the interface
:php:`\TYPO3\CMS\Form\Domain\Runtime\FormRuntime\Lifecycle\AfterFormStateInitializedInterface`
has been removed as it was only used by the hook.
Impact
======
Hook implementations registered under :php:`afterFormStateInitialized` are
no longer executed in TYPO3 v15.0 and later.
Classes implementing
:php:`\TYPO3\CMS\Form\Domain\Runtime\FormRuntime\Lifecycle\AfterFormStateInitializedInterface`
will cause a PHP fatal error.
Affected installations
======================
TYPO3 installations with custom extensions using this hook or implementing
:php:`AfterFormStateInitializedInterface` are affected.
The extension scanner reports any usage as a strong match.
Migration
=========
Register a PSR-14 event listener for
:php:`\TYPO3\CMS\Form\Event\AfterFormStateInitializedEvent` instead:
.. code-block:: php
:caption: EXT:my_extension/Classes/EventListener/MyAfterFormStateInitializedEventListener.php
use TYPO3\CMS\Core\Attribute\AsEventListener;
use TYPO3\CMS\Form\Event\AfterFormStateInitializedEvent;
#[AsEventListener(identifier: 'my-extension/after-form-state-initialized')]
final readonly class MyAfterFormStateInitializedEventListener
{
public function __invoke(AfterFormStateInitializedEvent $event): void
{
// Access $event->formRuntime->getFormState() here
}
}
Remove the hook registration from :file:`ext_localconf.php` and the
:php:`AfterFormStateInitializedInterface` implementation from your hook class.
See also the :ref:`Feature entry <feature-109811-1759230000>`.
.. index:: Frontend, ext:form, FullyScanned
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _breaking-109849-1716115200:
=============================================================================
Breaking: #109849 - Removed "buildFormDefinitionValidationConfiguration" hook
=============================================================================
See :issue:`109849`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/form']['buildFormDefinitionValidationConfiguration']`
has been removed in favor of the new PSR-14 event
:php:`\TYPO3\CMS\Form\Event\AfterFormDefinitionValidationConfigurationIsBuiltEvent`.
Impact
======
Any hook implementation registered under this identifier will no longer be
executed.
Affected installations
======================
TYPO3 installations with custom extensions that register a hook class under
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/form']['buildFormDefinitionValidationConfiguration']`
are affected.
Migration
=========
The hook has been removed without a deprecation phase to allow extensions to
remain compatible with both TYPO3 v14 (using the hook) and v15+ (using the
new event). Implementing the PSR-14 event provides the same or greater control.
Use the :ref:`AfterFormDefinitionValidationConfigurationIsBuiltEvent <feature-109849-1716115200>`
to achieve the same functionality with the new event-based system.
.. index:: Backend, ext:form, FullyScanned
@@ -0,0 +1,63 @@
.. include:: /Includes.rst.txt
.. _breaking-109926-1780171221:
==========================================================================
Breaking: #109926 - Removed extbase parameter type evaluation via DocBlock
==========================================================================
See :issue:`109926`
Description
===========
Extbase resolved the target type of a controller action argument (and other
reflected method parameters) from the method DocBlock when no native PHP type
declaration was given:
.. code-block:: php
/**
* @param \MyVendor\MyExtension\Domain\Model\MyModel $item
*/
public function showAction($item): ResponseInterface
This fallback was deprecated with :ref:`#94115 <deprecation-94115>` in TYPO3 v11
in favor of native PHP type declarations. It has now been removed.
As part of this removal, the internal helper class
:php:`\TYPO3\CMS\Extbase\Reflection\DocBlock\Tags\Null_`, which only existed to
silence DocBlock parsing of this argument resolution, has been removed.
Impact
======
The type of a method parameter is now solely determined from its native PHP type
declaration. A parameter that relies on a :php:`@param` DocBlock tag without a
native type declaration no longer receives a type.
For controller actions this means an
:php:`\TYPO3\CMS\Extbase\Mvc\Exception\InvalidArgumentTypeException` is thrown
when the action is dispatched. In combination with a :php:`#[Validate]`
attribute, an
:php:`\TYPO3\CMS\Extbase\Validation\Exception\InvalidTypeHintException` is thrown
while the class schema is built.
Affected installations
======================
Extbase extensions with controller actions or other reflected methods that still
declare argument types via :php:`@param` DocBlock tags instead of native PHP type
declarations. Such code has emitted a deprecation since TYPO3 v11 and, for the
:php:`#[Validate]` case, already raised a runtime exception since v12.
Migration
=========
Use native PHP type declarations, available since TYPO3 v10:
.. code-block:: php
public function showAction(\MyVendor\MyExtension\Domain\Model\MyModel $item): ResponseInterface
.. index:: PHP-API, NotScanned, ext:extbase
@@ -0,0 +1,107 @@
.. include:: /Includes.rst.txt
.. _breaking-109998-1780583751:
==================================
Breaking: #109998 - Removed jQuery
==================================
See :issue:`109998`
Description
===========
The jQuery JavaScript library is no longer shipped with TYPO3. All remaining
usages in the TYPO3 backend have been migrated to native DOM APIs.
In detail, the following pieces have been removed:
- The bundled library file
:file:`EXT:core/Resources/Public/JavaScript/Contrib/jquery.js`
- The import map entries :js:`jquery` and :js:`jquery/` provided by EXT:core
- The JavaScript module :js:`@typo3/backend/multi-step-wizard.js` together
with its global :js:`TYPO3.MultiStepWizard` object
Note that :js:`@typo3/backend/multi-step-wizard.js` has been removed without
a prior deprecation phase. It was the recommended migration target when
:js:`@typo3/backend/wizard.js` was deprecated with TYPO3 v13.1
:ref:`(Deprecation entry) <deprecation-103230-1709202638>`. The module is
unused within TYPO3 itself since v14.2, when the form and translation wizards
switched to the internal :js:`typo3-backend-wizard` web component.
Furthermore, a couple of JavaScript API signatures changed because they
returned or received jQuery objects before:
- :js:`FormEngine.getFieldElement()` now returns a native :js:`HTMLElement`
or :js:`null` instead of a jQuery collection
- The callbacks of the preview, new, duplicate and delete doc header actions
of :js:`@typo3/backend/form-engine.js` (for example
:js:`FormEngine.showPreviewModal()`) now receive a native
:js:`HTMLInputElement` or :js:`HTMLAnchorElement` instead of a jQuery
object
- The :js:`@typo3/backend/modal.js` API no longer accepts jQuery objects as
modal content
Impact
======
Extensions that import :js:`jquery` in their backend JavaScript modules will
fail to load those modules in the browser because the bare module specifier
can no longer be resolved.
Extensions using :js:`@typo3/backend/multi-step-wizard.js` or the
:js:`TYPO3.MultiStepWizard` global will fail accordingly.
Extensions calling the changed :js:`FormEngine` and :js:`Modal` methods with
jQuery semantics will trigger JavaScript errors.
Affected installations
======================
All installations with extensions that load jQuery via the TYPO3 core import
map, use the multi step wizard module, or rely on the jQuery based
:js:`FormEngine` and :js:`Modal` API signatures in their backend JavaScript.
Migration
=========
jQuery
------
Extensions that still depend on jQuery need to ship their own copy of the
library and register it in their import map configuration:
.. code-block:: php
:caption: EXT:my_extension/Configuration/JavaScriptModules.php
return [
'dependencies' => ['core'],
'imports' => [
'jquery' => 'EXT:my_extension/Resources/Public/JavaScript/Contrib/jquery.js',
],
];
Consider migrating extension JavaScript to native DOM APIs instead.
Multi step wizard
-----------------
There is no direct replacement for the removed
:js:`@typo3/backend/multi-step-wizard.js` module. TYPO3 itself uses the
:js:`typo3-backend-wizard` web component, which is currently internal and
provides no API stability guarantees yet. Extensions should either bring
their own wizard implementation, or copy the removed module into their own
codebase together with a bundled jQuery.
FormEngine
----------
Adapt callers of the changed :js:`FormEngine` methods to the native return
types:
.. code-block:: diff
-const field = FormEngine.getFieldElement(fieldName).get(0);
+const field = FormEngine.getFieldElement(fieldName);
.. index:: Backend, JavaScript, NotScanned, ext:backend
@@ -0,0 +1,33 @@
.. include:: /Includes.rst.txt
.. _breaking-110023-1780947379:
============================================
Breaking: #110023 - Harden type declarations
============================================
See :issue:`110023`
Description
===========
The following PHP methods now use strict type declarations
instead of loose type hints (PHPdoc annotations).
This is considered a breaking change in case consumers are
not adjusted for strict types.
- :php:`\TYPO3\CMS\Backend\Utility::daysUntil` - Parameter `$tstamp` can now only be of type `integer` or `DateTimeInterface` - cast to `(int)` if strings were passed to this argument before.
Impact
======
Using the mentioned methods with wrong types will now result in a PHP exception, fatal error or warning,
depending on configured error reporting.
Migration
=========
Ensure proper PHP type declarations are used when calling these methods.
.. index:: PHP-API, NotScanned, Backend
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _breaking-110027-1781042985:
==============================================================
Breaking: #110027 - StandardContentPreviewRenderer streamlined
==============================================================
See :issue:`110027`
Description
===========
:php:`\TYPO3\CMS\Backend\Preview\StandardContentPreviewRenderer` has been turned
into a stateless, dependency-injected service. It is now declared :php:`final`
and can no longer be subclassed. The lazy `initialize()` workaround that
resolved its dependencies through
:php:`\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance()` on first use has
been removed, and all dependencies are passed through the constructor instead.
Impact
======
Custom preview renderers extending
:php:`\TYPO3\CMS\Backend\Preview\StandardContentPreviewRenderer` raise a fatal
error, as the class is now :php:`final`.
Affected installations
======================
Instances with third-party extensions that subclass
:php:`StandardContentPreviewRenderer` or instantiate it manually.
Migration
=========
Instead of subclassing :php:`StandardContentPreviewRenderer`, implement
:php:`\TYPO3\CMS\Backend\Preview\PreviewRendererInterface` directly. The standard
renderer may be composed and its rendering methods delegated to where its output
is desired, as :php:`\TYPO3\CMS\Form\Preview\FormPagePreviewRenderer` demonstrates.
.. index:: Backend, PHP-API, NotScanned, ext:backend
@@ -0,0 +1,72 @@
.. include:: /Includes.rst.txt
.. _breaking-110028-1781047680:
=============================================================================
Breaking: #110028 - LoggerAwareInterface removed from FormEngine base classes
=============================================================================
See :issue:`110028`
Description
===========
The FormEngine base classes
:php:`\TYPO3\CMS\Backend\Form\AbstractNode` and
:php:`\TYPO3\CMS\Backend\Form\FormDataProvider\AbstractDatabaseRecordProvider`
no longer implement :php:`\Psr\Log\LoggerAwareInterface` and no longer use
:php:`\Psr\Log\LoggerAwareTrait`.
Both base classes never read the injected logger themselves. The node hierarchy
built on :php:`AbstractNode` does not use a logger at all. The two data provider
subclasses that did log, :php:`\TYPO3\CMS\Backend\Form\FormDataProvider\TcaFiles`
and :php:`\TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline`, now receive a
:php:`\Psr\Log\LoggerInterface` through their constructor instead.
Impact
======
Subclasses of these base classes, for example custom FormEngine nodes or custom
database record providers shipped by extensions, are no longer recognized as
:php:`\Psr\Log\LoggerAwareInterface` instances and no longer have a logger
injected automatically. The inherited :php:`setLogger()` method is gone, and
reading the previously inherited :php:`$logger` property raises an error.
Affected installations
======================
Instances with third-party extensions that subclass
:php:`\TYPO3\CMS\Backend\Form\AbstractNode` or
:php:`\TYPO3\CMS\Backend\Form\FormDataProvider\AbstractDatabaseRecordProvider`
and rely on the automatically injected logger.
Migration
=========
Request a :php:`\Psr\Log\LoggerInterface` as a constructor argument in the
affected subclass. The subclass must be registered as a public service using the
:php:`#[Autoconfigure(public: true)]` attribute, so that the FormEngine
:php:`\TYPO3\CMS\Backend\Form\NodeFactory` obtains it through the dependency
injection container, which then resolves the constructor argument automatically.
.. code-block:: php
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
use TYPO3\CMS\Backend\Form\AbstractNode;
#[Autoconfigure(public: true)]
final class MyFormElement extends AbstractNode
{
public function __construct(
private readonly LoggerInterface $logger,
) {}
public function render(): array
{
$this->logger->warning('Something the element wants to log');
// ...
}
}
.. index:: Backend, PHP-API, NotScanned, ext:backend
@@ -0,0 +1,61 @@
.. include:: /Includes.rst.txt
.. _breaking-110196-1784119109:
===========================================================
Breaking: #110196 - PHP class Rfc822AddressesParser removed
===========================================================
See :issue:`110196`
Description
===========
The PHP class :php:`\TYPO3\CMS\Core\Mail\Rfc822AddressesParser` has been
removed. The class was a modernized copy of the PEAR package
:composer:`pear/mail`, dating back to 2010, and was only used internally by
:php:`\TYPO3\CMS\Core\Utility\MailUtility::parseAddresses()`.
This internal usage is now based on :php:`\Symfony\Component\Mime\Address`
of the :composer:`symfony/mime` package, which TYPO3 already utilizes for
sending emails.
Impact
======
Instantiating or referencing the class :php:`Rfc822AddressesParser` will raise
a fatal PHP error.
In addition, :php:`MailUtility::parseAddresses()` now strips surrounding
double quotes from display names: parsing
:php:`'"last, first" <email@example.org>'` previously returned the display
name :php:`'"last, first"'` and now returns :php:`'last, first'`. Quoting is
re-applied automatically by :composer:`symfony/mime` when composing a mail
message.
Affected installations
======================
TYPO3 installations with third-party extensions directly using the class
:php:`Rfc822AddressesParser`. The extension scanner reports any usage as a
strong match.
Migration
=========
To parse a comma-separated list of email addresses with optional display
names, use :php:`\TYPO3\CMS\Core\Utility\MailUtility::parseAddresses()`,
which continues to work as before.
Alternatively, use the :composer:`symfony/mime` API directly to parse a
single mailbox string:
.. code-block:: php
use Symfony\Component\Mime\Address;
$address = Address::create('John Doe <john.doe@example.org>');
$email = $address->getAddress();
$name = $address->getName();
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,35 @@
.. include:: /Includes.rst.txt
.. _breaking-110211-1784210220:
====================================================
Breaking: #110211 - Raise minimum PHP version to 8.5
====================================================
See :issue:`110211`
Description
===========
The minimum PHP version required to run TYPO3 has been raised to PHP 8.5.
Impact
======
The TYPO3 Core codebase and extensions tailored for this version can use
features implemented with PHP up to and including 8.5. Running TYPO3 with
older PHP versions will trigger fatal errors.
Affected installations
======================
All installations running a PHP version lower than 8.5.
Migration
=========
Update the PHP platform to PHP 8.5 before upgrading to this TYPO3 version.
Previous TYPO3 versions already support PHP 8.5, which allows upgrading
the PHP platform in a first step and TYPO3 in a second step.
.. index:: PHP-API, NotScanned, ext:core
@@ -0,0 +1,61 @@
.. include:: /Includes.rst.txt
.. _breaking-110218-1784306183:
==================================================
Breaking: #110218 - Class LogRecord declared final
==================================================
See :issue:`110218`
Description
===========
The PHP class :php:`\TYPO3\CMS\Core\Log\LogRecord` — the value object passed
to log writers and processors — has been declared :php:`final` and is now
instantiated directly via :php:`new` within
:php:`\TYPO3\CMS\Core\Log\Logger`, instead of using
:php:`GeneralUtility::makeInstance()`.
A log record is a plain data transfer object created for every single log
entry. Routing its creation through :php:`makeInstance()` allowed the class
to be overridden via XCLASS, but caused an unnecessary container lookup in
one of the most frequently executed code paths of the logging API.
In addition, the class now declares :php:`strict_types` and uses native
type declarations for all method signatures instead of loose PHPDoc
annotations.
Impact
======
Extending or XCLASSing :php:`LogRecord` is not possible anymore. Extension
classes will raise a fatal PHP error, XCLASS configurations for this class
are silently ignored.
Calling a method of :php:`LogRecord` with a wrong argument type — for
example a non-float value for :php:`setCreated()` — will raise a PHP
:php:`\TypeError`, depending on the :php:`strict_types` mode of the
calling code.
Creating, reading and modifying log records — for example in custom
implementations of
:php:`\TYPO3\CMS\Core\Log\Processor\ProcessorInterface` or
:php:`\TYPO3\CMS\Core\Log\Writer\WriterInterface` — continues to work as
before.
Affected installations
======================
TYPO3 installations with third-party extensions that extend or XCLASS the
class :php:`LogRecord`, which is very unlikely.
Migration
=========
To enrich or modify log records, implement a custom log processor
(:php:`ProcessorInterface`), which may return a modified or newly created
:php:`LogRecord` instance. Custom output handling belongs into a log writer
(:php:`WriterInterface`).
.. index:: PHP-API, NotScanned, ext:core
@@ -0,0 +1,83 @@
.. include:: /Includes.rst.txt
.. _breaking-110219-1784306184:
============================================================
Breaking: #110219 - Log request ID provided by log processor
============================================================
See :issue:`110219`
Description
===========
The unique ID of the current request, used to correlate all log entries
written during a single request, was previously passed as constructor
argument from :php:`\TYPO3\CMS\Core\Log\LogManager` to every
:php:`\TYPO3\CMS\Core\Log\Logger` instance, which in turn copied it into
each created :php:`\TYPO3\CMS\Core\Log\LogRecord`.
The request ID is now added to log records at logging time by the new log
processor :php:`\TYPO3\CMS\Core\Log\Processor\RequestIdProcessor`, which
:php:`LogManager` attaches automatically to every logger it creates, for
all severity levels covered by the configured log writers. The processor
is registered internally on purpose — not via
:php:`$GLOBALS['TYPO3_CONF_VARS']['LOG']` — so it cannot be removed
accidentally by overriding the global processor configuration.
The following method signatures have changed:
- :php:`Logger::__construct()` no longer accepts a second
:php:`$requestId` argument, the protected property
:php:`Logger::$requestId` has been removed
- :php:`LogManager::__construct()` now expects a
:php:`\TYPO3\CMS\Core\Core\RequestId` object instead of a string, and
creates one itself if omitted
- The protected method :php:`LogManager::makeLogger()` no longer receives
a :php:`$requestId` argument
The generated log output is unchanged: log records written by configured
writers carry the same request ID as before, available via
:php:`LogRecord::getRequestId()`.
Impact
======
Instantiating :php:`LogManager` with a string request ID will raise a PHP
:php:`\TypeError`.
Passing a second argument to the :php:`Logger` constructor is ignored.
Log records created by a manually instantiated :php:`Logger` — bypassing
:php:`LogManager` — no longer contain a request ID, unless the
:php:`RequestIdProcessor` is attached manually.
Affected installations
======================
TYPO3 installations with third-party extensions instantiating
:php:`Logger` or :php:`LogManager` directly with a custom request ID,
which is very unlikely. Extensions obtaining loggers via dependency
injection, the :php:`#[Channel]` attribute, :php:`LoggerAwareInterface`
or :php:`LogManager->getLogger()` are not affected.
Migration
=========
Obtain loggers through dependency injection or
:php:`LogManager->getLogger()`, which attach the
:php:`RequestIdProcessor` automatically.
For manually created loggers that should add the request ID to their
log records, attach the processor explicitly:
.. code-block:: php
use TYPO3\CMS\Core\Core\RequestId;
use TYPO3\CMS\Core\Log\Logger;
use TYPO3\CMS\Core\Log\Processor\RequestIdProcessor;
$logger = new Logger('my.channel');
$logger->addWriter(LogLevel::WARNING, $myWriter);
$logger->addProcessor(LogLevel::WARNING, new RequestIdProcessor(new RequestId()));
.. index:: PHP-API, NotScanned, ext:core
@@ -0,0 +1,52 @@
.. include:: /Includes.rst.txt
.. _breaking-110221-1784306185:
===============================================
Breaking: #110221 - Class Logger declared final
===============================================
See :issue:`110221`
Description
===========
The PHP class :php:`\TYPO3\CMS\Core\Log\Logger` has been declared
:php:`final` and is now instantiated directly via :php:`new` within
:php:`\TYPO3\CMS\Core\Log\LogManager`, instead of using
:php:`GeneralUtility::makeInstance()`.
The logger is a plain, per-channel object created and configured by the
:php:`LogManager`. Routing its creation through :php:`makeInstance()` only
served to allow overriding the class via XCLASS, which is not a supported
extension point for the logging API.
Impact
======
Extending or XCLASSing :php:`Logger` is not possible anymore. Extension
classes will raise a fatal PHP error, XCLASS configurations for this class
are silently ignored.
Obtaining and using loggers via dependency injection, the :php:`#[Channel]`
attribute, :php:`LoggerAwareInterface` or
:php:`LogManager->getLogger()` continues to work as before.
Affected installations
======================
TYPO3 installations with third-party extensions that extend or XCLASS the
class :php:`Logger`, which is very unlikely.
Migration
=========
To customize logging behavior, implement the PSR-3
:php:`\Psr\Log\LoggerInterface` and provide the instances through a custom
:php:`\TYPO3\CMS\Core\Log\LogManagerInterface` implementation, or attach
custom log writers (:php:`\TYPO3\CMS\Core\Log\Writer\WriterInterface`) and
processors (:php:`\TYPO3\CMS\Core\Log\Processor\ProcessorInterface`) to the
existing logger, which is the designated way to influence how log records
are handled.
.. index:: PHP-API, NotScanned, ext:core
@@ -0,0 +1,62 @@
.. include:: /Includes.rst.txt
.. _breaking-110250-1785315899:
===================================================================
Breaking: #110250 - Remove implicit output buffering from Bootstrap
===================================================================
See :issue:`110250`
Description
===========
The class :php:`\TYPO3\CMS\Core\Core\Bootstrap` no longer wraps the entire
bootstrap and request lifecycle in an implicit output buffer via
:php:`ob_start()`. This buffer was historically opened as the very first
action in :php:`Bootstrap::init()` to swallow accidental stray output
(warnings, notices or stray :php:`echo`/:php:`print` statements, typically
from :php:`ext_localconf.php`/:php:`ext_tables.php` of third-party
extensions) so it would not corrupt AJAX responses or file downloads. On
CLI this buffering was already disabled again in a previous change, as it
delayed console output until the process ended and could bloat memory for
commands producing a lot of output.
Since responses are fully assembled as PSR-7 message bodies before being
emitted, this legacy safety net is not needed anymore.
Along with it, the now unused method
:php:`Bootstrap::startOutputBuffering()` has been removed.
Impact
======
Any stray output produced during bootstrap (for example from
:php:`ext_localconf.php`) is now sent to the client directly instead of
being silently discarded later on. This mainly affects binary/file
responses and AJAX requests, which relied on the buffer being cleaned
right before the response body was emitted.
Calling :php:`Bootstrap::startOutputBuffering()` now results in a fatal
PHP error (:php:`Call to undefined method`).
Affected installations
======================
TYPO3 installations with extensions that produce accidental output during
:php:`ext_localconf.php`/:php:`ext_tables.php` loading, which so far was
silently swallowed, and installations with custom entry point scripts
calling :php:`Bootstrap::startOutputBuffering()` directly.
Migration
=========
Remove any accidental output from :php:`ext_localconf.php` and
:php:`ext_tables.php` files. Extensions that need to suppress their own
output must manage output buffering (:php:`ob_start()` /
:php:`ob_end_clean()`) themselves.
Remove calls to :php:`Bootstrap::startOutputBuffering()` and use
:php:`ob_start()` directly, if the behaviour is still required.
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,131 @@
.. include:: /Includes.rst.txt
.. _breaking-110277-1784812454:
======================================================================
Breaking: #110277 - File renderer registration and interface changed
======================================================================
See :issue:`110277`
Description
===========
File renderers, used for example by the :html:`<f:media>` ViewHelper to
render audio, video or online media files, are now registered as tagged
services via dependency injection (see
:ref:`feature-110277-1784812454`). This comes with the following breaking
changes:
- :php:`\TYPO3\CMS\Core\Resource\Rendering\RendererRegistry->registerRendererClass()`
is now a no-op. Calling the method has no effect anymore, but triggers
an :php:`E_USER_DEPRECATED` notice. The method will be removed in
TYPO3 v16.0.
- :php:`\TYPO3\CMS\Core\Resource\Rendering\FileRendererInterface` does
not extend :php:`\TYPO3\CMS\Core\SingletonInterface` anymore. File
renderers are shared services managed by the dependency injection
container.
- The method :php:`getPriority()` has been removed from
:php:`FileRendererInterface`. The renderer priority is now defined at
registration time via the :php:`#[AsFileRenderer]` attribute or the
:yaml:`fal.file_renderer` service tag. Note that the file renderers
shipped with TYPO3 Core previously returned a priority of :php:`1`
from :php:`getPriority()` and are now registered with the attribute's
default priority of :php:`0`. Custom renderers that relied on a
priority of :php:`0` to rank strictly below all Core renderers now
rank equally with them instead and should use a negative priority to
keep the previous ordering.
- Renderers registered with the same priority are no longer guaranteed
to be asked in the order they were added: previously, same-priority
renderers kept the order in which
:php:`RendererRegistry->registerRendererClass()` was called from
:file:`ext_localconf.php`. The order of same-priority tagged services
is now an implementation detail of the dependency injection container
and must not be relied upon. Extensions that depend on a specific
evaluation order between renderers should assign distinct priorities
instead.
- The remaining methods of :php:`FileRendererInterface` are now
strictly typed: :php:`canRender(FileInterface $file): bool` and
:php:`render(FileInterface $file, int|string $width, int|string $height, array $options = []): string`.
- The methods :php:`createRendererInstance()` and
:php:`compareRendererPriority()` have been removed from
:php:`RendererRegistry`, the method :php:`getRendererInstances()` has
been changed from public to protected visibility, and the remaining
methods are now strictly typed.
- :php:`RendererRegistry` is now marked as :php:`@internal`, since
registering file renderers does not require interacting with the
registry anymore. TYPO3 Core resolves the matching renderer via
:php:`getRenderer()` internally, for example in the
:html:`<f:media>` ViewHelper.
Impact
======
File renderers registered via
:php:`RendererRegistry->registerRendererClass()` in
:file:`ext_localconf.php` are no longer evaluated. The corresponding
files (audio, video or online media) are no longer rendered by the custom
renderer until it is registered as a tagged service.
Custom renderer classes implementing :php:`FileRendererInterface` without
the adapted method signatures will cause a fatal PHP error.
Affected installations
======================
All installations with custom extensions registering file renderers via
:php:`RendererRegistry->registerRendererClass()`, or providing custom
implementations of :php:`FileRendererInterface`. The extension scanner
reports usages of :php:`registerRendererClass()` as weak match.
Migration
=========
Remove the :php:`RendererRegistry->registerRendererClass()` call from
:file:`ext_localconf.php` and add the :php:`#[AsFileRenderer]` attribute
to the renderer class instead. Move the priority previously returned by
:php:`getPriority()` to the attribute and remove the method. Add the
native type declarations to :php:`canRender()` and :php:`render()`:
.. code-block:: php
:caption: EXT:my_extension/Classes/Resource/Rendering/MyVideoRenderer.php
use TYPO3\CMS\Core\Attribute\AsFileRenderer;
use TYPO3\CMS\Core\Resource\FileInterface;
use TYPO3\CMS\Core\Resource\Rendering\FileRendererInterface;
#[AsFileRenderer(priority: 10)]
final class MyVideoRenderer implements FileRendererInterface
{
public function canRender(FileInterface $file): bool
{
// ...
}
public function render(FileInterface $file, int|string $width, int|string $height, array $options = []): string
{
// ...
}
}
In case the extension supports both TYPO3 v14 and v15, keep the
:php:`getPriority()` method (it is simply unused in v15) and register the
renderer in both ways: the :file:`ext_localconf.php` registration is
evaluated in v14, the attribute in v15. Since PHP parameter types must
not be narrowed in implementations, keep the :php:`$width` and
:php:`$height` parameters untyped in this case — only the :php:`bool`
and :php:`string` return type declarations are compatible with both
versions.
Code that called :php:`RendererRegistry->getRendererInstances()` to
inspect all registered renderers should inject :php:`RendererRegistry`
and use :php:`getRenderer($file)` to retrieve the matching renderer for
a given file instead.
.. index:: FAL, PHP-API, PartiallyScanned, ext:core
@@ -0,0 +1,64 @@
.. include:: /Includes.rst.txt
.. _breaking-110319-1785315901:
==============================================================================
Breaking: #110319 - Encryption key is checked before ext_localconf.php loading
==============================================================================
See :issue:`110319`
Description
===========
:php:`\TYPO3\CMS\Core\Core\Bootstrap` verifies that
:php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']` is not empty and
throws a :php:`\RuntimeException` otherwise. This check has been moved to
run *before* the :php:`ext_localconf.php` files of all active extensions are
loaded. Previously it ran afterwards, and additionally after
:php:`$GLOBALS['TCA']` had been populated.
The encryption key is part of the system configuration and is used for
security-relevant functionality. It must therefore be in place before any
extension code is executed during bootstrap.
In addition, :php:`$GLOBALS['TCA']` is now assigned after
:php:`TcaSchemaFactory->load()` has been called, so consumers can not
observe a state where the global array is populated but the schema
information is not yet available.
Impact
======
Installations that set :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']`
from within an :php:`ext_localconf.php` file now run into the
"TYPO3 Encryption Key is empty" exception, as the check is executed before
the file is evaluated.
Code within :php:`ext_localconf.php` files can not rely on
:php:`$GLOBALS['TCA']` being available anymore - which was never a
guaranteed state, as :php:`ext_localconf.php` files are loaded before TCA
is built. This is unchanged, but the assignment now happens later within
the bootstrap.
Affected installations
======================
Installations that populate the encryption key at runtime from an
:php:`ext_localconf.php` file, for instance by reading it from an
environment variable or an external secret store.
Migration
=========
Set the encryption key in the system configuration, either directly in
:file:`config/system/settings.php` or in
:file:`config/system/additional.php`, both of which are evaluated before
the check:
.. code-block:: php
:caption: config/system/additional.php
$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = getenv('TYPO3_ENCRYPTION_KEY');
.. index:: LocalConfiguration, PHP-API, NotScanned, ext:core
@@ -0,0 +1,58 @@
.. include:: /Includes.rst.txt
.. _breaking-110319-1785315902:
=============================================================
Breaking: #110319 - Removed unused internal Bootstrap methods
=============================================================
See :issue:`110319`
Description
===========
The following methods of :php:`\TYPO3\CMS\Core\Core\Bootstrap` have been
removed:
- :php:`Bootstrap::baseSetup()`
- :php:`Bootstrap::createConfigurationManager()`
- :php:`Bootstrap::populateLocalConfiguration()`
All three were marked :php:`@internal` and are not used by TYPO3 Core
anymore. :php:`Bootstrap::baseSetup()` only registered the class loading
information in non-Composer mode, which :php:`Bootstrap::init()` does
itself. The two configuration related methods have been inlined into
:php:`Bootstrap::init()`, as they consisted of a single statement each.
Impact
======
Calling one of the removed methods results in a fatal PHP error
(:php:`Call to undefined method`).
Affected installations
======================
TYPO3 installations with third-party extensions or custom entry point
scripts that call :php:`Bootstrap::baseSetup()` or
:php:`Bootstrap::createConfigurationManager()` directly - a pattern
sometimes used in custom, non-Composer bootstrapping scripts.
:php:`Bootstrap::populateLocalConfiguration()` was already
:php:`protected` and could not be called from the outside.
The extension scanner reports possible usages.
Migration
=========
Remove calls to :php:`Bootstrap::baseSetup()`,
:php:`Bootstrap::init()` performs the equivalent setup internally.
Replace :php:`Bootstrap::createConfigurationManager()` with a direct
instantiation:
.. code-block:: php
$configurationManager = new \TYPO3\CMS\Core\Configuration\ConfigurationManager();
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,64 @@
.. include:: /Includes.rst.txt
.. _deprecation-110148-1751533200:
=======================================================
Deprecation: #110148 - Experimental backend ViewHelpers
=======================================================
See :issue:`110148`
Description
===========
The following experimental backend-related Fluid ViewHelpers have been marked
as deprecated:
* :php:`\TYPO3\CMS\Fluid\ViewHelpers\Be\PagePathViewHelper` (:html:`<f:be.pagePath>`)
* :php:`\TYPO3\CMS\Fluid\ViewHelpers\Be\AbstractBackendViewHelper`
The :php:`PagePathViewHelper` rendered the current page path as displayed in
TYPO3 backend modules. This information is nowadays part of the module doc
header, which is rendered by :php:`\TYPO3\CMS\Backend\Template\ModuleTemplate`
within the corresponding controller.
The abstract :php:`AbstractBackendViewHelper` provided the helper methods
:php:`getModuleTemplate()` and :php:`getPageRenderer()`. Both are obsolete with
the current :php:`ModuleTemplate` view strategy and dependency injection, and
the class is no longer used as a base class within TYPO3 Core.
Impact
======
Using the :html:`<f:be.pagePath>` ViewHelper in a Fluid template will trigger a
PHP :php:`E_USER_DEPRECATED` error.
Extending :php:`AbstractBackendViewHelper` or calling its methods
:php:`getModuleTemplate()` or :php:`getPageRenderer()` will trigger a PHP
:php:`E_USER_DEPRECATED` error.
Both classes will be removed in TYPO3 v16.0.
Affected installations
======================
All installations using the :html:`<f:be.pagePath>` ViewHelper in backend Fluid
templates, or custom backend ViewHelpers extending
:php:`AbstractBackendViewHelper`.
The extension scanner reports any usage of the affected classes as strong match.
Migration
=========
For the page path, use the doc header provided by
:php:`\TYPO3\CMS\Backend\Template\ModuleTemplate` in your backend controller,
which already displays the current page path.
Custom backend ViewHelpers should extend
:php:`\TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper` directly and
retrieve :php:`\TYPO3\CMS\Backend\Template\ModuleTemplate` or
:php:`\TYPO3\CMS\Core\Page\PageRenderer` via dependency injection instead of the
removed helper methods.
.. index:: Fluid, FullyScanned, ext:fluid
@@ -0,0 +1,58 @@
.. include:: /Includes.rst.txt
.. _deprecation-110202-1784146595:
===================================================================
Deprecation: #110202 - StringUtility::multibyteStringPad() method
===================================================================
See :issue:`110202`
Description
===========
The method :php:`\TYPO3\CMS\Core\Utility\StringUtility::multibyteStringPad()`
has been marked as deprecated and will be removed in TYPO3 v16.0.
The method was introduced to provide a multibyte-safe variant of PHP's
:php:`str_pad()`. Since PHP 8.3, the native function :php:`mb_str_pad()`
covers exactly this use case, making the TYPO3 wrapper obsolete.
Impact
======
Calling the method will trigger a PHP deprecation warning. It will continue
to work as before until it is removed in TYPO3 v16.0.
Affected installations
======================
TYPO3 installations with custom extensions or code that directly call
:php:`StringUtility::multibyteStringPad()` are affected.
The extension scanner will report any usage as a **strong match**.
Migration
=========
Use the native PHP function :php:`mb_str_pad()` instead.
Note that :php:`mb_str_pad()` throws a :php:`\ValueError` when an empty pad
string is passed, whereas :php:`StringUtility::multibyteStringPad()` returned
the input unchanged. If an empty pad string can occur, guard against it.
.. code-block:: php
:caption: Before (deprecated)
use TYPO3\CMS\Core\Utility\StringUtility;
$padded = StringUtility::multibyteStringPad($string, 10, $padString, STR_PAD_LEFT);
.. code-block:: php
:caption: After (recommended)
$padded = $padString === ''
? $string
: mb_str_pad($string, 10, $padString, STR_PAD_LEFT);
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,58 @@
.. include:: /Includes.rst.txt
.. _deprecation-110285-1784678400:
======================================================
Deprecation: #110285 - DataHandler->setCorrelationId()
======================================================
See :issue:`110285`
Description
===========
The method
:php:`\TYPO3\CMS\Core\DataHandling\DataHandler->setCorrelationId()` has been
marked as deprecated and will be removed in TYPO3 v16.0.
The correlation id of a DataHandler operation can now be handed over directly
to :php:`DataHandler->start()` as fifth argument. This also ensures that the
correlation id is passed on to internally spawned sub instances of the
DataHandler, so all record history entries of one logical operation share the
same correlation scope. Setting the correlation id via the setter after
:php:`start()` did not propagate it to sub instances and is therefore
superseded.
Impact
======
Calling :php:`DataHandler->setCorrelationId()` triggers a PHP
:php:`E_USER_DEPRECATED` error.
The extension scanner detects usages of the deprecated method as weak match.
Affected installations
======================
All installations with custom extensions calling
:php:`DataHandler->setCorrelationId()`, usually to group the record history
entries of one logical operation. This is a rarely used API method.
Migration
=========
Pass the :php:`\TYPO3\CMS\Core\DataHandling\Model\CorrelationId` instance
directly to :php:`DataHandler->start()` instead:
.. code-block:: php
// Before
$dataHandler->start($dataMap, $commandMap);
$dataHandler->setCorrelationId($myCorrelationId);
$dataHandler->process_datamap();
// After
$dataHandler->start($dataMap, $commandMap, correlationId: $myCorrelationId);
$dataHandler->process_datamap();
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,59 @@
.. include:: /Includes.rst.txt
.. _feature-109444-1744012800:
===========================================================================
Feature: #109444 - Add default value support for CountrySelect form element
===========================================================================
See :issue:`109444`
Description
===========
The TYPO3 Form Framework's :yaml:`CountrySelect` element now supports a
:yaml:`defaultValue` property. Previously only :yaml:`prioritizedCountries`,
:yaml:`onlyCountries`, and :yaml:`excludeCountries` could be configured — there
was no way to pre-select a country when the form is initially rendered.
The default value can be set in two ways:
* Directly in the YAML form definition.
* Through the new :yaml:`Inspector-CountrySingleSelectEditor` in the Form
Editor backend module.
YAML form definition example:
.. code-block:: yaml
type: CountrySelect
identifier: country-1
label: 'Country'
defaultValue: 'DE'
properties:
onlyCountries:
- DE
- AT
- CH
The new inspector editor is a single-select country dropdown that appears in
the Form Editor's inspector panel. It lists all available countries regardless
of any configured :yaml:`onlyCountries`, :yaml:`excludeCountries`, or
:yaml:`prioritizedCountries` filters. A description hint reminds editors to
ensure the selected country is not excluded by the configured country filters.
If the configured :yaml:`defaultValue` refers to a country that is excluded by
a country filter, the default value has no visible effect on the frontend
because the corresponding :html:`<option>` element will not be rendered.
On the frontend the :yaml:`defaultValue` is resolved through the existing form
framework property binding, so no additional rendering logic is required.
Impact
======
Integrators and editors can now pre-select a country for :yaml:`CountrySelect`
form elements. The default value can be configured via YAML or through the
Form Editor backend module without writing custom code.
.. index:: Backend, ext:form
@@ -0,0 +1,57 @@
.. include:: /Includes.rst.txt
.. _feature-109811-1759230000:
==============================================================
Feature: #109811 - PSR-14 event AfterFormStateInitializedEvent
==============================================================
See :issue:`109811`
Description
===========
A new PSR-14 event :php:`\TYPO3\CMS\Form\Event\AfterFormStateInitializedEvent`
has been introduced. It serves as an improved replacement for the now
:ref:`removed <breaking-109811-1759230001>` hook
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/form']['afterFormStateInitialized']`.
The new event is dispatched by :php:`FormRuntime` after the :php:`FormState`
has been restored from the request. At this point both the form state
(submitted values) and the static form definition are available, which makes
it particularly suitable for enriching components that need runtime data (e.g.
configuring property mapping for file uploads).
The event provides the following public properties:
* :php:`$formRuntime`: The form runtime object (read-only).
* :php:`$request`: The current request (read-only).
Example
=======
An example event listener could look like this:
.. code-block:: php
:caption: EXT:my_extension/Classes/EventListener/MyAfterFormStateInitializedEventListener.php
use TYPO3\CMS\Core\Attribute\AsEventListener;
use TYPO3\CMS\Form\Event\AfterFormStateInitializedEvent;
#[AsEventListener(identifier: 'my-extension/after-form-state-initialized')]
final readonly class MyAfterFormStateInitializedEventListener
{
public function __invoke(AfterFormStateInitializedEvent $event): void
{
// Access $event->formRuntime->getFormState() here
}
}
Impact
======
With the new :php-short:`\TYPO3\CMS\Form\Event\AfterFormStateInitializedEvent`,
it is now possible to react to the form state being fully initialized using the
standard PSR-14 event listener mechanism.
.. index:: Frontend, ext:form
@@ -0,0 +1,68 @@
.. include:: /Includes.rst.txt
.. _feature-109849-1716115200:
=============================================================================
Feature: #109849 - PSR-14 Event after form definition validation config built
=============================================================================
See :issue:`109849`
Description
===========
A new PSR-14 event
:php:`\TYPO3\CMS\Form\Event\AfterFormDefinitionValidationConfigurationIsBuiltEvent`
has been introduced as a replacement for the now
:ref:`removed <breaking-109849-1716115200>` hook
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/form']['buildFormDefinitionValidationConfiguration']`.
The event is dispatched by
:php:`\TYPO3\CMS\Form\Domain\Configuration\ConfigurationService` after the
form definition validation configuration has been built from the form editor
setup. It allows event listeners to add additional writable property paths for
custom form editor inspector editor implementations that do not declare their
writable property paths via the standard YAML configuration (e.g.
:yaml:`propertyPath`).
The event provides the following API:
* :php:`getPrototypeName(): string` The prototype name for which the
configuration was built.
* :php:`getConfiguration(): array` The built validation configuration.
* :php:`setConfiguration(array $configuration): void` Replace the
validation configuration.
Example
=======
An example event listener that adds an additional writable property path
for a custom form element type:
.. code-block:: php
use TYPO3\CMS\Core\Attribute\AsEventListener;
use TYPO3\CMS\Form\Event\AfterFormDefinitionValidationConfigurationIsBuiltEvent;
#[AsEventListener(
identifier: 'my-extension/after-form-definition-validation-configuration-is-built',
)]
final readonly class MyEventListener
{
public function __invoke(AfterFormDefinitionValidationConfigurationIsBuiltEvent $event): void
{
$configuration = $event->getConfiguration();
$configuration['formElements']['MyCustomElement']['additionalPropertyPaths'][]
= 'properties.my.custom.property';
$event->setConfiguration($configuration);
}
}
Impact
======
With the new :php:`AfterFormDefinitionValidationConfigurationIsBuiltEvent`,
it is now possible to extend the form definition validation configuration
using the modern PSR-14 event listener API.
.. index:: Backend, ext:form
@@ -0,0 +1,59 @@
.. include:: /Includes.rst.txt
.. _feature-110259-1784666471:
===========================================================
Feature: #110259 - New PSR-14 AfterFileListRowPreparedEvent
===========================================================
See :issue:`110259`
Description
===========
A new PSR-14 event :php:`\TYPO3\CMS\Filelist\Event\AfterFileListRowPreparedEvent`
has been added to TYPO3 Core. This event is fired after a file or folder row
has been fully prepared for the :guilabel:`Media` module, right before it is
rendered into the final table row markup.
Unlike :php:`\TYPO3\CMS\Filelist\Event\ProcessFileListActionsEvent`, which
only allows modifying the action icons in the control column, this event
provides access to the already-rendered data of *every* column in the row
(for example :php:`name`, :php:`size` or any additional metadata column
added via the column selector), as well as the row's HTML tag attributes.
This closes a gap compared to the classic record list in
:guilabel:`Content > Records`, which has offered an equivalent event
(:php:`\TYPO3\CMS\Backend\RecordList\Event\AfterRecordListRowPreparedEvent`)
for its own rows.
An example event listener could look like this:
.. code-block:: php
:caption: Example event listener class
namespace MyVendor\MyExtension\Form\EventListener;
use TYPO3\CMS\Core\Attribute\AsEventListener;
use TYPO3\CMS\Filelist\Event\AfterFileListRowPreparedEvent;
final class AfterFileListRowPreparedEventListener
{
#[AsEventListener('my-extension/after-filelist-row-prepared')]
public function __invoke(AfterFileListRowPreparedEvent $event): void
{
$data = $event->getData();
// Modify the already-rendered value of a specific column
$data['my_column'] = 'My custom value';
$event->setData($data);
}
}
Impact
======
Extension authors can now decorate or override the rendered value of any
column - not just the action icons - for a file or folder row in the File
List module, without resorting to hooks or class-name-based reflection
workarounds.
.. index:: Backend, PHP-API, ext:filelist
@@ -0,0 +1,87 @@
.. include:: /Includes.rst.txt
.. _feature-110277-1784812454:
=============================================================
Feature: #110277 - Register file renderers as tagged services
=============================================================
See :issue:`110277`
Description
===========
File renderers, used for example by the :html:`<f:media>` ViewHelper to
render audio, video or online media files, are now registered as tagged
services via dependency injection instead of the previous programmatic
registration through
:php:`\TYPO3\CMS\Core\Resource\Rendering\RendererRegistry->registerRendererClass()`
in :file:`ext_localconf.php`.
A file renderer class implementing
:php:`\TYPO3\CMS\Core\Resource\Rendering\FileRendererInterface` is
registered by adding the new PHP attribute
:php:`\TYPO3\CMS\Core\Attribute\AsFileRenderer` to the class:
.. code-block:: php
:caption: EXT:my_extension/Classes/Resource/Rendering/MyVideoRenderer.php
use TYPO3\CMS\Core\Attribute\AsFileRenderer;
use TYPO3\CMS\Core\Resource\Rendering\FileRendererInterface;
#[AsFileRenderer(priority: 10)]
final class MyVideoRenderer implements FileRendererInterface
{
// ...
}
The renderer priority is defined at registration time via the attribute.
Renderers with a higher priority are asked first whether they can render
a given file (:php:`canRender()`). The file renderers shipped with TYPO3
Core are registered with the default priority :php:`0` (previously
:php:`1` via the removed :php:`getPriority()` method), so any custom
renderer using a priority above :php:`0` takes precedence over them. The
order in which renderers of the same priority are evaluated is not
defined and must not be relied upon; use distinct priorities if the
evaluation order matters.
Alternatively, the service tag :yaml:`fal.file_renderer` can be used
directly in :file:`Configuration/Services.yaml`:
.. code-block:: yaml
:caption: EXT:my_extension/Configuration/Services.yaml
MyVendor\MyExtension\Resource\Rendering\MyVideoRenderer:
tags:
- name: fal.file_renderer
priority: 10
Impact
======
Registering file renderers as tagged services has the following
benefits over the previous programmatic registration:
- The registration is resolved once at container compile time instead
of executing registration code from :file:`ext_localconf.php` on
every request. Loading and validating the renderer classes per
request, as well as instantiating and sorting them by priority at
runtime, is not necessary anymore.
- File renderers are proper services now and can use dependency
injection in their constructor.
- The renderer priority is declared at the class itself instead of
depending on the loading order of :file:`ext_localconf.php` files.
- The registration is validated at container compile time: a service
tagged as :yaml:`fal.file_renderer` that does not implement
:php:`FileRendererInterface` fails the container build with a
speaking exception, instead of causing errors when a file is
rendered.
Registration in :file:`ext_localconf.php` via
:php:`RendererRegistry->registerRendererClass()` is not evaluated
anymore, see :ref:`breaking-110277-1784812454` for the upgrade path.
.. index:: FAL, PHP-API, ext:core
@@ -0,0 +1,64 @@
.. include:: /Includes.rst.txt
.. _feature-94822-1783091790:
===============================================================
Feature: #94822 - Multiple records with record browser in forms
===============================================================
See :issue:`94822`
Description
===========
The record browser in forms can now be used to add multiple records to a property,
if configured accordingly.
When the option :yaml:`maxItems` of the :yaml:`Inspector-Typo3WinBrowserEditor` is
greater than 1, the UIDs of the selected records are added as a comma-separated list:
.. code-block:: yaml
TYPO3:
CMS:
Form:
prototypes:
standard:
formElementsDefinition:
MyCustomElement:
formEditor:
editors:
# ...
300:
identifier: myRecords
# ...
minItems: 1
maxItems: 10
propertyPath: properties.myRecordUids
# ...
propertyValidators:
10: IntegerList
# ...
Custom logic must be added to actually make use of the multiple values.
Whenever :yaml:`minItems` or :yaml:`maxItems` is configured, the number of
selected records is validated automatically through the new :yaml:`ItemCount`
property validator, without the need to add it to :yaml:`propertyValidators`.
There is also a new property validator:
* :yaml:`IntegerList` checks whether all elements in the comma-separated list
are integers.
Impact
======
Form definitions can be set up to allow editors the selection of multiple database
records and then render them using custom logic.
To avoid conflicts with existing configurations, :yaml:`minItems` is set to 0 and
:yaml:`maxItems` to 1 by default.
.. index:: Backend, ext:form
+53
View File
@@ -0,0 +1,53 @@
:template: changelogOverview.html
.. include:: /Includes.rst.txt
.. _changelog-15-0:
============
15.0 Changes
============
**Table of contents**
.. contents::
:local:
:depth: 1
Breaking Changes
================
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Breaking-*
Features
========
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Feature-*
Deprecation
===========
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Deprecation-*
Important
=========
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Important-*