TYPO3 v15 dev-main snapshot ()
This commit is contained in:
+44
@@ -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
|
||||
+41
@@ -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
|
||||
+63
@@ -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
|
||||
+42
@@ -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
|
||||
+72
@@ -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
|
||||
+62
@@ -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
|
||||
+131
@@ -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
|
||||
+64
@@ -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
|
||||
+58
@@ -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
|
||||
+59
@@ -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
|
||||
+68
@@ -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
|
||||
+59
@@ -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
|
||||
+64
@@ -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
|
||||
@@ -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-*
|
||||
Reference in New Issue
Block a user