TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:09 +02:00
commit af8cc155b5
6818 changed files with 642608 additions and 0 deletions
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _breaking-87616:
=======================================================
Breaking: #87616 - Removed hook for altering page links
=======================================================
See :issue:`87616`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typolinkProcessing']['typolinkModifyParameterForPageLinks']`
has been removed in favor of a new PSR-14 event :php:`TYPO3\CMS\Frontend\Event\ModifyPageLinkConfigurationEvent`.
The event is called after TYPO3 has already prepared some functionality
within the :php:`PageLinkBuilder`. This therefore allows to modify more
properties, if needed.
Impact
======
Any hook implementation registered is not executed anymore
in TYPO3 v12.0+.
Affected Installations
======================
TYPO3 installations with custom extensions using this hook.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <../12.0/Feature-87616-PSR-14EventForModifyingPageLinkGeneration>`
to allow greater influence in the functionality.
.. index:: Frontend, FullyScanned, ext:frontend
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _breaking-90044:
===============================================================================
Breaking: #90044 - config.spamProtectEmailAddresses with option "ascii" removed
===============================================================================
See :issue:`90044`
Description
===========
The TypoScript setting :typoscript:`config.spamProtectEmailAddresses` set to `ascii` has no
effect anymore as the ASCII-encryption feature has been removed.
The option changed any links to emails like `href="mailto:benni@example.com"`
to point to the ASCII-encoded equivalent. Since all browsers (and most bots/crawlers)
do this automatically and instantly this feature has no spam-protection
relevance anymore.
Impact
======
Setting the option to `ascii` has no effect anymore, which is the same as not
setting the option at all. However, in case the option is set to `ascii` a
PHP :php:`E_USER_DEPRECATED` error is raised.
Affected Installations
======================
TYPO3 installations having this option set in their TypoScript setup.
Migration
=========
In case you still want to keep an email SPAM protection around, it is recommended
to set the option :typoscript:`config.spamProtectEmailAddresses` to a numeric value between
`-10` and `10`.
Alternatively, there is an extension called `emailobfuscator` available in the
TYPO3 Extension Repository, which also aims to achieve a similar behaviour.
.. index:: Frontend, TypoScript, NotScanned, ext:frontend
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _breaking-92508:
=========================================================
Breaking: #92508 - Removed hook for filtering HMENU items
=========================================================
See :issue:`92508`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/tslib/class.tslib_menu.php']['filterMenuPages']`
has been removed in favor of a new PSR-14 event :php:`TYPO3\CMS\Frontend\Event\FilterMenuItemsEvent`.
The event is called with all menu items instead of operating on
one single item.
Impact
======
Any hook implementation registered is not executed anymore
in TYPO3 v12.0+.
Affected Installations
======================
TYPO3 installations with custom menus using this hook.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <../12.0/Feature-92508-PSR-14EventForModifyingMenuItems>`
to allow greater influence in the functionality.
.. index:: Frontend, FullyScanned, ext:frontend
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _breaking-93182-1651654104:
===================================================================
Breaking: #93182 - Changed file extension for gzip compressed files
===================================================================
See :issue:`93182`
Description
===========
When using file compression for resources such as JavaScript or
StyleSheets via :php:`$GLOBALS[TYPO3_CONF_VARS][FE][compressionLevel]` or
:php:`$GLOBALS[TYPO3_CONF_VARS][BE][compressionLevel]` the generated files are
now written via the file extension ".gz" instead of ".gzip" in previous versions.
TYPO3 follows the de-facto standard for compressed assets,
as ".gz" is much more widespread than ".gzip" file extensions
(see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types).
Impact
======
Compressed resources are now generated and served via ".gz".
Affected installations
======================
TYPO3 installations setting the global configuration option.
Migration
=========
Adapt possible :file:`.htaccess` or other webserver configuration files
by replacing ".gzip" with ".gz" if this feature is activated.
.. index:: Backend, Frontend, NotScanned, ext:core
@@ -0,0 +1,57 @@
.. include:: /Includes.rst.txt
.. _breaking-94117:
===============================================================
Breaking: #94117 - Register Extbase type converters as services
===============================================================
See :issue:`94117`
Description
===========
Extbase type converters are used to convert from a simple type to an
object or another simple type. The registration of those type converters
is no longer done via :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerTypeConverter()`,
but via container services in the extension's :file:`Services.yaml` file.
As a side effect, the type converter configuration such as `sourceType` or
`targetType` has been moved from the :php:`TypeConverterInterface` to the
service container configuration.
Impact
======
Type converters registered via :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerTypeConverter()`
are no longer evaluated.
The :php:`TypeConverterInterface` does no longer define the configuration
related methods:
- :php:`getSupportedSourceTypes()`
- :php:`getSupportedTargetType()`
- :php:`getPriority()`
- :php:`canConvertFrom()`
Affected Installations
======================
All installations that do not register type converters via :php:`Services.yaml`.
All installations, which rely on the configuration related methods, being
defined in the :php:`TypeConverterInterface`.
Migration
=========
Remove registration via :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerTypeConverter()`
from your :file:`ext_localconf.php` file and register the type converters
in your :php:`Services.yaml` instead. See :doc:`changelog <../12.0/Feature-94117-ImproveExtbaseTypeConverterRegistration>`
for an example.
Remove any call to the configuration related methods, see the
:doc:`deprecation changelog <../12.0/Deprecation-94117-RegisterExtbaseTypeConvertersAsServices>`
for more information.
.. index:: PHP-API, NotScanned, ext:extbase
@@ -0,0 +1,54 @@
.. include:: /Includes.rst.txt
.. _breaking-94243-1664786038:
===============================================================
Breaking: #94243 - Send user session cookies as hash-signed JWT
===============================================================
See :issue:`94243`
Description
===========
`JSON Web Tokens (JWT) <https://jwt.io/>`__ are used to transport user session
identifiers in `be_typo_user` and `fe_typo_user` cookies. Using JWT's `HS256`
(HMAC signed based on SHA256) allows to determine whether a session cookie is
valid before comparing with server-side stored session data. This enhances the
overall performance a bit, since sessions cookies would be checked for every
request to TYPO3's backend and frontend.
JWT handling in PHP is provided by 3rd party package
`firebase/php-jwt <https://packagist.org/packages/firebase/php-jwt>`__.
Impact
======
Session cookies `be_typo_user` and `fe_typo_user` can be pre-validated without
querying the database, which can filter invalid requests and might reduce the
enhances the overall performance a bit.
As a consequence session tokens are not sent "as is" anymore, but are
wrapped in a corresponding JWT message, which contains the following payload:
* `identifier` reflects the actual session identifier
* `time` reflects the time of creating the cookie (RFC 3339 format)
Affected installations
======================
All instances using TYPO3 v12 and having custom implementations handling `be_typo_user`
and `fe_typo_user` cookie values.
Migration
=========
Custom implementations handling `be_typo_user` or `fe_typo_user` cookies,
have to use the introduced method :php:`\TYPO3\CMS\Core\Session\UserSession::getJwt()`
instead of existing :php:`\TYPO3\CMS\Core\Session\UserSession::getIdentifier()`.
.. index:: Backend, Frontend, NotScanned, ext:core
@@ -0,0 +1,47 @@
.. include:: /Includes.rst.txt
.. _breaking-95132-1659375274:
============================================================================
Breaking: #95132 - Set password forgot hash based on user uid in ext:felogin
============================================================================
See :issue:`95132`
Description
===========
The signature of the :php:`sendRecoveryEmail()` function in the
:php:`TYPO3\CMS\FrontendLogin\Service\RecoveryService` has changed. The function
now requires 2 arguments in order to support scenarios for multi-site TYPO3
setups with multiple storage folders for users with the same email address.
Additionally, the :php:`RecoveryService` class now does not implement
:php:`TYPO3\CMS\FrontendLogin\Service\RecoveryServiceInterface` any more, since
the interface has been removed.
Impact
======
3rd party extensions implementing :php:`RecoveryService` have to be adapted
manually to support the new function signature.
3rd party extensions implementing :php:`RecoveryServiceInterface` have to be
adapted manually to extend :php:`RecoveryService` instead.
Affected installations
======================
3rd party extensions implementing :php:`RecoveryService` and
:php:`RecoveryServiceInterface`.
Migration
=========
Custom implementations of :php:`RecoveryService` must be adopted to support the new
function signature :php:`sendRecoveryEmail(array $userData, string $hash)`.
Custom implementations of :php:`RecoveryServiceInterface` must be adopted to
extend :php:`RecoveryService` instead.
.. index:: Frontend, PHP-API, NotScanned, ext:felogin
@@ -0,0 +1,43 @@
.. include:: /Includes.rst.txt
.. _breaking-96041:
=================================================
Breaking: #96041 - Toolbar items: Register by tag
=================================================
See :issue:`96041`
Description
===========
Toolbar items implementing :php:`\TYPO3\CMS\Backend\Toolbar\ToolbarItemInterface` are now automatically
registered by adding the tag :yaml:`backend.toolbar.item`, if :yaml:`autoconfigure`
is enabled in :file:`Services.yaml`.
Impact
======
The registration via :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['toolbarItems']` isn't evaluated anymore.
Affected Installations
======================
Every extension, that adds toolbar items via :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['toolbarItems']`
in its :file:`ext_localconf.php` file.
Migration
=========
Remove :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['toolbarItems']` from your :file:`ext_localconf.php` file.
If :yaml:`autoconfigure` is not enabled in your :file:`Configuration/Services.(yaml|php)`, add the tag :yaml:`backend.toolbar.item` to your toolbar item class.
Example:
.. code-block:: yaml
VENDOR\Extension\ToolbarItem\YourAdditionalToolbarItem:
tags:
- name: backend.toolbar.item
.. index:: Backend, LocalConfiguration, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,85 @@
.. include:: /Includes.rst.txt
.. _breaking-96044:
==========================================================================
Breaking: #96044 - Harden method signature of logicalAnd() and logicalOr()
==========================================================================
See :issue:`96044`
Description
===========
The method signature of :php:`\TYPO3\CMS\Extbase\Persistence\QueryInterface::logicalAnd()`
and :php:`\TYPO3\CMS\Extbase\Persistence\QueryInterface::logicalOr()` has changed.
As a consequence the method signature of :php:`\TYPO3\CMS\Extbase\Persistence\Generic\Query::logicalAnd()`
and :php:`\TYPO3\CMS\Extbase\Persistence\Generic\Query::logicalOr()` has changed as well.
Both methods do no longer accept an array as first parameter.
Both methods do indeed accept an infinite number of further constraints.
The :php:`logicalAnd()` method does now reliably return an instance of
:php:`\TYPO3\CMS\Extbase\Persistence\Generic\Qom\AndInterface` instance
while the :php:`logicalOr()` method returns a :php:`\TYPO3\CMS\Extbase\Persistence\Generic\Qom\OrInterface`
instance.
Impact
======
This change impacts all usages of said methods with just one array parameter containing all constraints.
Affected Installations
======================
All installations that passed all constraints as array.
Migration
=========
The migration is the same for :php:`logicalAnd()` and :php:`logicalOr()`
since their method signature is the same. The upcoming example will show a
migration for a :php:`logicalAnd()` call.
**Example**:
.. code-block:: php
$query = $this->createQuery();
$query->matching($query->logicalAnd([
$query->equals('propertyName1', 'value1'),
$query->equals('propertyName2', 'value2'),
$query->equals('propertyName3', 'value3'),
]));
In this case an array is used as one and only method argument. The migration is
easy and quickly done. Simply don't use an array:
.. code-block:: php
$query = $this->createQuery();
$query->matching($query->logicalAnd(
$query->equals('propertyName1', 'value1'),
$query->equals('propertyName2', 'value2'),
$query->equals('propertyName3', 'value3'),
));
Alternatively you can use the spread operator :php:`...` to expand your array to arguments:
.. code-block:: php
$query = $this->createQuery();
$arrayOfConditions = [];
$arrayOfConditions[] = $query->equals('propertyName1', 'value1');
$arrayOfConditions[] = $query->equals('propertyName2', 'value2');
$arrayOfConditions[] = $query->equals('propertyName3', 'value3');
$query->matching($query->logicalAnd(...$arrayOfConditions));
.. tip::
Wrapping the array to spread into :php:`logicalAnd()` using :php:`array_values()` avoids
spreading associative array element keys as as named arguments, for example:
:php:`$query->matching($query->logicalAnd(...array_values($arrayOfConditions)));`
.. index:: PHP-API, FullyScanned, ext:extbase
@@ -0,0 +1,63 @@
.. include:: /Includes.rst.txt
.. _breaking-96094:
=======================================
Breaking: #96094 - Module icons removed
=======================================
See :issue:`96094`
Description
===========
The following module icons are removed as they are not needed anymore
by TYPO3 itself. You can find the according icon identifier in parenthesis.
* :file:`EXT:backend/Resources/Public/Icons/module-about.svg` (`module-about`)
* :file:`EXT:backend/Resources/Public/Icons/module-contentelements.svg` (`module-contentelements`)
* :file:`EXT:backend/Resources/Public/Icons/module-cshmanual.svg` (`module-cshmanual`)
* :file:`EXT:backend/Resources/Public/Icons/module-page.svg` (`module-page`)
* :file:`EXT:backend/Resources/Public/Icons/module-sites.svg` (`module-sites`)
* :file:`EXT:backend/Resources/Public/Icons/module-templates.svg` (`module-templates`)
* :file:`EXT:backend/Resources/Public/Icons/module-urls.svg` (`module-urls`)
* :file:`EXT:belog/Resources/Public/Icons/module-belog.svg` (`module-belog`)
* :file:`EXT:beuser/Resources/Public/Icons/module-beuser.svg` (`module-beuser`)
* :file:`EXT:beuser/Resources/Public/Icons/module-permission.svg` (`module-permission`)
* :file:`EXT:extensionmanager/Resources/Public/Icons/module-extensionmanager.svg` (`module-extensionmanager`)
* :file:`EXT:filelist/Resources/Public/Icons/module-filelist.svg` (`module-filelist`)
* :file:`EXT:form/Resources/Public/Icons/module-form.svg` (`module-form`)
* :file:`EXT:indexed_search/Resources/Public/Icons/module-indexed_search.svg` (`module-indexed_search`)
* :file:`EXT:info/Resources/Public/Icons/module-info.svg` (`module-info`)
* :file:`EXT:lowlevel/Resources/Public/Icons/module-config.svg` (`module-config`)
* :file:`EXT:lowlevel/Resources/Public/Icons/module-dbint.svg` (`module-dbint`)
* :file:`EXT:recordlist/Resources/Public/Icons/module-list.svg` (`module-list`)
* :file:`EXT:recycler/Resources/Public/Icons/module-recycler.svg` (`module-recycler`)
* :file:`EXT:reports/Resources/Public/Icons/module-reports.svg` (`module-reports`)
* :file:`EXT:scheduler/Resources/Public/Icons/module-scheduler.svg` (`module-scheduler`)
* :file:`EXT:setup/Resources/Public/Icons/module-setup.svg` (`module-setup`)
* :file:`EXT:tstemplate/Resources/Public/Icons/module-tstemplate.svg` (`module-tstemplate`)
* :file:`EXT:viewpage/Resources/Public/Icons/module-viewpage.svg` (`module-viewpage`)
* :file:`EXT:workspaces/Resources/Public/Icons/module-workspaces.svg` (`module-workspaces`)
Impact
======
The mentioned icons are removed, any usage by path will result in a broken
image.
Affected Installations
======================
Third-party TYPO3 extensions using these icons.
Migration
=========
Use the already available icon identifiers from `TYPO3.Icons <https://typo3.github.io/TYPO3.Icons/>`_.
The module icons are all registered automatically by the IconRegistry.
In Fluid you can render them by calling :html:`<core:icon identifier="module-icon">`.
In case you need the SVG file directly, download it from the above-mentioned
icon repository page.
.. index:: Backend, NotScanned
@@ -0,0 +1,446 @@
.. include:: /Includes.rst.txt
.. _breaking-96107:
===================================================
Breaking: #96107 - Deprecated functionality removed
===================================================
See :issue:`96107`
Description
===========
The following PHP classes that have previously been marked as deprecated for v11 and were now removed:
- :php:`\TYPO3\CMS\Backend\View\BackendTemplateView`
- :php:`\TYPO3\CMS\Core\Cache\Backend\PdoBackend`
- :php:`\TYPO3\CMS\Core\Cache\Backend\WincacheBackend`
- :php:`\TYPO3\CMS\Core\Category\CategoryRegistry`
- :php:`\TYPO3\CMS\Core\Database\QueryGenerator`
- :php:`\TYPO3\CMS\Core\Database\QueryView`
- :php:`\TYPO3\CMS\Core\Database\SoftReferenceIndex`
- :php:`\TYPO3\CMS\Core\Service\AbstractService`
- :php:`\TYPO3\CMS\Extbase\Annotation\Inject`
- :php:`\TYPO3\CMS\Extbase\Configuration\Exception\ParseErrorException`
- :php:`\TYPO3\CMS\Extbase\Domain\Model\BackendUser`
- :php:`\TYPO3\CMS\Extbase\Domain\Model\BackendUserGroup`
- :php:`\TYPO3\CMS\Extbase\Domain\Model\FrontendUser`
- :php:`\TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup`
- :php:`\TYPO3\CMS\Extbase\Domain\Repository\BackendUserGroupRepository`
- :php:`\TYPO3\CMS\Extbase\Domain\Repository\BackendUserRepository`
- :php:`\TYPO3\CMS\Extbase\Domain\Repository\CategoryRepository`
- :php:`\TYPO3\CMS\Extbase\Domain\Repository\FrontendUserGroupRepository`
- :php:`\TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository`
- :php:`\TYPO3\CMS\Extbase\Mvc\Controller\ControllerContext`
- :php:`\TYPO3\CMS\Extbase\Mvc\Exception\InvalidRequestMethodException`
- :php:`\TYPO3\CMS\Extbase\Mvc\Exception\StopActionException`
- :php:`\TYPO3\CMS\Extbase\Mvc\View\AbstractView`
- :php:`\TYPO3\CMS\Extbase\Mvc\View\EmptyView`
- :php:`\TYPO3\CMS\Extbase\Mvc\Web\ReferringRequest`
- :php:`\TYPO3\CMS\Extbase\Object\Container\Container`
- :php:`\TYPO3\CMS\Extbase\Object\Container\Exception\UnknownObjectException`
- :php:`\TYPO3\CMS\Extbase\Object\Exception`
- :php:`\TYPO3\CMS\Extbase\Object\Exception\CannotBuildObjectException`
- :php:`\TYPO3\CMS\Extbase\Object\Exception\CannotReconstituteObjectException`
- :php:`\TYPO3\CMS\Extbase\Object\ObjectManager`
- :php:`\TYPO3\CMS\Extbase\Persistence\Generic\Exception\InvalidNumberOfConstraintsException`
- :php:`\TYPO3\CMS\Extbase\Service\EnvironmentService`
- :php:`\TYPO3\CMS\Extbase\SignalSlot\Dispatcher`
- :php:`\TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException`
- :php:`\TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException`
- :php:`\TYPO3\CMS\Frontend\ContentObject\EditPanelContentObject`
The following PHP classes have been declared final:
- All Fluid ViewHelpers
The following PHP interfaces that have previously been marked as deprecated for v11 and were now removed:
- :php:`\TYPO3\CMS\Backend\Toolbar\ClearCacheActionsHookInterface`
- :php:`\TYPO3\CMS\Core\Database\TableConfigurationPostProcessingHookInterface`
- :php:`\TYPO3\CMS\Core\Resource\Hook\FileDumpEIDHookInterface`
- :php:`\TYPO3\CMS\Core\Utility\File\ExtendedFileUtilityProcessDataHookInterface`
- :php:`\TYPO3\CMS\Extbase\Mvc\View\ViewInterface`
- :php:`\TYPO3\CMS\Extbase\Object\ObjectManagerInterface`
- :php:`\TYPO3\CMS\Extbase\Persistence\ForwardCompatibleQueryInterface`
- :php:`\TYPO3\CMS\Extbase\Persistence\ForwardCompatibleQueryResultInterface`
- :php:`\TYPO3\CMS\Filelist\FileListEditIconHookInterface'`
- :php:`\TYPO3\CMS\Recordlist\RecordList\RecordListHookInterface`
The following PHP interfaces changed:
- :php:`\TYPO3\CMS\Core\Collection\CollectionInterface` (no longer extends \Serializable)
- :php:`\TYPO3\CMS\Core\Resource\FolderInterface` (method :php:`getFile()` added)
- :php:`\TYPO3\CMS\Extbase\Persistence\QueryInterface` (method :php:`setType()` added)
- :php:`\TYPO3\CMS\Extbase\Persistence\QueryInterface->logicalAnd` (all arguments are now type hinted as `ConstraintInterface`)
- :php:`\TYPO3\CMS\Extbase\Persistence\QueryInterface->logicalOr` (all arguments are now type hinted as `ConstraintInterface`)
- :php:`\TYPO3\CMS\Extbase\Persistence\QueryResultInterface` (method :php:`setQuery()` added)
- :php:`\TYPO3\CMS\Form\Domain\Finishers\FinisherInterface` (method :php:`setFinisherIdentifier()` added)
- :php:`\TYPO3\CMS\Frontend\ContentObject\Exception\ExceptionHandlerInterface` (method :php:`setConfiguration()` added)
The following PHP class methods that have previously been marked as deprecated for v11 and were now removed:
- :php:`\TYPO3\CMS\Backend\Form\FormDataProvider\AbstractItemProvider->addItemsFromSpecial()`
- :php:`\TYPO3\CMS\Backend\Template\Components\AbstractControl->getOnClick'()`
- :php:`\TYPO3\CMS\Backend\Template\Components\AbstractControl->setOnClick'()`
- :php:`\TYPO3\CMS\Backend\Template\ModuleTemplate->getIconFactory()`
- :php:`\TYPO3\CMS\Backend\Template\ModuleTemplate->getPageRenderer()`
- :php:`\TYPO3\CMS\Backend\Domain\Module\BackendModule->setNavigationFrameScript()`
- :php:`\TYPO3\CMS\Backend\Domain\Module\BackendModule->getNavigationFrameScript()`
- :php:`\TYPO3\CMS\Backend\Domain\Module\BackendModule->setNavigationFrameScriptParameters()`
- :php:`\TYPO3\CMS\Backend\Domain\Module\BackendModule->getNavigationFrameScriptParameters()`
- :php:`\TYPO3\CMS\Backend\Domain\Module\BackendModule->setOnClick()`
- :php:`\TYPO3\CMS\Backend\Domain\Module\BackendModule->getOnClick()`
- :php:`\TYPO3\CMS\Backend\View\Event\AbstractSectionMarkupGeneratedEvent->getPageLayoutView()`
- :php:`\TYPO3\CMS\Backend\View\Event\AbstractSectionMarkupGeneratedEvent->getLanguageId()`
- :php:`\TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->createSessionId()`
- :php:`\TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->fetchUserSession()`
- :php:`\TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools->getArrayValueByPath()`
- :php:`\TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools->setArrayValueByPath()`
- :php:`\TYPO3\CMS\Core\Database\ReferenceIndex->disableRuntimeCache()`
- :php:`\TYPO3\CMS\Core\Database\ReferenceIndex->enableRuntimeCache()`
- :php:`\TYPO3\CMS\Core\Database\RelationHandler->setUpdateReferenceIndex()`
- :php:`\TYPO3\CMS\Core\Database\RelationHandler->remapMM()`
- :php:`\TYPO3\CMS\Core\Domain\Repository\PageRepository->fixVersioningPid()`
- :php:`\TYPO3\CMS\Core\Resource\Event\GeneratePublicUrlForResourceEvent->isRelativeToCurrentScript()`
- :php:`\TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider->getRootUid()`
- :php:`\TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider->setRootUid()`
- :php:`\TYPO3\CMS\Extbase\Mvc\Controller\ActionController->buildControllerContext()`
- :php:`\TYPO3\CMS\Extbase\Mvc\Controller\ActionController->getControllerContext()`
- :php:`\TYPO3\CMS\Extbase\Mvc\Controller\ActionController->forward()`
- :php:`\TYPO3\CMS\Extbase\Mvc\Request->getBaseUri()`
- :php:`\TYPO3\CMS\Extbase\Mvc\Request->getRequestUri()`
- :php:`\TYPO3\CMS\Extbase\Mvc\Request->isDispatched()`
- :php:`\TYPO3\CMS\Extbase\Mvc\Request->setDispatched()`
- :php:`\TYPO3\CMS\Extbase\Mvc\View\JsonView->setControllerContext()`
- :php:`\TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder->setAddQueryStringMethod()`
- :php:`\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings->getLanguageMode()`
- :php:`\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings->setLanguageMode()`
- :php:`\TYPO3\CMS\Fluid\Core\Rendering\RenderingContext->getControllerContext()`
- :php:`\TYPO3\CMS\Fluid\Core\Rendering\RenderingContext->setControllerContext()`
- :php:`\TYPO3\CMS\Fluid\View\AbstractTemplateView->setControllerContext()`
- :php:`\TYPO3\CMS\Form\Domain\Renderer\AbstractElementRenderer->setControllerContext()`
- :php:`\TYPO3\CMS\Form\Domain\Renderer\RendererInterface->setControllerContext()`
- :php:`\TYPO3\CMS\Form\Domain\Runtime\FormRuntime->getControllerContext()`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->editIcons()`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->editPanel()`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->isDisabled()`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->stdWrap_editIcons()`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->stdWrap_editPanel()`
- :php:`\TYPO3\CMS\Frontend\Plugin\AbstractPlugin->pi_getEditPanel()`
- :php:`\TYPO3\CMS\Frontend\Plugin\AbstractPlugin->pi_getEditIcon()`
The following PHP static class methods that have previously been marked as deprecated for v11 and were now removed:
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::explodeSoftRefParserList()`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::fixVersioningPid()`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::softRefParserObj()`
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::viewOnClick`
- :php:`\TYPO3\CMS\Core\Localization\LanguageService::create()`
- :php:`\TYPO3\CMS\Core\Localization\LanguageService::createFromSiteLanguage()`
- :php:`\TYPO3\CMS\Core\Localization\LanguageService::createFromUserPreferences()`
- :php:`\TYPO3\CMS\Core\Resource\Index\ExtractorRegistry::getInstance()`
- :php:`\TYPO3\CMS\Core\Resource\Index\FileIndexRepository::getInstance()`
- :php:`\TYPO3\CMS\Core\Resource\Index\MetaDataRepository::getInstance()`
- :php:`\TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\OnlineMediaHelperRegistry::getInstance()`
- :php:`\TYPO3\CMS\Core\Resource\Rendering\RendererRegistry::getInstance()`
- :php:`\TYPO3\CMS\Core\Resource\TextExtraction\TextExtractorRegistry::getInstance()`
- :php:`\TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser->doSyntaxHighlight()`
- :php:`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::makeCategorizable()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::compileSelectedGetVarsFromArray()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::hideIfNotTranslated()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::hideIfDefaultLanguage()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::isAbsPath()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::isAllowedHostHeaderValue()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::isFirstPartOfStr()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::minifyJavaScript()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::rmFromList()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::shortMD5()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::stdAuthCode()`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::uniqueList()`
- :php:`\TYPO3\CMS\Core\Utility\HttpUtility::redirect()`
- :php:`\TYPO3\CMS\Core\Utility\HttpUtility::setResponseCode()`
- :php:`\TYPO3\CMS\Core\Utility\HttpUtility::setResponseCodeAndExit()`
- :php:`\TYPO3\CMS\Core\Utility\StringUtility::beginsWith()`
- :php:`\TYPO3\CMS\Core\Utility\StringUtility::endsWith()`
- :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::getControllerClassName()`
- :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::resolveVendorFromExtensionAndControllerClassName()`
- :php:`\TYPO3\CMS\Form\Service\TranslationService::getInstance()`
- :php:`\TYPO3\CMS\T3editor\Registry\AddonRegistry::getInstance()`
- :php:`\TYPO3\CMS\T3editor\Registry\ModeRegistry::getInstance()`
The following PHP class methods changed signature according to previous deprecations in v11 at the end of the argument list:
- :php:`\TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->unpack_uc()` (argument 1 removed)
- :php:`\TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->writeUC()` (argument 1 removed)
- :php:`\TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->start()` (argument 1 always required)
- :php:`\TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->checkAuthentication()` (argument 1 always required)
- :php:`\TYPO3\CMS\Core\Authentication\CommandLineUserAuthentication->checkAuthentication()` (argument 1 always required)
- :php:`\TYPO3\CMS\Core\Authentication\BackendUserAuthentication->isInWebMount()` (argument 3 removed)
- :php:`\TYPO3\CMS\Core\Authentication\BackendUserAuthentication->backendCheckLogin()` (argument 1 removed)
- :php:`\TYPO3\CMS\Core\Core\ApplicationInterface->run()` (argument 1 is removed)
- :php:`\TYPO3\CMS\Core\Database\RelationHandler->writeForeignField()` (argument 4 removed)
- :php:`\TYPO3\CMS\Core\Resource\AbstractFile->getPublicUrl()` (argument 1 is removed)
- :php:`\TYPO3\CMS\Core\Resource\File->getPublicUrl()` (argument 1 is removed)
- :php:`\TYPO3\CMS\Core\Resource\FileInterface->getPublicUrl()` (argument 1 is removed)
- :php:`\TYPO3\CMS\Core\Resource\FileReference->getPublicUrl()` (argument 1 is removed)
- :php:`\TYPO3\CMS\Core\Resource\Folder->getPublicUrl()` (argument 1 is removed)
- :php:`\TYPO3\CMS\Core\Resource\InaccessibleFolder->getPublicUrl()` (argument 1 is removed)
- :php:`\TYPO3\CMS\Core\Resource\ProcessedFile->getPublicUrl()` (argument 1 is removed)
- :php:`\TYPO3\CMS\Core\Resource\ResourceStorage->getPublicUrl()` (argument 2 is removed)
- :php:`\TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\OnlineMediaHelperInterface->getPublicUrl()` (argument 2 is removed)
- :php:`\TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\VimeoHelper->getPublicUrl()` (argument 2 is removed)
- :php:`\TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\YouTubeHelper->getPublicUrl()` (argument 2 is removed)
- :php:`\TYPO3\CMS\Extbase\Core\Bootstrap->run()` (optional third argument is now required)
- :php:`\TYPO3\CMS\Fluid\View\StandaloneView->__construct()` (optional constructor argument is removed)
- :php:`\TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication->fetchGroupData()` (argument 1 always required)
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->ATagParams()` (argument 2 is removed)
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->getConfigArray()` (argument 1 is always required)
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->determineId()` (argument 1 is always required)
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->INTincScript()` (argument 1 is always required)
- :php:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder->build()` (return type is now of LinkResultInterface)
The following PHP static class methods changed signature according to previous deprecations in v11 at the end of the argument list:
- :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::wrapClickMenuOnIcon()` (arguments 5, 6 and 7 are removed)
- :php:`\TYPO3\CMS\Core\Utility\ArrayUtility::arrayDiffAssocRecursive()` (argument 3 is removed)
The following PHP class methods changed signature according to previous deprecations in v11 and are now type hinted:
- :php:`\TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder->literal()` (second argument requires an integer)
- :php:`\TYPO3\CMS\Core\Database\Query\QueryBuilder->quote()` (second argument requires an integer)
- :php:`\TYPO3\CMS\Core\TimeTracker\TimeTracker->setTSlogMessage()` (second argument requires a string)
- :php:`\TYPO3\CMS\Backend\Tree\View\AbstractTreeView->getIcon()` (first argument is now type hinted `array`)
- :php:`\TYPO3\CMS\Extbase\Persistence\Generic\Query->logicalAnd()` (all arguments are now type hinted as `ConstraintInterface`)
- :php:`\TYPO3\CMS\Extbase\Persistence\Generic\Query->logicalOr()` (all arguments are now type hinted as `ConstraintInterface`)
- :php:`\TYPO3\CMS\Recordlist\RecordList\DatabaseRecordList->linkUrlMail()` (all arguments are now type hinted as `string`)
The following PHP class methods changed signature according to previous deprecations:
- :php:`\TYPO3\CMS\Core\Controller\ErrorPageController->errorAction()` (the third argument :php:`$severity` is removed)
The following class properties have been removed:
- :php:`\TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser->breakPointLN`
- :php:`\TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser->parentObject`
- :php:`\TYPO3\CMS\Core\TypoScript\TemplateService->ext_constants_BRP`
- :php:`\TYPO3\CMS\Core\TypoScript\TemplateService->ext_config_BRP`
- :php:`\TYPO3\CMS\Extbase\Mvc\Controller\ActionController->controllerContext`
- :php:`\TYPO3\CMS\Extbase\Mvc\View\JsonView->controllerContext`
- :php:`\TYPO3\CMS\Fluid\Core\Rendering\RenderingContext->controllerContext`
- :php:`\TYPO3\CMS\Fluid\View\AbstractTemplateView->controllerContext`
- :php:`\TYPO3\CMS\Form\Domain\Renderer\AbstractElementRenderer->controllerContext`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->align`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->oldData`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->alternativeData`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->currentRecordTotal`
- :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->recordRegister`
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->ATagParams`
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->cObjectDepthCounter`
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->displayEditIcons`
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->displayFieldEditIcons`
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->sWordRegex` (internal, but public)
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->sWordList` (internal, but public)
- :php:`\TYPO3\CMS\Frontend\Plugin\AbstractPlugin->pi_EPtemp_cObj`
The following class properties have been changed:
- :php:`\TYPO3\CMS\Core\TimeTracker\TimeTracker->wrapError` (does not contain numeric keys anymore)
- :php:`\TYPO3\CMS\Core\TimeTracker\TimeTracker->wrapIcon` (does not contain numeric keys anymore)
The following class methods visibility have been changed to protected:
- :php:`\TYPO3\CMS\Core\DataHandling\SoftReference\TypolinkSoftReferenceParser->getTypoLinkParts()`
- :php:`\TYPO3\CMS\Core\DataHandling\SoftReference\TypolinkSoftReferenceParser->setTypoLinkPartsElement()`
- :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::resolveControllerAliasFromControllerClassName()`
The following class properties visibility have been changed to protected:
- :php:`\TYPO3\CMS\Frontend\Imaging\GifBuilder->cObj`
- :php:`\TYPO3\CMS\Frontend\Plugin\AbstractPlugin->cObj`
The following ViewHelpers have been changed or removed:
- :html:`<be:moduleLayout>` removed
- :html:`<be:moduleLayout.menu>` removed
- :html:`<be:moduleLayout.menuItem>` removed
- :html:`<be:moduleLayout.button.linkButton>` removed
- :html:`<be:moduleLayout.button.shortcutButton>` removed
- :html:`<f:base>` removed
- :html:`<f:be.container>` removed
- :html:`<f:uri.email>` removed
- :html:`<f:form>` (:php:`addQueryStringMethod` argument removed)
- :html:`<f:link.action>` (:php:`addQueryStringMethod` argument removed)
- :html:`<f:link.page>` (:php:`addQueryStringMethod` argument removed)
- :html:`<f:link.typolink>` (:php:`addQueryStringMethod` argument removed)
- :html:`<f:uri.action>` (:php:`addQueryStringMethod` argument removed)
- :html:`<f:uri.page>` (:php:`addQueryStringMethod` argument removed)
- :html:`<f:uri.typolink>` (:php:`addQueryStringMethod` argument removed)
The following TypoScript options have been removed or adapted:
- `config.sword_standAlone`
- `config.sword_noMixedCase`
- `_parseFunc.sword`
- `EDITPANEL` content object
- `mod.linkvalidator.linkhandler.reportHiddenRecords`
- `page.includeCSS.myfile*.import`
- `page.includeCSSLibs.myfile*.import`
- `plugin.tx_indexedsearch.settings.forwardSearchWordsInResultLink`
- `plugin.tx_indexedsearch.settings.forwardSearchWordsInResultLink.no_cache`
- `stdWrap.editPanel`
- `stdWrap.editPanel.`
- `stdWrap.editIcons`
- `stdWrap.editIcons.`
- `TMENU.JSWindow`
- `TMENU.JSWindow.params`
The following constants have been dropped:
- :php:`TYPO3_branch`
- :php:`TYPO3_MODE`
- :php:`TYPO3_REQUESTTYPE`
- :php:`TYPO3_REQUESTTYPE_AJAX`
- :php:`TYPO3_REQUESTTYPE_BE`
- :php:`TYPO3_REQUESTTYPE_CLI`
- :php:`TYPO3_REQUESTTYPE_FE`
- :php:`TYPO3_REQUESTTYPE_INSTALL`
- :php:`TYPO3_version`
The following class constants have been dropped:
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::ENV_TRUSTED_HOSTS_PATTERN_ALLOW_ALL`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::ENV_TRUSTED_HOSTS_PATTERN_SERVER_NAME`
- :php:`\TYPO3\CMS\Core\Versioning\VersionState::NEW_PLACEHOLDER_VERSION`
- :php:`\TYPO3\CMS\Core\Versioning\VersionState::MOVE_PLACEHOLDER`
The following global option handling have been dropped and are ignored:
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['defaultCategorizedTables']`
The following hooks have been removed:
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['additionalBackendItems']['cacheActions']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['FileDumpEID.php']['checkFileAccess']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['fileList']['editIconsHook']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['extTablesInclusion-PostProcessing']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['recordlist/Modules/Recordlist/index.php']['drawHeaderHook']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['recordlist/Modules/Recordlist/index.php']['drawFooterHook']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_extfilefunc.php']['processData']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_parsehtml_proc.php']['transformation']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/browse_links.php']['browserRendering']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/class.db_list_extra.inc']['actions']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/classes/class.frontendedit.php']`
- :php:`$GLOBALS['TBE_MODULES_EXT']['xMOD_db_new_content_el']['addElClasses']`
The following single field configurations have been removed from TCA:
- :php:`special` (for TCA type :php:`select`)
- :php:`treeConfig.rootUid` (for TCA renderType :php:`selectTree` and :php:`category`)
The following single field configurations have been removed from :php:`$GLOBALS['TYPO3_USER_SETTINGS']`:
- :php:`confirmData.jsCodeAfterOk`
- :php:`onClick`
- :php:`onClickLabels`
The following features are now always enabled:
- `runtimeDbQuotingOfTcaConfiguration`
- `subrequestPageErrors`
- `yamlImportsFollowDeclarationOrder`
The following features have been removed:
- Extbase switchable controller actions
- Upgrade wizard "Migrate felogin plugins to use prefixed FlexForm keys"
- Upgrade wizard "Migrate felogin plugins to use Extbase CType"
- Upgrade wizard "Install extension 'feedit' from TER"
- Upgrade wizard "Install extension 'sys_action' from TER"
- Upgrade wizard "Install extension "taskcenter" from TER"
- Row upgrader "Workspace 'pid -1' migration"
The following fallbacks have been removed:
- Usage of the :html:`t3js-toggle-new-content-element-wizard` class to trigger the new content element wizard
- Usage of the :php:`DataHandler->inlineLocalizeSynchronize()` functionality without an array as input argument
- The :php:`route` parameter is no longer added to backend URLs
- Extensions, which are located in `typo3conf/ext`, but not installed by Composer, are no longer evaluated for installations in "Composer mode"
- Extbase no longer accepts :php:`MyVendor.` prefixed :php:`MyExtensionName` as first argument in
:php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin()`, :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin()`
and :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule()` and controller class names must be registered
with their fully qualified name.
- Extbase no longer determines types from doc block annotations for dependency injection methods and actions with validators,
defined types in method signatures must be used.
- Accessing Core related caches with :php:`cache_` prefix has been removed.
- Accessing :php:`\TYPO3\CMS\Frontend\Typolink\LinkResult` properties as arrays - ArrayAccess functionality removed
The following database tables have been removed:
- :sql:`sys_language`
The following global JavaScript variables have been removed:
- :js:`top.currentSubScript`
- :js:`top.fsMod`
- :js:`top.nextLoadModuleUrl`
The following global JavaScript functions have been removed:
- :js:`top.goToModule()`
- :js:`top.jump()`
The following JavaScript functions have been removed:
- :js:`FormEngine.requestConfirmationOnFieldChange()`
- :js:`TBE_EDITOR.fieldChanged()`
The following JavaScript methods behaviour has changed:
- :js:`show()` and :js:`hide()` of :js:`TYPO3/CMS/Backend/Tooltip` do no longer allow JQuery objects passed as first argument
- :js:`FormEngine.setSelectOptionFromExternalSource()` does no longer allow JQuery objects passed as sixth argument
- :js:`DateTimePicker.initialize()` always requires an :js:`HTMLInputElement` to be passed as first argument
The following JavaScript modules have been removed:
- :js:`TYPO3/CMS/Backend/SplitButtons`
- :js:`TYPO3/CMS/Core/Ajax/ResponseError`
- :js:`TYPO3/CMS/T3editor/T3editor`
The following RequireJS module names have been removed:
- :js:`Sortable`
The following module configuration have been removed:
- :php:`navFrameScript`
- :php:`navFrameScriptParam`
- :php:`navigationFrameModule` (Extbase)
The following command line options have been removed:
- :bash:`impexp:export --includeRelated`
- :bash:`impexp:export --includeStatic`
- :bash:`impexp:export --excludeDisabledRecords`
- :bash:`impexp:export --excludeHtmlCss`
- :bash:`impexp:export --saveFilesOutsideExportFile`
- :bash:`impexp:import --updateRecords`
- :bash:`impexp:import --ignorePid`
- :bash:`impexp:import --forceUid`
- :bash:`impexp:import --importMode`
- :bash:`impexp:import --enableLog`
The following dependency injection container entries have been removed:
- `\TYPO3\CMS\Core\Localization\LanguageService`
- `\TYPO3\CMS\Fluid\Core\Rendering\RenderingContext`
- `\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController`
Impact
======
Using above removed functionality will most likely raise PHP fatal level errors,
may change website output or crashes browser JavaScript.
.. index:: Backend, CLI, FlexForm, Fluid, Frontend, JavaScript, LocalConfiguration, PHP-API, TCA, TSConfig, TypoScript, PartiallyScanned
@@ -0,0 +1,47 @@
.. include:: /Includes.rst.txt
.. _breaking-96149:
================================================================
Breaking: #96149 - EXT:form EmailFinisher always uses FluidEmail
================================================================
See :issue:`96149`
Description
===========
In recent versions, the :php:`EmailFinisher` of EXT:form allowed sending
emails with either :php:`StandaloneView` or via :php:`FluidEmail`, which
has been introduced in TYPO3 v10. The :php:`StandaloneView` option has
therefore now been removed together with the :file:`Html.html` and
:file:`Plaintext.html` templates.
Impact
======
Since the EXT:form :php:`EmailFinisher` is now always using :php:`FluidEmail`
for sending emails, the :yaml:`templatePathAndFilename` is not evaluated
anymore. For forms, which still define custom templates with this option,
a fallback kicks in, sending the emails with the default EXT:form
:php:`FluidEmail` templates.
Also the :yaml:`useFluidEmail` configuration option, previously used to
allow a smooth migration path is now obsolete and can safely be removed
from any form finisher configuration.
Affected Installations
======================
Installations, which have not yet switched to :php:`FluidEmail`, while using
custom email templates, configured with :yaml:`templatePathAndFilename`.
Migration
=========
In case you use custom email templates, replace :yaml:`templatePathAndFilename`
with the :yaml:`templateName` and :yaml:`templateRootPaths` options. Also
make sure, you have separate template files for the used formats, e.g.
:file:`ContactForm.html` and :file:`ContactForm.txt`.
.. index:: YAML, NotScanned, ext:form
@@ -0,0 +1,67 @@
.. include:: /Includes.rst.txt
.. _breaking-96154:
================================================================
Breaking: #96154 - Deprecated Shortcut API functionality removed
================================================================
See :issue:`96154`
Description
===========
In TYPO3 v11 the Shortcut API was reworked to clean up the codebase and
to align with the new Backend routing. Therefore, previously deprecated
functionality has now been removed.
The following methods have been removed:
- :php:`\TYPO3\CMS\Backend\Template\ModuleTemplate->makeShortcutIcon()`
- :php:`\TYPO3\CMS\Backend\Template\ModuleTemplate->makeShortcutUrl()`
- :php:`\TYPO3\CMS\Backend\Template\Components\Buttons\Action\ShortcutButton->getGetVariables()`
- :php:`\TYPO3\CMS\Backend\Template\Components\Buttons\Action\ShortcutButton->getModuleName()`
- :php:`\TYPO3\CMS\Backend\Template\Components\Buttons\Action\ShortcutButton->getSetVariables()`
- :php:`\TYPO3\CMS\Backend\Template\Components\Buttons\Action\ShortcutButton->setGetVariables()`
- :php:`\TYPO3\CMS\Backend\Template\Components\Buttons\Action\ShortcutButton->setModuleName()`
- :php:`\TYPO3\CMS\Backend\Template\Components\Buttons\Action\ShortcutButton->setSetVariables()`
The following ViewHelper has been removed:
- :html:`<f:be.buttons.shortcut>`
The following functionality has been removed:
- The automatic fallback, calculating a title for a new shortcut, based on the module
- The automatic fallback, calculating a description for existing shortcuts, based on the module
- The automatic fallback, determining the route identifier, based on the route path
- The automatic fallback, determining the route identifier, based on the module name
- The automatic fallback, determining the route identifier, based on the route parameter
Impact
======
Calling one of the removed methods or using the ViewHelper will most likely
raise a PHP fatal level error.
When using an existing shortcut without a title, the fallback "Shortcut"
will be displayed.
When adding a :php:`ShortcutButton`, without providing a valid route
identifier or a display name, an exception will be triggered.
Affected Installations
======================
All installations using one of the mentioned methods or the ViewHelper.
All installations relying on one or multiple of the mentioned fallbacks.
Migration
=========
Remove any usage to the mentioned methods or the ViewHelper.
Properly add the :php:`ShortcutButton` with the required information.
.. index:: Backend, PHP-API, PartiallyScanned, ext:backend
@@ -0,0 +1,69 @@
.. include:: /Includes.rst.txt
.. _breaking-96158:
==========================================================================
Breaking: #96158 - Remove support for inline JavaScript in fieldChangeFunc
==========================================================================
See :issue:`96158`
Description
===========
Custom :php:`FormEngine` nodes allow to use internal property `fieldChangeFunc`
to add or modify client-side JavaScript behavior when field values are changed.
Through TYPO3 v11 it was possible to directly use inline JavaScript that was
assigned as plain :php:`string` type. With TYPO3 v12.0 inline JavaScript is
not supported anymore - values assigned to `fieldChangeFunc` items have to
implement :php:`\TYPO3\CMS\Backend\Form\Behavior\OnFieldChangeInterface`
which allows to declare the behavior in a structured way.
Impact
======
Assigning scalar values to `fieldChangeFunc` items - without using
:php:`\TYPO3\CMS\Backend\Form\Behavior\OnFieldChangeInterface` - is not
supported anymore and will lead to PHP type errors.
Affected Installations
======================
Installations implementing custom :php:`FormEngine` components (wizards, nodes,
render-types, ...) that provide inline JavaScript using `fieldChangeFunc`.
.. code-block:: php
// examples
$this->data['parameterArray']['fieldChangeFunc']['example'] = "alert('demo');";
$parameterArray['fieldChangeFunc']['example'] = "alert('demo');";
Migration
=========
:doc:`Previous deprecation ChangeLog documentation <../11.5/Deprecation-91787-DeprecateInlineJavaScriptInFieldChangeFunc>`
provided migration details already. A complete and installable example is available with
`ext:demo_91787 <https://github.com/ohader/demo_91787>`__ as well.
The provided code examples are supposed to work with TYPO3 v11 and v12, easing
the migration path for extension maintainers. The crucial point is to use
:php:`\TYPO3\CMS\Backend\Form\Behavior\OnFieldChangeInterface` which still
would inline JavaScript as a fallback in TYPO3 v11.
Thus, basically scalar assignments like...
.. code-block:: php
// examples
$this->data['parameterArray']['fieldChangeFunc']['example'] = "alert('demo');";
$parameterArray['fieldChangeFunc']['example'] = "alert('demo');";
... have to be replaced by custom :php:`OnFieldChangeInterface` instances...
.. code-block:: php
// examples
$this->data['parameterArray']['fieldChangeFunc']['example'] = new AlertOnFieldChange('demo');
$parameterArray['fieldChangeFunc']['example'] = new AlertOnFieldChange('demo');
.. index:: Backend, JavaScript, TCA, NotScanned, ext:backend
@@ -0,0 +1,49 @@
.. include:: /Includes.rst.txt
.. _breaking-96205:
==================================================================
Breaking: #96205 - Removal of last relativeToCurrentScript remains
==================================================================
See :issue:`96205`
Description
===========
Due to the removal of relative paths in the FAL API (:issue:`95027` and
:issue:`96201`) the :php:`$usedPathsRelativeToCurrentScript` argument in
media renderers :php:`render()` method got obsolete. The same applies to
the :php:`$relativeToCurrentScript` argument of :php:`Avatar->getUrl()`.
Therefore, :php:`$usedPathsRelativeToCurrentScript` is removed as last
argument from following PHP class methods:
- :php:`\TYPO3\CMS\Core\Resource\Rendering\AudioTagRenderer->render()`
- :php:`\TYPO3\CMS\Core\Resource\Rendering\FileRendererInterface->render()`
- :php:`\TYPO3\CMS\Core\Resource\Rendering\VideoTagRenderer->render()`
- :php:`\TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer->render()`
- :php:`\TYPO3\CMS\Core\Resource\Rendering\YoutubeRenderer->render()`
Further is :php:`$relativeToCurrentScript` removed as last argument
from :php:`\TYPO3\CMS\Backend\Backend\Avatar->getUrl()`.
Impact
======
Passing the removed argument to one of the mentioned methods does
no longer have any effect.
Affected Installations
======================
Installations, passing the removed argument to one of the mentioned
methods, which is rather unlikely as those methods are usually not
called by extension code directly.
Migration
=========
Remove the corresponding argument from the methods.
.. index:: FAL, PHP-API, FullyScanned, ext:core
@@ -0,0 +1,48 @@
.. include:: /Includes.rst.txt
.. _breaking-96212:
==============================================================
Breaking: #96212 - Alt text is enforced for custom login logos
==============================================================
See :issue:`96212`
Description
===========
To improve the accessibility of the login screen, the :html:`alt` attribute
has been added to the login logo in :issue:`92628`. In case installations use
a custom login logo, configured in :php:`$GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['backend']['loginLogo']`,
it had also been possible to add a corresponding "alt" text for it with
:php:`$GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['backend']['loginLogoAlt']`.
In case a custom logo was used, but no custom "alt" text configured, the
:html:`alt` attribute was omitted. This has changed. The :html:`alt`
attribute is now always added to the login logo. In case a custom logo is
used, but no custom "alt" text defined, TYPO3 now automatically falls back
to a default "alt" text.
Impact
======
The :html:`alt` attribute is now enforced for the login logo.
Affected Installations
======================
All installations using a custom login logo, while not defining a
corresponding "alt" text.
Migration
=========
Add a corresponding "alt" text with
:php:`$GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['backend']['loginLogoAlt']`.
.. note::
Those settings are also available in the backend extension configuration
:guilabel:`Admin Tools -> Settings -> Configure extensions -> backend`
.. index:: Backend, LocalConfiguration, NotScanned, ext:backend
@@ -0,0 +1,65 @@
.. include:: /Includes.rst.txt
.. _breaking-96221:
==========================================================================
Breaking: #96221 - Deny inline JavaScript in FormEngine's requireJsModules
==========================================================================
See :issue:`96221`
Description
===========
Custom :php:`FormEngine` components allowed to load RequireJS modules
with arbitrary inline JavaScript to initialize those modules. In favor
of introducing content security policy headers, the amount of inline
JavaScript shall be reduced and replaced by corresponding declarations.
Using callback functions as inline JavaScript is not possible anymore,
initializations have to be declared using an instance of
:php:`TYPO3\CMS\Core\Page\JavaScriptModuleInstruction`.
Impact
======
Using inline JavaScript to initialize RequireJS modules in `FormEngine`,
like shown in the example below, will throw a corresponding
:php:`\LogicException`.
.. code-block:: php
$resultArray['requireJsModules'][] = ['TYPO3/CMS/Backend/FormEngine/Element/InputDateTimeElement' => '
// inline JavaScript code to initialize `InputDateTimeElement`
function(InputDateTimeElement) {
new InputDateTimeElement(' . GeneralUtility::quoteJSvalue($fieldId) . ');
}'
];
Affected Installations
======================
All instances that are using RequireJS modules with custom initializations
as inline JavaScript in `FormEngine`.
Migration
=========
:doc:`Previous deprecation ChangeLog documentation <../11.5/Deprecation-95200-DeprecateRequireJSCallbacksAsInlineJavaScript>`
provided migration details already.
The following snippet shows the migrated source code of shown above - using
:php:`TYPO3\CMS\Core\Page\JavaScriptModuleInstruction` instead of inline JavaScript.
.. code-block:: php
// use use TYPO3\CMS\Core\Page\JavaScriptModuleInstruction;
$resultArray['requireJsModules'][] = JavaScriptModuleInstruction::forRequireJS(
'TYPO3/CMS/Backend/FormEngine/Element/InputDateTimeElement'
)->instance($fieldId);
:php:`JavaScriptModuleInstruction` forwards arguments as `JSON` data - and thus
handles proper context-aware encoding implicitly (:php:`GeneralUtility::quoteJSvalue`
and similar custom encoding can be omitted in this case).
.. index:: Backend, JavaScript, NotScanned, ext:backend
@@ -0,0 +1,46 @@
.. include:: /Includes.rst.txt
.. _breaking-96222:
======================================================
Breaking: #96222 - Add getOptions() to WidgetInterface
======================================================
See :issue:`96222`
Description
===========
With :issue:`93210` the dashboard was extended for the functionality to
refresh single widgets. This also required to extend the :php:`WidgetInterface`.
To stick to TYPO3's backwards compatibility promise, the new method was
commented out and instead a :php:`methodExists()` check performed.
This now has changed. The check is removed and the :php:`WidgetInterface`
now forces the presence of the :php:`getOptions()` method in all widgets.
Impact
======
All dashboard widgets are now forced to implement the :php:`getOptions()`
method, returning the widget options. Otherwise this will cause a PHP
fatal error.
Affected Installations
======================
All installations using custom dashboard widgets.
Migration
=========
Add the :php:`getOptions()` method to all of your custom widget classes.
.. code-block:: php
public function getOptions(): array
{
return $this->options;
}
.. index:: Backend, PHP-API, NotScanned, ext:dashboard
@@ -0,0 +1,64 @@
.. include:: /Includes.rst.txt
.. _breaking-96263:
==================================================================
Breaking: #96263 - Remove jQuery promise support for AJAX requests
==================================================================
See :issue:`96263`
Description
===========
With :issue:`89738`, a polyfill for jQuery promises was introduced to ease the
migration of :js:`$.ajax()` to our AJAX request API.
The polyfilled methods :js:`done()` and :js:`fail()` are now removed.
Impact
======
Relying on the existence of the polyfill will trigger JavaScript errors.
Affected Installations
======================
All extensions using the polyfilled methods are affected.
Migration
=========
For success handling, replace :js:`done()` with :js:`then()`.
Example:
.. code-block:: js
// Polyfill
new AjaxRequest('/foobar/baz').get().done(function(response) {
// do stuff
});
// Native
new AjaxRequest('/foobar/baz').get().then(async function(response) {
// do stuff
});
For error handling, replace :js:`fail()` with :js:`catch()`.
Example:
.. code-block:: js
// Polyfill
new AjaxRequest('/foobar/baz').get().fail(function() {
// oh noes
});
// Native
new AjaxRequest('/foobar/baz').get().catch(function() {
// oh noes
});
.. index:: JavaScript, NotScanned, ext:core
@@ -0,0 +1,73 @@
.. include:: /Includes.rst.txt
.. _breaking-96287:
===================================
Breaking: #96287 - Doctrine DBAL v3
===================================
See :issue:`96287`
Description
===========
TYPO3 v12.0 has updated its Database Abstraction package based on Doctrine
DBAL to the next major version Doctrine DBAL v3.
Impact
======
Doctrine DBAL 3 has undergone major refactorings internally by separating
Doctrine's internal driver logic from PHP's native PDO functionality.
See https://www.doctrine-project.org/2021/03/29/dbal-2.13.html and
https://www.doctrine-project.org/2020/11/17/dbal-3.0.0.html
for more details.
In addition, most database APIs which TYPO3 provides as wrappers around
the existing functionality is already available in TYPO3 v11 and
continue to work in TYPO3 v12.
Affected Installations
======================
TYPO3 installations with custom third-party extensions using TYPO3's
Database Abstraction functionality, or extensions using
the Doctrine DBAL API directly.
Migration
=========
Read Doctrine's migration paths (see links above) to migrate any existing
code.
The main change for 95% of the developers are, that queries and database result-sets
now have more explicit APIs when querying the database.
Examples:
.. code-block:: php
$result = $queryBuilder
->select(...)
->from(...)
// use executeQuery() instead of execute()
->executeQuery();
:php:`$result` is now of type :php:`\Doctrine\DBAL\Result`, and not of type
:php:`\Doctrine\DBAL\Statement` anymore, which allows to fetch rows / columns via
new and more speaking methods:
* :php:`->fetchAllAssociative()` instead of :php:`->fetchAll()`
* :php:`->fetchAssociative()` - instead of :php:`->fetch()`
* :php:`->fetchOne()` - instead of :php:`->fetchColumn(0)`
The method :php:`executeQuery` - available in the QueryBuilder and
the Connection class is now in for select/count queries and returns a Result
object directly, whereas :php:`executeStatement()` is used for insert / update / delete
statements, returning an integer - the number of affected rows.
Use both methods instead of the previous :php:`execute()` method,
which is still available for backwards-compatibility.
.. index:: Database, NotScanned, ext:core
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _breaking-96291:
==============================================================
Breaking: #96291 - Disallow DB connection before TCA is loaded
==============================================================
See :issue:`96291`
Description
===========
Accessing the database API before TCA is loaded
is considered to be a logic mistake, as TCA is required
to generate the expected database schema.
Impact
======
Extensions that access the TYPO3 database API in
:file:`ext_localconf.php` files or TCA files will not work
any more, because TYPO3 will throw an exception in this case.
Affected Installations
======================
TYPO3 installations with third-party extensions,
that access database API before TCA is loaded.
Migration
=========
Database API can be accessed earliest in the
:php:`\TYPO3\CMS\Core\Core\Event\BootCompletedEvent`.
.. index:: Database, NotScanned, ext:core
@@ -0,0 +1,123 @@
.. include:: /Includes.rst.txt
.. _breaking-96333:
===================================================================
Breaking: #96333 - Auto configuration of ContextMenu item providers
===================================================================
See :issue:`96333`
Description
===========
ContextMenu item providers, implementing :php:`\TYPO3\CMS\Backend\ContextMenu\ItemProviders\ProviderInterface`
are now automatically registered by adding the :yaml:`backend.contextmenu.itemprovider`
tag, if :yaml:`autoconfigure` is enabled in :file:`Services.yaml`. The new
:php:`\TYPO3\CMS\Backend\ContextMenu\ItemProviders\ItemProvidersRegistry` then
automatically receives those services and registers them.
All Core item providers extend the :php:`AbstractProvider` class, which is
usually also used by extensions. Due to the auto configuration, the context
information (table, record identifier and context) is no longer passed to the
:php:`__construct()`, but instead to the new :php:`setContext()` method.
The :php:`setContext()` method is therefore required for all item providers.
Impact
======
The registration via :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['ContextMenu']['ItemProviders']`
isn't evaluated anymore.
The item providers are retrieved from the container and are no longer
instantiated while passing context information as constructor arguments.
The context information is now passed to :php:`setContext()`.
Affected Installations
======================
All extensions, registering custom ContextMenu item providers.
All extensions, extending :php:`AbstractProvider` and overwriting the
:php:`__construct()` method.
All extensions, not extending :php:`AbstractProvider`, but implementing
:php:`\TYPO3\CMS\Backend\ContextMenu\ItemProviders\ProviderInterface` directly.
Migration
=========
Remove :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['ContextMenu']['ItemProviders']`
from your :file:`ext_localconf.php` file. If :yaml:`autoconfigure` is
not enabled in your :file:`Configuration/Services.(yaml|php)` file,
manually configure your item providers with the
:yaml:`backend.contextmenu.itemprovider` tag.
If your item providers extend :php:`AbstractProvider` and overwrite the
:php:`__construct()` method, adjust the signature like shown below:
.. code-block:: php
// Before
class MyItemProvider extends AbstractProvider {
public function __construct(string $table, string $identifier, string $context = '')
{
parent::__construct($table, $identifier, $context);
// My custom code
}
}
// After
class MyItemProvider extends AbstractProvider {
public function __construct()
{
parent::__construct();
// My custom code
}
}
In case you rely on the arguments, previously passed to :php:`__construct()`,
you can override the new :php:`setContext()` method, which is executed
prior to any other action like :php:`canHandle()`.
.. code-block:: php
// Before
class MyItemProvider extends AbstractProvider {
public function __construct(string $table, string $identifier, string $context = '')
{
parent::__construct($table, $identifier, $context);
if ($table === 'my_table') {
// Do something
}
}
// After
class MyItemProvider extends AbstractProvider {
public function setContext(string $table, string $identifier, string $context = ''): void
{
parent::setContext($table, $identifier, $context);
if ($table === 'my_table') {
// Do something
}
}
}
In case your item provider does not extend :php:`AbstractProvider`, but instead
implements the :php:`\TYPO3\CMS\Backend\ContextMenu\ItemProviders\ProviderInterface`
directly, add the new :php:`setContext()` to the item provider.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _breaking-96351:
============================================================================
Breaking: #96351 - Unused TemplateService->updateRootlineData method removed
============================================================================
See :issue:`96351`
Description
===========
The PHP method :php:`TemplateService->updateRootlineData()` has been removed.
It was used as a workaround to update the fetched rootline with
translated pages until TYPO3 v10. This was necessary because the
TypoScript information contained the language information, and
then the page translations were loaded accordingly.
Since TYPO3 v11 the language is resolved earlier, at the same
time as the page ID, and the mechanism became obsolete.
Impact
======
Calling the method in PHP will throw a fatal PHP error, as the method does not exist anymore.
Affected Installations
======================
TYPO3 installations, mainly legacy installations with legacy
extensions using this method to boot up their own TypoScript
parsing.
Migration
=========
Calling this method is not needed anymore and can be removed
from the affected code.
.. index:: Frontend, PHP-API, FullyScanned, ext:core
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _breaking-96501:
==================================================================
Breaking: #96501 - prefixLocalAnchors option in HTMLParser removed
==================================================================
See :issue:`96501`
Description
===========
The property :php:`prefixLocalAnchors` in TypoScript's HTMLParser
is removed without substitution.
This is a leftover from times before there was Site Handling
and absolute URLs, related to :typoscript:`config.prefixLocalAnchors` which was
removed in TYPO3 v8.
The option has many side-effects such as relying on the request
when parsing HTML (which behaves differently in TYPO3 Backend
and in Frontend).
Impact
======
Setting this TypoScript option has no effect anymore.
Affected Installations
======================
TYPO3 installation having TypoScript configured with this
option activated.
Migration
=========
None.
.. index:: Frontend, TypoScript, NotScanned, ext:frontend
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _breaking-96517:
====================================================
Breaking: #96517 - TMENU.collapse TypoScript removed
====================================================
See :issue:`96517`
Description
===========
The :typoscript:`collapse` TypoScript property of :typoscript:`TMENU` is removed
without substitution.
When set, active :typoscript:`TMENU` items previously linked to their parent page,
which was primarily a use case for :typoscript:`GMENU_LAYERS`, which was
removed in TYPO3 v6.0.
Impact
======
Setting this TypoScript option has no effect anymore.
Affected Installations
======================
TYPO3 installations with :typoscript:`TMENU` definitions having this option
set which is highly unlikely.
Migration
=========
Use a custom user function or the PSR-14 :php:`FilterMenuItemsEvent` event to modify
the menu items.
.. index:: Frontend, TypoScript, NotScanned, ext:frontend
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _breaking-96518:
==================================================================
Breaking: #96518 - ext_typoscript_*.txt files not included anymore
==================================================================
See :issue:`96518`
Description
===========
In previous TYPO3 versions, files named :file:`ext_typoscript_setup.txt` and
:file:`ext_typoscript_constants.txt` which could be placed into an extension's
root folder, were automatically included for all TypoScript evaluations.
This functionality stopped working, as the file ending `.typoscript`
has been unified since TYPO3 v8.
Impact
======
Contents of these files are not evaluated for TypoScript anymore.
Affected Installations
======================
TYPO3 installations with custom extensions including such files.
Migration
=========
Rename the files to :file:`ext_typoscript_setup.typoscript` and
:file:`ext_typoscript_constants.typoscript` which ensures compatibility
with all supported TYPO3 versions.
The file extension `.typoscript` was used since TYPO3 v8 and both versions (.txt
and .typoscript) have been working side-by-side since TYPO3 v8.
.. index:: TypoScript, NotScanned, ext:core
@@ -0,0 +1,90 @@
.. include:: /Includes.rst.txt
.. _breaking-96520:
=====================================================================
Breaking: #96520 - Enforce non-empty configuration in cObj::parseFunc
=====================================================================
See :issue:`96520`
Description
===========
Invoking :php:`ContentObjectRenderer::parseFunc` without configuration
or TypoScript reference is not possible anymore and in general did not
make much sense.
Calling this method without any instructions led to various
side-effects, e.g. unintentionally enforcing `typo3/html-sanitizer`.
This problem was amplified when using :html:`<f:format.html parseFuncTSPath="">`
with an explicitly empty reference which actually did not do anything
and behaved the same as :html:`<f:format.raw>`.
This change enforces that parseFunc is only invoked with actual
instructions. An empty configuration will throw a :php:`\LogicException` and
requires corresponding source code or Fluid templates to be adjusted.
Impact
======
Still invoking :php:`ContentObjectRenderer::parseFunc` without configuration
will throw a :php:`\LogicException` in the frontend rendering process.
Affected Installations
======================
All installations using one of the following examples
PHP
---
.. code-block:: php
/** @var \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer $cObj */
$cObj->parseFunc($content, []);
$cObj->parseFunc($content, [], '');
$cObj->parseFunc($content, [], '< null.this.does.not.exist');
TypoScript
----------
.. code-block:: typoscript
# `1` is considered a TypoScript reference which
# most probably does not exist
stdWrap.parseFunc = 1
# non-existing TypoScript reference leading to empty configuration
stdWrap.parseFunc =< null.this.does.not.exist
Fluid Templates
---------------
.. code-block:: html
<!-- empty TypoScript reference leading to empty configuration -->
<f:format.html parseFuncTSPath="">{content}</f:format.html>
<!-- non-existing TypoScript reference leading to empty configuration -->
<f:format.html parseFuncTSPath="null.this.does.not.exist">{content}</f:format.html>
Migration
=========
Invocations of `parseFunc` in PHP and TypoScript without using
any configuration or TypoScript reference have to be removed.
In Fluid templates :html:`<f:format.html parseFuncTSPath="">`
has the same effect as :html:`<f:format.raw>` which can be used
as replacement. However content is used "as-is" without further
sanitizing against cross-site scripting.
In case of the need for just replacing links with typolink,
it is recommended to use :html:`<f:transform.html>` ViewHelper.
Thus, any occurrence of the new :php:`\LogicException` mentioned above,
is also an indicator of some missing processing that has been unseen in
custom source code or template instructions.
.. index:: Frontend, TypoScript, NotScanned, ext:frontend
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _breaking-96522:
========================================================
Breaking: #96522 - config.disablePageExternalUrl removed
========================================================
See :issue:`96522`
Description
===========
The TypoScript setting :typoscript:`config.disablePageExternalUrl` has been removed.
In previous versions, it allowed to have third-party extensions such as
"jumpurl" handle the redirect, and/or do tracking like extensions "sys_stat"
did back in 2006. TYPO3 Core did not do a redirect itself then when this
option was activated.
Impact
======
This option is removed, meaning that TYPO3 Core will always handle a deep link
to a page with an external URL as a redirect, which has been the default
behaviour for TYPO3 installations anyways.
Affected Installations
======================
TYPO3 installations explicitly setting this option, which is highly unlikely,
as modern solutions - even jumpurl - use middlewares already since TYPO3 v9.
Migration
=========
Migrate to a PSR-15 middleware in your own extension to mimic the same behavior,
if this option was actually useful for anybody in recent years.
.. index:: Frontend, TypoScript, NotScanned, ext:frontend
@@ -0,0 +1,47 @@
.. include:: /Includes.rst.txt
.. _breaking-96526:
==================================================================
Breaking: #96526 - Removed hooks for modifying page module content
==================================================================
See :issue:`96526`
Description
===========
The previously available hooks to modify the header
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/db_layout.php']['drawHeaderHook']`
and footer :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/db_layout.php']['drawFooterHook']`
content of the page module have been removed in favor of a new PSR-14
event :php:`TYPO3\CMS\Backend\Controller\Event\ModifyPageLayoutContentEvent`.
The public method :php:`PageLayoutController->getModuleTemplate()` has been
removed as well, since it was only used for the removed hooks.
Impact
======
Registering any of the mentioned hooks does no longer have any
effect in TYPO3 v12.0+. The extension scanner will detect usages
as strong match.
The method :php:`PageLayoutController->getModuleTemplate()` is no longer
available and will therefore lead to PHP errors when called from extension
code. The extension scanner will detect usages as weak match.
Affected Installations
======================
TYPO3 installations using one of the mentioned hooks or calling
:php:`PageLayoutController->getModuleTemplate()` in custom extension
code.
Migration
=========
Replace the hooks with the new PSR-14
:doc:`ModifyPageLayoutContentEvent <../12.0/Feature-96526-PSR-14EventForModifyingPageModuleContent>` event.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,54 @@
.. include:: /Includes.rst.txt
.. _breaking-96550:
=================================================================
Breaking: #96550 - TYPO3_CONF_VARS['SYS']['USdateFormat'] removed
=================================================================
See :issue:`96550`
Description
===========
The TYPO3 configuration had a boolean toggle
:php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['USdateFormat']` that
changed the date rendering from "day-month-year" to "month-day-year"
in a couple of places in the backend - most prominently when editing records.
This configuration conflicts with option
:php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy']`, which is a broader approach
to configure a system wide date rendering format, especially in combination with option
:php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm']`.
To streamline date and time rendering in the backend and to eventually implement
a user-based and timezone-aware solution, option :php:`USdateFormat` has been
removed in favor of :php:`ddmmyy` from the configuration and is ignored now.
Impact
======
Backend users of instances with this option set to :php:`true` will experience
swapped day and month rendering when editing records in the backend.
The option is removed automatically from :file:`LocalConfiguration.php`
when upgrading to TYPO3 v12.
Affected Installations
======================
Instances having :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['USdateFormat']` set to
default :php:`false` see no difference and are not affected. Instances with this
option set to :php:`true` are affected.
The extension scanner will find matching candidates in case the option is used
in extensions.
Migration
=========
Extensions accessing :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['USdateFormat']`
should assume :php:`false` to keep compatibility with previous TYPO3 versions,
and should phase out the option usage.
.. index:: Backend, LocalConfiguration, FullyScanned, ext:backend
@@ -0,0 +1,43 @@
.. include:: /Includes.rst.txt
.. _breaking-96553:
================================================
Breaking: #96553 - TYPO3 v12 system requirements
================================================
See :issue:`96553`
Description
===========
The minimum PHP version required to run TYPO3 version v12 has been defined as 8.1.
TYPO3 v12 supports these database products and versions:
* MySQL 8.0 or higher
* MariaDB 10.3 or higher
* PostgreSQL 10.0 or higher
* SQLite 3.8.3 or higher
* Support for Microsoft SQL Server in any version is discontinued
Impact
======
The TYPO3 Core codebase and extensions tailored for v12 and above can use
features implemented with PHP up to and including 8.1. Running TYPO3 v12 with older PHP
versions or database engines will trigger fatal errors.
Affected Installations
======================
Hosting a TYPO3 instance based on version 12 may require an update of the
PHP platform and the database engine.
Migration
=========
TYPO3 v11 supports PHP 8.1 and database engines required by v12. This allows upgrading
the platform in a first step and upgrading to TYPO3 v12 in a second step.
.. index:: Database, PHP-API, NotScanned, ext:core
@@ -0,0 +1,74 @@
.. include:: /Includes.rst.txt
.. _breaking-96575-1663324432:
=========================================
Breaking: #96575 - Update to CodeMirror 6
=========================================
See :issue:`96575`
Description
===========
TYPO3 Core now ships with CodeMirror v6.
CodeMirror is used as editor in the TYPO3 Backend for editing
HTML records, TypoScript templates and plaintext files in the file module.
Impact
======
Existing CodeMirror v5 addons and modes need to be adapted for CodeMirror v6
which brings a completely rewritten plugin infrastructure.
Affected installations
======================
TYPO3 Installations with third-party extensions that register
custom CodeMirror addons or modes.
Migration
=========
Please consult https://codemirror.net/docs/migration/ for details on
CodeMirror migration itself.
The TYPO3 integration has been adapted to reflect the changed modes and
addons in the `T3editor` configuration files:
Adapt the mode configuration in :file:`Configuration/Backend/T3editor/Modes.php`
to use :php:`JavaScriptModuleInstruction` statements that pick ES6 module
for a specific language mode. A RequireJS module like
:js:`codemirror/mode/css/css` is now shipped in `@codemirror/lang-css`:
.. code-block:: php
use TYPO3\CMS\Core\Page\JavaScriptModuleInstruction;
return [
'css' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/lang-css', 'css')->invoke(),
'extensions' => ['css'],
],
];
Addons no longer bring :php:`cssFiles` or :php:`options`, but only consist
of a :php:`module` and an optional :php:`keymap` statement, as the `options`
interface is gone in CodeMirror v6 and stylesheets are to be embedded into
JavaScript.
See following example for the registration of the history addon via
:file:`Configuration/Backend/T3editor/Modes.php`:
.. code-block:: php
use TYPO3\CMS\Core\Page\JavaScriptModuleInstruction;
return [
'history' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/commands', 'history')->invoke(),
'keymap' => JavaScriptModuleInstruction::create('@codemirror/commands', 'historyKeymap'),
],
];
.. index:: Backend, JavaScript, NotScanned, ext:t3editor
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _breaking-96604:
==============================================================
Breaking: #96604 - Removed ModuleTemplate->addJavaScriptCode()
==============================================================
See :issue:`96604`
Description
===========
The backend module related class method :php:`\TYPO3\CMS\Backend\Template\ModuleTemplate->addJavaScriptCode()`
has been removed.
The method allowed to add JavaScript inline code to the document
body of backend modules. This collides with `Content-Security-Policy` HTTP headers
and needs to be avoided.
The method has been marked :php:`@internal` in late TYPO3 v11 development and
has been removed in v12.
Impact
======
Calling the method in an instance triggers a fatal PHP error.
Affected Installations
======================
The extension scanner finds usage candidates as weak match. In general,
instances with extensions that come with own backend modules may be affected.
Migration
=========
There are various ways to migrate away from inline JavaScript in backend modules, a modern TYPO3 v12
solution is :doc:`JavaScript ES6 modules <Feature-96510-InfrastructureForJavaScriptModulesAndImportmaps>`.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,59 @@
.. include:: /Includes.rst.txt
.. _breaking-96616:
=======================================================
Breaking: #96616 - Remove Frontend Login Mode for pages
=======================================================
See :issue:`96616`
Description
===========
In order to reduce complexity for frontend requests,
the rarely used `frontend user login mode` functionality has been removed.
It previously allowed to define branches, which should behave as if a user
or usergroup was not logged in, even though a user was kept logged in as the cookie was
not removed during such a request. This feature was only introduced back in 2004 by Kasper
to overcome caching issues on typo3.org and is considered an edge-case feature,
which is better suited in an extension solved via a PSR-15 middleware nowadays.
As a consequence, next to the corresponding DB / TCA field :php:`pages.fe_login_mode`
the following public methods have been removed:
- :php:`\TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication->hideActiveLogin()`
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->checkIfLoginAllowedInBranch()`
Additionally, the following TypoScript configuration has no effect anymore:
- :typoscript:`config.sendCacheHeaders_onlyWhenLoginDeniedInBranch`
Impact
======
The functionality is no longer part of TYPO3 Core. Calling the related methods
in custom extension code will lead to a fatal PHP error. The extension scanner
will detect usages as weak match.
Affected Installations
======================
TYPO3 installations currently using the functionality or calling the
mentioned methods in custom extension code, which is very unlikely.
This can be checked by searching for database records in the DB "pages"
table having "fe_login_mode > 0".
Migration
=========
Remove any usage of the mentioned methods.
In case you currently rely on the functionality, use the upgrade wizard
provided by the install tool to fetch and load the public `fe_login_mode`
extension from `TER <https://extensions.typo3.org/extension/fe_login_mode>`_.
This extension provides the same functionality using a PSR-15 middleware.
.. index:: Frontend, TCA, FullyScanned, ext:frontend
@@ -0,0 +1,54 @@
.. include:: /Includes.rst.txt
.. _breaking-96641:
=================================================
Breaking: #96641 - TypoLink related hooks removed
=================================================
See :issue:`96641`
Description
===========
Following hooks, related to link generation with TYPO3's Frontend
Link building technique `typoLink`, have been removed in favor of
the new PSR-14 events :php:`\TYPO3\CMS\Frontend\Event\AfterLinkIsGeneratedEvent`:
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['typoLink_PostProc']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['getATagParamsPostProc']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['urlProcessing']['urlProcessors']`
Especially the latter functionality was not available
for all link types (only mail, file + external links).
At the same time, some external links and mail links were not
using `typoLink`, because internally the method :php:`$cObj->http_makelinks()`
had been used.
This architectural design flaw had been solved by introducing
a unified Link Generation API ("LinkFactory").
Impact
======
Using these hooks in extensions has no effect anymore in TYPO3 v12+.
Affected Installations
======================
TYPO3 installations with custom extensions using these hooks for
modifying links. The extension scanner in the Upgrade module / Install
tool will show affected occurrences.
Migration
=========
In order to make TYPO3 extensions compatible with TYPO3 v11 and
TYPO3 v12 simultaneously, the new PSR-14 event :php:`AfterLinkIsGeneratedEvent`
should be added in addition to the existing hooks.
The new :doc:`PSR-14 event <../12.0/Feature-96641-NewPSR-14EventForModifyingLinks>`
contains all information about the link result and the configuration itself.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,50 @@
.. include:: /Includes.rst.txt
.. _breaking-96659:
===============================================================
Breaking: #96659 - Registration of cObjects via TYPO3_CONF_VARS
===============================================================
See :issue:`96659`
Description
===========
Since TYPO3 v12.0. custom Content Objects such as `TEXT` or `HMENU`
are registered via the service configuration.
The previous way of registering custom Content Objects via
:php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['ContentObjects']`
added in TYPO3 v7.2 (see :issue:`64386`) has been removed.
Impact
======
TYPO3 installations using the previous way of registering custom or overridden
Content Objects will not return the rendered frontend output for this specific
Content Object anymore, which is a very rare case.
Affected Installations
======================
TYPO3 installations with extensions registering custom Content Objects.
Migration
=========
Extensions registering custom Content Objects should now use the service
configuration:
.. code-block:: yaml
MyCompany\MyPackage\ContentObject\CustomContentObject:
tags:
- name: frontend.contentobject
identifier: 'MY_OBJ'
Extensions can be made compatible with TYPO3 v7 - v12 by keeping the "old"
way of registration in :file:`ext_localconf.php` and additionally add the new
registration way, without any further changes.
.. index:: Frontend, TypoScript, FullyScanned, ext:frontend
@@ -0,0 +1,55 @@
.. include:: /Includes.rst.txt
.. _breaking-96708:
==========================================================
Breaking: #96708 - Removed support for accesskeys in HMENU
==========================================================
See :issue:`96708`
Description
===========
TYPO3's built-in support for menu generation, adding :html:`accesskey`
HTML attributes to menu items has been removed.
As stated by various sources such as
* https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/accesskey#accessibility_concerns
* https://webaim.org/standards/wcag/checklist#:~:text=accesskey%20should%20typically%20be%20avoided
this feature should only be used by explicitly defining access keys when
a use-case is given.
TYPO3 menus previously used a random link title as an access key, when the
TypoScript property :typoscript:`HMENU.accessKey = 1` was set.
Along with the accessKey functionality, the public property
:php:`TypoScriptFrontendController->accessKey` has been removed.
Impact
======
Setting the TypoScript option has no effect anymore.
Accessing the removed public property will trigger a PHP warning. The
extension scanner will detect usages as weak match.
Affected Installations
======================
TYPO3 installations using the :typoscript:`accessKey` feature of HMENU or
accessing the :php:`accessKey` property of :php:`TypoScriptFrontendController`.
TYPO3 installations using the global :html:`accesskey` HTML attribute in
their own code will still work as before.
Migration
=========
Using the :html:`accesskey` HTML attribute should be avoided in general, but
if needed, integrators should add it to their templates in a sensible way,
depending on the accessibility needs.
.. index:: Frontend, TypoScript, PartiallyScanned, ext:frontend
@@ -0,0 +1,69 @@
.. include:: /Includes.rst.txt
.. _breaking-96726:
==================================================================
Breaking: #96726 - RequestHandler functionality of Extbase removed
==================================================================
See :issue:`96726`
Description
===========
Extbase - TYPO3's MVC system has had a way to define "RequestHandlers", which
were primarily introduced back in 2010 to distinguish between Frontend Plugins,
Backend Modules, CLI commands and Fluid Widgets.
In TYPO3 v8, CLI commands have been migrated to Symfony Console.
Since TYPO3 v9, Backend Requests are not using RequestHandlers anymore.
In TYPO3 v10, the registration of custom RequestHandlers has been moved from
TypoScript to PHP files (during build time).
In TYPO3 v11, Fluid Widgets have been removed.
The only available support is for Frontend requests (plugin), which could have
been overridden by custom implementations.
From TYPO3 v12.0 onwards, Extbase Bootstrap for plugins is now calling the
Extbase dispatcher directly, without loading possible RequestHandlers anymore.
This change removes a layer for each request of a plugin, and thus, a layer
of indirection.
It is not possible anymore to implement custom RequestHandlers, as all related
functionality has been removed.
Impact
======
Registration of custom RequestHandlers will not have any effect anymore.
Affected Installations
======================
TYPO3 installations with extensions registering custom Extbase RequestHandlers.
This can be checked if an extension provides a
:file:`Configuration/Extbase/RequestHandlers.php` file or using the
extension scanner, which will report any usage of the now removed
:php:`\TYPO3\CMS\Extbase\Mvc\RequestHandlerInterface`.
Migration
=========
It is recommended to avoid custom RequestHandlers, as their use case is
limited. For TYPO3 v12-only support, custom RequestHandlers and their
implementation can be fully removed and developed differently.
For Frontend plugins, it is still possible to use a different bootstrap
than the :php:`\TYPO3\CMS\Extbase\Core\Bootstrap` class, via TypoScript.
For backend modules, custom :php:`routeTargets` can be defined in the
module registration concept.
Using the Decorator pattern is usually good practice to achieve such
functionality.
.. index:: PHP-API, FullyScanned, ext:extbase
@@ -0,0 +1,113 @@
.. include:: /Includes.rst.txt
.. _breaking-96733:
===========================================================================
Breaking: #96733 - Removed support for module handling based on TBE_MODULES
===========================================================================
See :issue:`96733`
Description
===========
In previous TYPO3 versions, all available Backend modules were stored in the
global array :php:`$TBE_MODULES`.
Next to a very scattered and dated API to work with this array, it was still
possible to modify entries of modules through this global array.
With the introduction of the new Module Registration API, the global array is
not filled anymore since TYPO3 v12.0.
In addition, any previous functionality related to handling of the global array
has been removed.
The main and foremost important previous API piece
:php:`TYPO3\CMS\Backend\Module\ModuleLoader` has been removed completely as it
was usually populated with data of `$TBE_MODULES`.
The PHP classes
* :php:`TYPO3\CMS\Backend\Domain\Model\Module\BackendModule`
* :php:`TYPO3\CMS\Backend\Domain\Repository\Module\BackendModuleRepository`
* :php:`TYPO3\CMS\Backend\Module\ModuleStorage`
which were related to building the Module Menu on the left side
of the TYPO3 Backend have been removed as well. The new API based
on the :php:`ModuleProvider` takes care of permission handling
and returns objects of :php:`ModuleInterface`, the
rendering is now based on a well-defined OOP-based approach, which
is used throughout all places in TYPO3 Backend in a unified way.
As for TYPO3 Backend Modules, based on Extbase, their additional information
(allowed controllers and actions) was previously stored in a different
global array
:php:`$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName]['modules'][$pluginName]['controllers']`
which has been merged with the Module Registry API and has been removed as well.
Because the registration of modules is now done in the extension's
:file:`Configuration/Backend/Modules.php` file, the following
API methods do no longer have any effect and will be removed in
TYPO3 v13.0:
- :php:`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addModule()`
- :php:`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addNavigationComponent()`
- :php:`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addCoreNavigationComponent()`
- :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule()`
The User TSconfig :typoscript:`options.hideModules.[moduleGroup]` has been
removed. All modules are registered with a unique identifier. Therefore, the
TSconfig :typoscript:`options.hideModules` should be used for all modules
directly. This still allows to hide a whole group, e.g. `web`, next to
regular modules, such as `web_layout`.
Impact
======
Accessing or manipulating the now non-existent :php:`$GLOBALS[TBE_MODULES]`
array will result in a PHP warning.
Referencing any of the removed PHP classes will result in a PHP fatal error.
Using one of the mentioned API methods won't have any effect.
Affected Installations
======================
TYPO3 installations working with hooks or events effectively reading or
manipulating the global array `$TBE_MODULES` or accessing any of the removed
PHP classes / methods by third-party extensions.
Any occurrences can be detected via the Extension Scanner.
Migration
=========
Migrate to the new Module Registration API, and use the :php:`ModuleProvider`
class to get allowed modules and work with the objects. The current module
information (an implementation of :php:`ModuleInterface`) is stored in a
TYPO3 Backend request within the `module` option of a TYPO3 Backend route,
which can be accessed via :php:`$request->getAttribute('route')->getOption('module')`.
As soon as the new TYPO3 :php:`BackendModuleValidator` PSR-15 middleware
has validated the module for the current user, the :php:`ModuleInterface`
object is also added to the current request and can then be accessed
via :php:`$request->getAttribute('module')` in custom middlewares or
components.
.. note::
With the new module registration, the module identifier is also used
as the route identifier. Therefore, the `moduleName` option is removed
from the TYPO3 backend route object.
The registration has to be moved from :file:`ext_tables.php` to the
:file:`Configuration/Backend/Modules.php` file. See the
:doc:`feature changelog <../12.0/Feature-96733-NewBackendModuleRegistrationAPI>`
for more information regarding the new registration.
Instead of :typoscript:`options.hideModules.web = layout`, use
:typoscript:`options.hideModules = web_layout`.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _breaking-96806:
========================================================
Breaking: #96806 - Removed hook for modifying button bar
========================================================
See :issue:`96806`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['Backend\Template\Components\ButtonBar']['getButtonsHook']`
has been removed in favor of a new PSR-14 event :php:`\TYPO3\CMS\Backend\Template\Components\ModifyButtonBarEvent`.
Impact
======
Any hook implementation registered is not executed anymore in
TYPO3 v12.0+. The extension scanner will report possible usages.
Affected Installations
======================
All TYPO3 installations using this hook in custom extension code.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <../12.0/Feature-96806-PSR-14EventForModifyingButtonBar>`
as a direct replacement.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,256 @@
.. include:: /Includes.rst.txt
.. _breaking-96812:
=================================================================================
Breaking: #96812 - No Frontend TypoScript based template overrides in the backend
=================================================================================
See :issue:`96812`
Description
===========
A couple of Core extensions with backend module controllers allowed overriding Fluid
templates using frontend TypoScript. The two documented extensions are EXT:dashboard
and the backend page module. The Extbase based backend extensions EXT:belog, EXT:beuser
and EXT:extensionmanager allowed this implicitly too, but this detail has never
been directly documented.
This functionality has been removed: All Core extensions, and in general all extensions
that switch to the :doc:`simplified backend templating <Feature-96730-SimplifiedExtbackendModuleTemplateAPI>`
no longer use the frontend TypoScript based override approach. This has been superseded
by a general override strategy based on TSconfig, as described in :doc:`this changelog
entry <Feature-96812-OverrideBackendTemplatesWithTSconfig>`.
This change became necessary since configuring backend modules via frontend TypoScript
is flawed by design: It on one hand forces backend modules to parse the full frontend
TypoScript, which is a general performance penalty in the backend - the backend then
scales with the amount of frontend TypoScript. Also, the implementation is based on
the Extbase ConfigurationManager, which leads to the situation that casual non-Extbase
backend modules have an indirect dependency to lots of Extbase code. But most importantly,
frontend TypoScript is always bound to a page record. There is no concept in the frontend
for the "root" page zero, since that page can not be rendered in the frontend. In the backend
however, we have many modules that are not within page context: In general all modules that
do not have a page tree. This gives the "Use frontend TypoScript to configure backend modules"
approach some hard headaches: It forces the ConfigurationManager to still select "some" page as
frontend TypoScript entry point. In practice, the first non-hidden tree-level-one page
that has a sys_template record is selected. This strategy is both ugly and troublesome,
and leads to the situation that backend module configuration had to be bound to this first page,
which could easily explode when for instance pages are resorted - apart from the fact that
this scenario is hard to understand and to debug.
Impact
======
The combination of performance drawbacks, the tight Extbase coupling, and the
"which frontend TypoScript should be parsed for page zero?" problematic leads to the decision
to phase out the "frontend TypoScript for backend module configuration" approach that
Extbase brought in.
One part of this process is a generic backend approach to :doc:`override backend templates
using TSconfig <Feature-96812-OverrideBackendTemplatesWithTSconfig>`. This has impact
on EXT:dashboard widgets and page module template overrides.
Affected Installations
======================
Instances with extensions that configure own EXT:dashboard widgets or override templates
of existing dashboard widgets using Frontend TypoScript are affected, as well as instances
that override page module templates as described in :doc:`this changelog entry <../10.3/Feature-90348-NewFluid-basedReplacementForPageLayoutView>`.
Migration
=========
Page module template overrides
------------------------------
An instance sets frontend TypoScript like this:
.. code-block:: typoscript
module.tx_backend.view.templateRootPaths.1644483508 = EXT:myext/Resources/Private/Templates/
module.tx_backend.view.partialRootPaths.1644483508 = EXT:myext/Resources/Private/Partials/
If extension "myext" now delivered a template file such as :file:`Resources/Private/Templates/PageLayout/PageLayout.html`,
that template file was used for rendering the page module instead of the default template.
As described in this :doc:`changelog <Feature-96812-OverrideBackendTemplatesWithTSconfig>`,
the new definition is now done using TSconfig. The extension "myext" with Composer name "myvendor/myext" can
deliver a :file:`Configuration/page.tsconfig` file (see :doc:`changelog <Feature-96614-AutomaticInclusionOfPageTsConfigOfExtensions>`)
with the below content to substitute the old definition and keep overriding template files at the current position:
.. code-block:: typoscript
# Pattern: templates."composer-name"."something-unique" = "overriding-extension-composer-name":"entry-path"
templates.typo3/cms-backend.1644483508 = myvendor/myext:Resources/Private
EXT:dashboard
-------------
Required changes regarding existing template overrides of the dashboard extension and the
dashboard widget registration itself are a bit broader. Let's look at this in detail:
Templating
..........
An extension delivers this TypoScript:
.. code-block:: typoscript
module.tx_dashboard {
view {
templateRootPaths {
1644485473 = EXT:myext/Resources/Private/Templates/Dashboard/Widgets/
}
}
}
This instructed the dashboard widget renderer to look up widget templates in this
path, too. The new registration for extension "myext" with Composer name "myvendor/myext"
using file :file:`Configuration/page.tsconfig`
(see :doc:`changelog <Feature-96614-AutomaticInclusionOfPageTsConfigOfExtensions>`)
could look like this:
.. code-block:: typoscript
# Pattern: templates.typo3/cms-dashboard."something-unique" = "overriding-extension-composer-name":"entry-path"
templates.typo3/cms-dashboard.1644485473 = myvendor/myext:Resources/Private
A widget template is then put to :file:`Resources/Private/Templates/Dashboard/Widgets/MyExtensionWidget.html`.
Extensions that want to stay compatible with both TYPO3 Core v11 and v12 should simply define both the
old way and the new way.
Widget registration using Services.yaml
.......................................
This part (changing :file:`Services.yaml` and widgets PHP code) is not strictly needed
for extensions that configure and deliver own widgets. Extension that work with TYPO3
v11 just work in v12 as well. However, the registration and PHP code changed a bit,
extensions that want to stay deprecation log free with v12 should adapt. The changes
outlined below will be mandatory with v13.
The registration of widgets using :file:`Services.yaml` should be changed a bit. It
was previously documented that widgets can inject an instance of :php:`StandaloneView`.
This approach was flawed: The :php:`StandaloneView` has an internal dependency to the
current PSR-7 request. The request is not available via dependency injection since it is
a heavily stateful runtime dependency. Injecting a view that depends on request is thus
a violation and only worked with EXT:dashboard because :php:`StandaloneView` hides that
dependency internally and creates a new request on the fly, which is a hack in that
implementation that should be avoided.
The view based on EXT:core :php:`ViewInterface` with its factory for backend views based
on EXT:backend :php:`BackendViewFactory` makes the dependency to the request object explicit.
As such, a "prepared" view can not be injected using DI anymore.
This has impact on both the PHP implementation of widgets, as well as the widget
dependency injection configuration.
Let's say a widget has been registered like this:
.. code-block:: yaml
# This is defined in EXT:dashboard Services.yaml already, extensions
# must not define this in their Services.yaml files again.
dashboard.views.widget:
class: 'TYPO3\CMS\Fluid\View\StandaloneView'
public: true
factory: ['TYPO3\CMS\Dashboard\Views\Factory', 'widgetTemplate']
# This is your custom widget registration in your extensions Services.yaml
dashboard.widget.sysLogErrors:
class: 'TYPO3\CMS\Dashboard\Widgets\BarChartWidget'
arguments:
$dataProvider: '@TYPO3\CMS\Dashboard\Widgets\Provider\SysLogErrorsDataProvider'
$view: '@dashboard.views.widget'
$buttonProvider: '@TYPO3\CMS\Dashboard\Widgets\Provider\SysLogButtonProvider'
tags:
...
The important line is :yaml:`$view: '@dashboard.views.widget'`: This instructs the DI
to inject an instance of :php:`StandaloneView` using the EXT:dashboard :php:`Factory::widgetTemplate()`
method for argument :php:`$view`. The :yaml:`dashboard.views.widget` is deprecated since
TYPO3 Core v12 and should not be used anymore. It logs a deprecation message upon use
during build-time and will be removed in v13 together with the :php:`Factory`.
The new registration should be adapted to this, simply removing the :php:`$view` argument:
.. code-block:: yaml
# This is your custom widget registration in your extensions Services.yaml
dashboard.widget.sysLogErrors:
class: 'TYPO3\CMS\Dashboard\Widgets\BarChartWidget'
arguments:
$dataProvider: '@TYPO3\CMS\Dashboard\Widgets\Provider\SysLogErrorsDataProvider'
$buttonProvider: '@TYPO3\CMS\Dashboard\Widgets\Provider\SysLogButtonProvider'
tags:
...
Now the PHP implementation. The above example references the :php:`BarChartWidget` class
to take care of rendering. The class looked like this before (shortened):
.. code-block:: php
class BarChartWidget implements WidgetInterface
{
public function __construct(
private readonly WidgetConfigurationInterface $configuration,
private readonly ChartDataProviderInterface $dataProvider,
private readonly StandaloneView $view,
private readonly $buttonProvider = null,
private readonly array $options = []
) {
}
public function renderWidgetContent(): string
{
$this->view->setTemplate('Widget/ChartWidget');
$this->view->assignMultiple([...]);
return $this->view->render();
}
}
Since :php:`StandaloneView` should not be injected anymore, we now inject the
:php:`BackendViewFactory` instead and create a view using the factory in
:php:`renderWidgetContent()`. The factory :php:`create()` method needs the request
object. To get this, widgets should now implement :php:`RequestAwareWidgetInterface`,
the EXT:dashboard framework will then :php:`setRequest()` the current request to the widget
immediately after widget instantiation. The new code thus looks like this:
.. code-block:: php
class BarChartWidget implements WidgetInterface, RequestAwareWidgetInterface
{
private ServerRequestInterface $request;
public function __construct(
private readonly WidgetConfigurationInterface $configuration,
private readonly ChartDataProviderInterface $dataProvider,
private readonly BackendViewFactory $backendViewFactory,
private readonly $buttonProvider = null,
private readonly array $options = []
) {
}
public function setRequest(ServerRequestInterface $request): void
{
$this->request = $request;
}
public function renderWidgetContent(): string
{
// The second argument is the Composer 'name' of the extension that adds the widget.
// It is needed to instruct BackendViewFactory to look up templates in this package
// next to the default location 'typo3/cms-dashboard', too.
$view = $this->backendViewFactory->create($this->request, ['typo3/cms-dashboard', 'myVendor/myPackage']);
$view->assignMultiple([...]);
return $view->render('Widget/ChartWidget');
}
}
The actual implementation in TYPO3 v12 is still slightly different to keep
compatibility with extensions that re-use Core widgets and need v11 and v12
compatibility at the same time. Those Core classes will be adapted in v13
to the above outline version, though.
.. index:: Backend, TSConfig, TypoScript, NotScanned, ext:backend
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _breaking-96829:
=========================================================
Breaking: #96829 - Removed BackendUtility->getFuncInput()
=========================================================
See :issue:`96829`
Description
===========
Method :php:`BackendUtility::getFuncInput()` is incompatible with
`Content-Security-Policy` HTTP headers due to its onchange JavaScript
handler, and has been removed.
Impact
======
Instances with extensions using the method will raise a fatal
PHP error upon use.
Affected Installations
======================
The method is part of very old-school backend module code and of limited use.
TYPO3 Core code does not use it since at least v9, it is relatively unlikely
backend modules of extensions still use this method. The extension scanner
finds usages with a strong match.
Migration
=========
No direct migration available. The input field HTML should most likely be inlined
to a template and eventual JavaScript events should be handled with a JavaScript
module.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,46 @@
.. include:: /Includes.rst.txt
.. _breaking-96831:
===================================================================
Breaking: #96831 - Enforce HTML sanitizer during frontend rendering
===================================================================
See :issue:`96831`
Description
===========
TYPO3 security fix `TYPO3-CORE-SA-2021-013 <https://typo3.org/security/advisory/typo3-core-sa-2021-013>`_
introduced Composer package `typo3/html-sanitizer` to mitigate cross-site scripting vulnerabilities in
rich-text content. In order to relax the strict invocation, a corresponding feature flag has been added
in a follow-up release - which only was a temporary solution.
The feature flag `security.frontend.htmlSanitizeParseFuncDefault` is dropped, and content processing via
TypoScript :typoscript:`stdWrap.parseFunc` now enables HTML sanitization per default in case it has not been
disabled explicitly in corresponding invocation.
Sites that used a version prior to TYPO3 v12.0 received a corresponding deprecation message already.
Impact
======
Rich-text content processed with TypoScript :typoscript:`stdWrap.parseFunc` is HTML sanitized per default.
Feature flag `security.frontend.htmlSanitizeParseFuncDefault` does not have any effect anymore.
Affected Installations
======================
All scenarios that use TypoScript :typoscript:`stdWrap.parseFunc`, a direct invocation via PHP of
:php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::parseFunc()` or Fluid
view-helper :html:`<f:format.html>`.
Migration
=========
The following documents already tackled and described the scenario and implications:
* :doc:`9.5.x: Important: #94484 - Introduce HTML Sanitizer <../9.5.x/Important-94484-IntroduceHTMLSanitizer>`
* :doc:`12.0: Breaking: #96520 - Enforce non-empty configuration in cObj::parseFunc <Breaking-96520-EnforceNon-emptyConfigurationInCObjparseFunc>`
.. index:: Frontend, TypoScript, NotScanned, ext:frontend
@@ -0,0 +1,31 @@
.. include:: /Includes.rst.txt
.. _breaking-96835:
========================================================
Breaking: #96835 - https as default scheme in PageRouter
========================================================
See :issue:`96835`
Description
===========
The fallback scheme in :php:`\TYPO3\CMS\Core\Routing\PageRouter::generateUri()` is set to `https` instead of `http` when linking to other pages.
Impact
======
If the site configuration does not provide a scheme but only a domain (e.g. `www.domain.tld`), the scheme is set to `https`.
Affected Installations
======================
All installations which use a site configuration without providing a scheme and which must not be delivered through `https`.
Migration
=========
If `https` can't be used, the entry point must define the scheme, e.g. `http://www.domain.tld`.
.. index:: Frontend, NotScanned, ext:core
@@ -0,0 +1,106 @@
.. include:: /Includes.rst.txt
.. _breaking-96874-1664488429:
=============================================================
Breaking: #96874 - CKEditor-related plugins and configuration
=============================================================
See :issue:`96874`
Description
===========
TYPO3 v12 ships with CKEditor 5, which is a completely new, rewritten editor
compared to CKEditor 4 which was shipped since TYPO3 v8.
Any kind of plugin, which was written for CKEditor 4 is not compatible anymore.
In addition, since CKEditor 5 does not grant HTML input the same way as before.
Impact
======
Any plugin in CKEditor will not be loaded anymore in TYPO3 v12.
It might be possible to have data loss when editing and saving data,
especially since some configuration formats have been changed.
Affected installations
======================
TYPO3 installations with custom extensions extending CKEditor with plugins,
or relying on a specific logic to save data with specific contents
(such as additional allowed HTML tags).
Migration
=========
In general, it is advised to read the `CKEditor 4 to 5 migration <https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/migration-from-ckeditor-4.html#plugins>`__
to understand the conceptual changes, also related to plugins.
Writing a custom plugin for CKEditor 5 can be done in TypeScript or JavaScript,
using the `CKEditor 5 plugin system <https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/plugins.html>`__.
Example - A timestamp plugin :js:`@my-vendor/my-package/timestamp-plugin.js`
which adds a toolbar item to add the current timestamp into the editor.
.. code-block:: javascript
import { Plugin } from '@ckeditor/ckeditor5-core';
import { ButtonView } from '@ckeditor/ckeditor5-ui';
export class Timestamp extends Plugin {
static pluginName = 'Timestamp';
init() {
const editor = this.editor;
// The button must be registered among the UI components of the editor
// to be displayed in the toolbar.
editor.ui.componentFactory.add(Timestamp.pluginName, () => {
// The button will be an instance of ButtonView.
const button = new ButtonView();
button.set({
label: 'Timestamp',
withText: true
});
// Execute a callback function when the button is clicked
button.on('execute', () => {
const now = new Date();
// Change the model using the model writer
editor.model.change(writer => {
// Insert the text at the user's current position
editor.model.insertContent(writer.createText(now.toString()));
});
});
return button;
});
}
}
In the RTE configuration, this then needs to be added like this:
.. code-block:: yaml
editor:
config:
importModules:
- { module: '@my-vendor/my-package/timestamp-plugin.js', exports: ['Timestamp'] }
toolbar:
items:
- bold
- italic
- '|'
- clipboard
- undo
- redo
- '|'
- timestamp
.. index:: RTE, NotScanned, ext:rte_ckeditor
@@ -0,0 +1,35 @@
.. include:: /Includes.rst.txt
.. _breaking-96879:
===================================================
Breaking: #96879 - Hook "get_cache_timeout" removed
===================================================
See :issue:`96879`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['get_cache_timeout']`
used in TYPO3 Frontend for changing the cache timeout of a page stored in the
TYPO3 "pages" cache has been removed.
Impact
======
If an extension has registered a hook in :file:`ext_localconf.php` it will not
be executed anymore in TYPO3 v12 or later.
Affected Installations
======================
TYPO3 installations using this hook in custom extensions.
Migration
=========
Use the newly introduced PSR-14 event :ref:`ModifyCacheLifetimeForPageEvent <feature-96879-1663513042>`
and register a custom event listener.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,48 @@
.. include:: /Includes.rst.txt
.. _breaking-96889:
================================================
Breaking: #96889 - Require PHP mbstring and intl
================================================
See :issue:`96889`
Description
===========
The two PHP extensions :php:`mbstring` and :php:`intl` are required to
be loaded when running TYPO3 v12.
:php:`mbstring` is a common extension that is either compiled directly
into PHP or available as standard package in all distributions and
operating systems. Similar for :php:`intl`. While there are symfony
packages that mimic these extensions partially if not available, these
"polyfill" packages are slower, and most importantly, they implement only
parts of the native extensions. To further improve TYPO3 character set
and internationalization handling, the system needs the full functionality.
Impact
======
System environments not providing these PHP extensions may fail.
Affected Installations
======================
The install tool "Environment Status" and the reports module notify
about missing PHP extensions, and it is shown during the installation process.
Migration
=========
Provide the extensions in the PHP.
A debian / ubuntu based Linux host typically install such packages with
a command similar to this:
.. code-block:: bash
sudo apt install php8.1-mbstring php8.1-intl
.. index:: PHP-API, NotScanned, ext:core
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _breaking-96899:
========================================================
Breaking: #96899 - "displayWarningMessages" hook removed
========================================================
See :issue:`96899`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['displayWarningMessages']`
has been removed in favor of a new PSR-14 event
:php:`\TYPO3\CMS\Backend\Controller\Event\ModifyGenericBackendMessagesEvent`.
The hook was used to display messages in the About module.
Impact
======
Registered hooks are not executed anymore.
Affected Installations
======================
TYPO3 installations with custom extensions using this hook, which is very
unlikely. The extension scanner will report possible usages.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <Feature-96899-NewPSR-14EventModifyGenericBackendMessagesEvent>`
as a direct replacement.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,67 @@
.. include:: /Includes.rst.txt
.. _breaking-96904:
===================================================================
Breaking: #96904 - ext:reports reports do not receive parent object
===================================================================
See :issue:`96904`
Description
===========
Extensions that add own reports in EXT:reports do not receive an instance
of :php:`TYPO3\CMS\Reports\Controller\ReportController` as constructor
argument anymore.
Handing over "parent object" to single reports as manual constructor argument
was pretty much useless since all state in :php:`ReportController`
is :php:`protected`. Not having this constructor argument has the advantage
that reports can now use dependency injection.
Impact
======
Extensions that register own reports to the EXT:reports extension and type hint
:php:`ReportController` as constructor argument will trigger a fatal PHP error
since that argument is no longer provided by the API.
Affected Installations
======================
Instances with extensions that add own reports to EXT:reports may be affected.
Migration
=========
Do not expect to retrieve an instance of :php:`ReportController` as constructor
argument anymore. Code before:
.. code-block:: php
class MyClass implements ReportInterface
{
public function __construct(ReportController $reportController)
{
// ...
}
}
.. code-block:: php
class MyClass implements ReportInterface
{
// No manual constructor argument anymore, but have a dependency injection as example.
public function __construct(private readonly SomeDependency $someDependency)
{
}
}
Single reports are currently instantiated using :php:`GeneralUtility::makeInstance()`.
To use dependency injection in own reports, a report class thus needs to be defined
:yaml:`public: true` in a :file:`Configuration/Services.yaml` file. This may change with
further TYPO3 v12 development if the reports registration is changed, though. If in doubt,
just try to go without :yaml:`public: true`. If this leads to a fatal PHP error, add it.
.. index:: Backend, PHP-API, NotScanned, ext:reports
@@ -0,0 +1,66 @@
.. include:: /Includes.rst.txt
.. _breaking-96935:
=============================================================================
Breaking: #96935 - Register linkvalidator linktypes via service configuration
=============================================================================
See :issue:`96935`
Description
===========
Linkvalidator `linktypes` are now registered via service configuration, also see
:doc:`feature changelog <Feature-96935-NewRegistrationForLinkvalidatorLinktype>`.
Therefore the registration via
:php:`$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['linkvalidator']['checkLinks']`
has been removed.
Additionally, to be able to use autoconfiguration, the `linktype` identifier
has to be provided by the service directly using the :php:`getIdentifier()`
method, which is now required by the :php:`LinktypeInterface`.
In case a custom `linktype` extends
:php:`\TYPO3\CMS\Linkvalidator\Linktype\AbstractLinktype`,
only the class property `$identifier` has to be set, e.g.
:php:`protected string $identifier = 'my_linktype';`.
Impact
======
Registration of custom `linktypes` via
:php:`$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['linkvalidator']['checkLinks']`
is not evaluated anymore.
The :php:`LinktypeInterface` is extended for
:php:`public function getIdentifier(): string`.
Affected Installations
======================
All TYPO3 installations using the old registration.
All TYPO3 installations with custom `linktypes`, not implementing
:php:`public function getIdentifier(): string`.
Migration
=========
Remove :php:`$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['linkvalidator']['checkLinks']`
from your :file:`ext_localconf.php` file.
If :yaml:`autoconfigure` is not enabled in your :file:`Configuration/Services.(yaml|php)`,
add the tag :yaml:`linkvalidator.linktype` manually to your `linktype` service.
.. code-block:: yaml
Vendor\Extension\Linktype\MyCustomLinktype:
tags:
- name: linkvalidator.linktype
Additionally, make sure to either implement
:php:`public function getIdentifier(): string` or, in case your `linktype` extends
:php:`AbstractLinktype`, to set the `$identifier` class property.
.. index:: Backend, LocalConfiguration, PHP-API, FullyScanned, ext:linkvalidator
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _breaking-96968:
===============================================
Breaking: #96968 - Hook "headerNoCache" removed
===============================================
See :issue:`96968`
Description
===========
The previous TYPO3 Hook "headerNoCache" registered via
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['headerNoCache']`
has been removed in favor of a new PSR-14 event
:php:`ShouldUseCachedPageDataIfAvailableEvent`.
Impact
======
Hooks in third-party extensions will not be executed anymore.
Affected Installations
======================
TYPO3 installations with custom extensions using this hook.
Migration
=========
Register a new PSR-14 event listener for
:ref:`ShouldUseCachedPageDataIfAvailableEvent <feature-96968-1663513232>`
in the extension's :file:`Services.yaml` to keep TYPO3 v12+ compatibility.
Extensions can then provide compatibility with TYPO3 v11 and TYPO3 v12 at
the same time.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,52 @@
.. include:: /Includes.rst.txt
.. _breaking-96982:
========================================================
Breaking: #96982 - Removed support for global extensions
========================================================
See :issue:`96982`
Description
===========
Historically, TYPO3 installations could load extensions from :file:`typo3/ext/`
where developers and site administrators could share extensions through
multiple installations on the same server via symlinks.
This feature was possible by enabling
:php:`$GLOBALS[TYPO3_CONF_VARS][EXT][allowGlobalInstall]` which was disabled
by default since TYPO3 4.0, as using this feature had several downsides with
Non-Composer based installations. Features such as "Automatic Updates" are
not possible having this functionality enabled.
In Composer-based installations, this functionality was never supported in
a proper way.
This functionality including the feature toggle have been removed in TYPO3 v12.0.
Impact
======
Extensions within the folder :file:`typo3/ext/` will be ignored in TYPO3 v12.0
and will be automatically disabled.
The global option to enable this feature will be removed from
:file:`LocalConfiguration.php` automatically once the Install Tool / Maintenance module
is loaded the next time, if the option is activated.
Affected Installations
======================
TYPO3 installations having the global option enabled, and have loaded extensions
in :file:`typo3/ext/`, which is unlikely in 2022.
Migration
=========
It is recommended to either migrate to Composer Mode, or to use symlinks
into :file:`typo3conf/ext/` (Local Extensions) to load the same extension for
multiple TYPO3 installations at once.
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,36 @@
.. include:: /Includes.rst.txt
.. _breaking-96983:
=====================================
Breaking: #96983 - TableColumnSubType
=====================================
See :issue:`96983`
Description
===========
The class :php:`TYPO3\CMS\Core\Type\Enumeration\TableColumnSubType` has been
removed. It has no use anymore, since TCA option `internal_type` is not
evaluated. It was set for the Extbase class :php:`ColumnMap`, but even there it
had no direct usage.
Impact
======
In the rare case, that the class :php:`TableColumnSubType` is used in
custom code, it will result in a PHP fatal error.
Affected Installations
======================
All installations that use :php:`TableColumnSubType` directly in their custom
code.
Migration
=========
There is no migration, since this enumeration has no use.
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,48 @@
.. include:: /Includes.rst.txt
.. _breaking-96988:
============================================================
Breaking: #96988 - Global Option "allowLocalInstall" removed
============================================================
See :issue:`96988`
Description
===========
In previous TYPO3 version it was possible to disable the functionality to
install extensions from :file:`typo3conf/ext/`.
This was done by setting the global option
:php:`$GLOBALS['TYPO3_CONF_VARS']['EXT']['allowLocalInstall']` to false.
The usefulness of this functionality was only a side-effect and has lost it even
more after the rise of the Composer Mode for TYPO3 Core.
In addition, this option is only useful in the Extension Manager which is now
protected with access for only "System Maintainers", only giving special users
the power to modify the extension installation process, making TYPO3 more
flexible than 15 years ago.
Impact
======
Toggling the option (which was enabled by default) has no effect anymore. It is
now always possible to install an extension available in :file:`typo3conf/ext/`
for system maintainers with the Extension Manager module for Non-Composer Mode
TYPO3 installations.
Affected Installations
======================
TYPO3 Installations in Non-Composer Mode having this option turned off, which
is very rare.
Migration
=========
It is recommended to set proper access rights and only give users
"System Maintainer" access which should modify the list of active extensions.
.. index:: Backend, FullyScanned, ext:extensionmanager
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _breaking-96996:
===================================================
Breaking: #96996 - Hook "checkEnableFields" removed
===================================================
See :issue:`96996`
Description
===========
The previous TYPO3 Hook "hook_checkEnableFields" registered via
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['hook_checkEnableFields']`
has been removed in favor of a new PSR-14 event
:php:`TYPO3\CMS\Core\Domain\Access\RecordAccessGrantedEvent`.
Impact
======
Hooks in third-party extensions will not be executed anymore.
Affected Installations
======================
TYPO3 installations with custom extensions using this hook. The
extension scanner will notify about usages.
Migration
=========
Register a new PSR-14 event listener for :ref:`RecordAccessGrantedEvent <feature-96996-1663513388>`
in the extension's :file:`Services.yaml` to keep TYPO3 v12+ compatibility.
Extensions can then provide compatibility with TYPO3 v11 and TYPO3 v12 at
the same time.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,124 @@
.. include:: /Includes.rst.txt
.. _breaking-96998:
======================================================
Breaking: #96998 - Extbase validator interface changed
======================================================
See :issue:`96998`
Description
===========
The Extbase related interface :php:`TYPO3\CMS\Extbase\Validation\Validator\ValidatorInterface`
has been changed by requiring :php:`setOptions()` method and being more strict in general.
Additionally, :php:`TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator` signatures
have been hardened.
Furthermore, all default validators delivered by EXT:extbase and EXT:form are declared final.
Following this, the framework no longer hands over :php:`options` array as constructor
argument, and no abstract implements :php:`__construct()` anymore. Classes that implement
:php:`ValidatorInterface` are automatically set "public" and "not-shared" by the framework,
they do not need to set this themselves. See the
:doc:`preparation in TYPO3 v11 <../11.5.x/Important-96332-ExtbaseValidatorsCanUseDependencyInjection>`
for more details on this. As a result, Extbase validators can now use dependency injection.
Impact
======
This has impact on custom Extbase validators which *may* need to adapt their method signatures.
Extensions that don't follow this in TYPO3 v12 may trigger fatal PHP errors.
Affected Installations
======================
Extensions with custom validators may be affected. In general, all extension classes that
directly implement :php:`ValidatorInterface` or extend :php:`AbstractValidator` may be
affected. The extension scanner can not find affected extensions, but IDE's should
show violating classes.
Migration
=========
The most casual case is that custom extension validators simply extend :php:`AbstractValidator`.
Those just have to adjust their :php:`isValid()` method signature to :php:`isValid($value): void` to
keep TYPO3 v11 & v12 compatibility. Read on for rare cases where this is not sufficient.
First, it is no longer allowed to extend specific validators of EXT:extbase and EXT:form.
Those are "leaf" classes, and extensions should not extend them, giving the Core more
freedom to change those classes if needed. Extensions should instead extend the provided
abstract classes like :php:`AbstractValidator` to implement own validators.
Since most custom validators inherit :php:`AbstractValidator`, the most important change
for these validator is a return type change of :php:`isValid()`:
.. code-block:: php
public function isValid(mixed $value): void
Extensions that need to stay compatible with v11 (PHP 7.4) and v12, will thus typically
use a signature like below: Set the return type constraint, but omit the 'mixed' argument type:
.. code-block:: php
public function isValid($value): void
With a closer look at the :php:`ValidatorInterface`, the v11 version
effectively looks like this:
.. code-block:: php
interface ValidatorInterface
{
public function validate($value);
public function getOptions();
}
This has been changed in v12 to this:
.. code-block:: php
interface ValidatorInterface
{
public function validate(mixed $value): Result;
public function setOptions(array $options): void;
public function getOptions(): array;
}
In any case, custom validators must implement :php:`setOptions()` now. The
:php:`AbstractValidator` does that automatically, so this has little impact since
most custom validators will extend :php:`AbstractValidator` anyways.
Extensions tailored for TYPO3 v12 and above simply implement these. Extensions that
need to keep compatibility with v11 and v12 need to adjust some additional type juggling.
In general, implementing classes can *relax* method argument types (e.g. avoid :php:`mixed`
to stay PHP 7.4 compatible), but *must follow* more restricted return type constraints of
younger interfaces.
A v11 & v12 compatible method signature looks like this (avoiding the :php:`mixed` keyword
on :php:`validate`):
.. code-block:: php
class MyValidator implements ValidatorInterface
{
public function setOptions(array $options): void
{
// ...
}
public function validate($value): Result
{
// ...
}
public function getOptions(): array
{
return $this->options;
}
}
.. index:: PHP-API, NotScanned, ext:extbase, ext:form
@@ -0,0 +1,58 @@
.. include:: /Includes.rst.txt
.. _breaking-97065:
==========================================================
Breaking: #97065 - TYPO3 Frontend always rendered in UTF-8
==========================================================
See :issue:`97065`
Description
===========
For historical reasons, it was possible to change the actual rendering charset
of TYPO3's Frontend Output to a specific character set, and also to modify the
"renderCharset", which was removed in TYPO3 v8.0. Since TYPO3 v6, the default
rendering output was set to "utf-8", and nowadays, it has become a niche
to change the output rendering charset to a different value than UTF-8.
For this reason, the TypoScript setting :typoscript:`config.metaCharset` has no effect
anymore as all rendering for Frontend is "utf-8" and not changeable anymore.
If this TypoScript setting was set to "utf-8" in previous installations,
this line could have been removed anyways already.
The public PHP property :php:`TypoScriptFrontendController->metaCharset` is
removed, along with the public method
:php:`TypoScriptFrontendController->convOutputCharset()`.
Impact
======
TYPO3 installations with a different setting than "utf-8" will now output
"utf-8" output at all times.
TYPO3 extensions accessing the removed property will trigger a PHP warning, or
calling the removed method :php:`convOutputCharset()` will see a fatal PHP error.
Affected Installations
======================
TYPO3 installations using :typoscript:`config.metaCharset` set to a value other than
`utf-8`, or accessing the removed property or method. The Extension Scanner
in the Install Tool will detect usages of the removed property and method.
Migration
=========
TYPO3 Installations with a different charset than UTF-8 should convert their own
content in a custom middleware, as this specific use-case is not supported by
TYPO3 Core anymore.
TYPO3 installations with TypoScript option set :typoscript:`config.metaCharset = utf-8` can
remove the TypoScript line in previous supported TYPO3 versions.
Any usage of the removed property / method should be removed.
.. index:: Frontend, PHP-API, TypoScript, FullyScanned, ext:frontend
@@ -0,0 +1,52 @@
.. include:: /Includes.rst.txt
.. _breaking-97091:
=======================================================
Breaking: #97091 - TSFE->clear_preview has been removed
=======================================================
See :issue:`97091`
Description
===========
The method :php:`clear_preview` of the :php:`TypoScriptFrontendController` has been removed.
Impact
======
Calling the method will result in a PHP Fatal Error.
Affected Installations
======================
All installations calling the :php:`clear_preview` method
Migration
=========
Build your own :php:`clear_preview` method:
.. code-block:: php
$context = GeneralUtility::makeInstance(Context::class);
$GLOBALS['SIM_EXEC_TIME'] = $GLOBALS['EXEC_TIME'];
$GLOBALS['SIM_ACCESS_TIME'] = $GLOBALS['ACCESS_TIME'];
$context->setAspect(
'frontend.preview',
GeneralUtility::makeInstance(PreviewAspect::class)
);
$context->setAspect(
'date',
GeneralUtility::makeInstance(
DateTimeAspect::class,
(new \DateTimeImmutable())->setTimestamp($GLOBALS['SIM_EXEC_TIME'])
)
);
$context->setAspect(
'visibility',
GeneralUtility::makeInstance(VisibilityAspect::class)
);
.. index:: Frontend, PHP-API, PartiallyScanned, ext:frontend
@@ -0,0 +1,79 @@
.. include:: /Includes.rst.txt
.. _breaking-97126:
========================================================
Breaking: #97126 - Remove TCEforms array key in FlexForm
========================================================
See :issue:`97126`
Description
===========
As a result of :doc:`#97126 <../12.0/Deprecation-97126-TCEformsRemovedInFlexForm>`
the `TCEforms` key has been removed from the FlexForm array. Code, that deals
with the FlexForm result array directly and accesses this key, may break.
Impact
======
In rare cases, where custom extensions deal with the parsed FlexForm array
structure directly and relying on the presence of the :php:`TCEforms` key, an
undefined array key warning may appear and the logic won't work any longer.
Affected Installations
======================
All installations, which deal with parsed FlexForm arrays directly and using the
:php:`TCEforms` key.
This **may** happen when:
* Using :php:`FlexFormTools->parseDataStructureByIdentifier()` directly
* Using or extending a :php:`FormDataProvider` and accessing the :php:`$result['processedTca']` array
.. note::
Since a long time, the :php:`TCEforms` key has already been removed in the
:php:`TcaFlexPrepare` FormDataProvider. It is advised to set this provider
as a dependency, when relying on prepared FlexForm TCA, in custom providers.
Migration
=========
Search your PHP code for the presence of the string `TCEforms` inside of arrays
and remove it. In case you need to support two TYPO3 versions simultaneously,
check if the key exists or not and adjust your array access accordingly.
Real world example from EXT:news:
Before:
.. code-block:: php
if (!empty($categoryRestriction) && isset($structure['sheets']['sDEF']['ROOT']['el']['settings.categories'])) {
$structure['sheets']['sDEF']['ROOT']['el']['settings.categories']['TCEforms']['config']['foreign_table_where'] = $categoryRestriction . $structure['sheets']['sDEF']['ROOT']['el']['settings.categories']['TCEforms']['config']['foreign_table_where'];
}
After:
.. code-block:: php
if (!empty($categoryRestriction) && isset($structure['sheets']['sDEF']['ROOT']['el']['settings.categories'])) {
$structure['sheets']['sDEF']['ROOT']['el']['settings.categories']['config']['foreign_table_where'] = $categoryRestriction . $structure['sheets']['sDEF']['ROOT']['el']['settings.categories']['config']['foreign_table_where'];
}
Supporting both TYPO3 v11 and v12+:
.. code-block:: php
if (!empty($categoryRestriction) && isset($structure['sheets']['sDEF']['ROOT']['el']['settings.categories'])) {
if (isset($structure['sheets']['sDEF']['ROOT']['el']['settings.categories']['TCEforms'])) {
$structure['sheets']['sDEF']['ROOT']['el']['settings.categories']['TCEforms']['config']['foreign_table_where'] = $categoryRestriction . $structure['sheets']['sDEF']['ROOT']['el']['settings.categories']['TCEforms']['config']['foreign_table_where'];
} else {
$structure['sheets']['sDEF']['ROOT']['el']['settings.categories']['config']['foreign_table_where'] = $categoryRestriction . $structure['sheets']['sDEF']['ROOT']['el']['settings.categories']['config']['foreign_table_where'];
}
}
.. index:: FlexForm, TCA, NotScanned, ext:core
@@ -0,0 +1,43 @@
.. include:: /Includes.rst.txt
.. _breaking-97131:
===========================================================================
Breaking: #97131 - Removed CLI commands related to files in uploads/ folder
===========================================================================
See :issue:`97131`
Description
===========
Historically, TYPO3 managed its actual files in a folder called
:file:`uploads/` until the `File Abstraction Layer` has been introduced
in TYPO3 v6.0. The old compatibility layer using :file:`uploads/` as
file storage folder has been removed in TYPO3 v10.
TYPO3 still has had some CLI commands which have now been
removed as they do not serve any use anymore:
* cleanup:multiplereferencedfiles
* cleanup:lostfiles
* cleanup:missingfiles
Impact
======
Calling the CLI commands will result in an CLI exit code > 0,
as they have been removed.
Affected Installations
======================
TYPO3 installations still having CLI tools using the CLI commands,
which serve no purpose anymore.
Migration
=========
None.
.. index:: CLI, NotScanned, ext:lowlevel
@@ -0,0 +1,127 @@
.. include:: /Includes.rst.txt
.. _breaking-97135:
===============================================================================
Breaking: #97135 - Removed support for module handling based on TBE_MODULES_EXT
===============================================================================
See :issue:`97135`
Description
===========
Previously it had been possible to add additional functionality to TYPO3
backend modules, such as :guilabel:`Web > Info` or :guilabel:`Web > Template`,
using the :php:`ExtensionManagementUtility::insertModuleFunction()` API method,
which attached a new entry to the global :php:`TBE_MODULES_EXT` array.
Since the introduction of the new
:doc:`Module Registration API <Feature-96733-NewBackendModuleRegistrationAPI>`,
all modules are registered in the dedicated :file:`Configuration/Backend/Modules.php`
configuration file. Additional modules, or "third-level modules" are now also
registered via the new mechanism.
Therefore, the :php:`$GLOBALS['TBE_MODULES_EXT']` has been removed, while the
corresponding :php:`ExtensionManagementUtility::insertModuleFunction()` API
method has no effect.
The related page TSconfig options :typoscript:`mod.web_info.menu.function`
as well as :typoscript:`mod.web_ts.menu.function` have been removed in favor
of the existing :typoscript:`hideModules` user TSconfig option and the module
access logic, which due to the new registration, now also covers those modules.
Additionally, the following hooks have been removed, because their use cases
does no longer exist:
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController']['newStandardTemplateView']`
- :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController']['newStandardTemplateHandler']`
Impact
======
The global :php:`TBE_MODULES_EXT` array does no longer exist and the
:php:`ExtensionManagementUtility::insertModuleFunction()` API method no
longer has any effect.
The page TSconfig options :typoscript:`mod.web_info.menu.function`
and :typoscript:`mod.web_ts.menu.function` are no longer evaluated.
Using one of mentioned, :php:`TypoScriptTemplateModuleController` related
hooks does no longer have any effect.
Affected Installations
======================
All installations using the global :php:`TBE_MODULES_EXT` array or
calling :php:`ExtensionManagementUtility::insertModuleFunction()` in
custom extension code.
All installations using one of the removed page TSconfig options or one
of the removed hooks.
Migration
=========
Register your "third-level" module in our extension's
:file:`Configuration/Backend/Modules.php` file.
Previous configuration in :file:`ext_tables.php`:
.. code-block:: php
ExtensionManagementUtility::insertModuleFunction(
'web_info',
MyAdditonalInfoModuleController::class,
'',
'LLL:EXT:extkey/Resources/Private/Language/locallang.xlf:mod_title'
);
Will now be registered in :file:`Configuration/Backend/Modules.php`:
.. code-block:: php
'web_info_additional' => [
'parent' => 'web_info',
'access' => 'user',
'path' => '/module/web/info/additional',
'iconIdentifier' => 'module-my-icon-identifier',
'labels' => [
'title' => 'LLL:EXT:extkey/Resources/Private/Language/locallang.xlf:mod_title',
],
'routes' => [
'_default' => [
'target' => MyAdditonalInfoModuleController::class . '::handleRequest',
],
],
],
To hide a "third-level" module in the doc header menu, use the user TSconfig
:typoscript:`options.hideModules` option:
.. code-block:: typoscript
:caption: **Page** TSconfig
# before
mod.web_info.menu.function.TYPO3\CMS\Info\Controller\TranslationStatusController = 0
.. code-block:: typoscript
:caption: **User** TSconfig
# after
options.hideModules := addToList(web_info_translations)
.. note::
While the previously used TSconfig options `mod.*.menu.function` are bound
to a page is the new `options.hideModules` option based on user and user
group level. This allows greater influence and furthermore allows to hide
any module, even if the module is not connected to a page.
Additionally, use the module access logic to restrict access to those modules.
Remove any registration of the mentioned hooks. There is no direct migration,
since the use cases for those hooks do no longer exist.
.. index:: Backend, PHP-API, PartiallyScanned, ext:backend
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _breaking-97174:
========================================================================
Breaking: #97174 - Removed hook for modifying info module footer content
========================================================================
See :issue:`97174`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/web_info/class.tx_cms_webinfo.php']['drawFooterHook']`
has been removed in favor of a new PSR-14 event :php:`\TYPO3\CMS\Info\Controller\Event\ModifyInfoModuleContentEvent`.
Impact
======
Any hook implementation registered is not executed anymore in
TYPO3 v12.0+. The extension scanner will report possible usages.
Affected Installations
======================
All TYPO3 installations using this hook in custom extension code.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <../12.0/Feature-97174-PSR-14EventForModifyingInfoModuleContent>`
as an improved replacement.
.. index:: Backend, PHP-API, FullyScanned, ext:info
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _breaking-97187:
==============================================================
Breaking: #97187 - Removed hook for modifying link explanation
==============================================================
See :issue:`97187`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['linkHandler']`
has been removed in favor of a new PSR-14 event :php:`\TYPO3\CMS\Backend\Form\Event\ModifyLinkExplanationEvent`.
Impact
======
Any hook implementation registered is not executed anymore in
TYPO3 v12.0+. The extension scanner will report possible usages.
Affected Installations
======================
All TYPO3 installations using this hook in custom extension code.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <../12.0/Feature-97187-PSR-14EventForModifyingLinkExplanation>`
as an improved replacement.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,67 @@
.. include:: /Includes.rst.txt
.. _breaking-97188:
======================================================================
Breaking: #97188 - Register element browsers via service configuration
======================================================================
See :issue:`97188`
Description
===========
The `element browsers` in EXT:backend are now registered via service
configuration, see the :doc:`feature changelog <Feature-97188-NewRegistrationForElementBrowsers>`.
Therefore the registration via
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ElementBrowsers']`
has been removed.
Additionally, to be able to use autoconfiguration, the `element browser`
identifier has to be provided by the service directly using the
:php:`getIdentifier()` method, which is now required by the
:php:`ElementBrowserInterface`.
In case a custom `element browser` extends
:php:`\TYPO3\CMS\Backend\Browser\AbstractElementBrowser`,
only the class property `$identifier` has to be set, e.g.
:php:`protected string $identifier = 'my_browser';`.
Impact
======
Registration of custom `element browsers` via
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ElementBrowsers']`
is not evaluated anymore.
The :php:`ElementBrowserInterface` is extended for
:php:`public function getIdentifier(): string`.
Affected Installations
======================
All TYPO3 installations using the old registration.
All TYPO3 installations with custom `element browsers`, not implementing
:php:`public function getIdentifier()`.
Migration
=========
Remove :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ElementBrowsers']`
from your :file:`ext_localconf.php` file.
If :yaml:`autoconfigure` is not enabled in your :file:`Configuration/Services.(yaml|php)`,
add the tag :yaml:`recordlist.elementbrowser` manually to your `element browser` service.
.. code-block:: yaml
Vendor\Extension\Recordlist\MyBrowser:
tags:
- name: recordlist.elementbrowser
Additionally, make sure to either implement
:php:`public function getIdentifier(): string` or, in case your `element browser`
extends :php:`AbstractElementBrowser`, to set the `$identifier` class property.
.. index:: Backend, LocalConfiguration, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,58 @@
.. include:: /Includes.rst.txt
.. _breaking-97201:
==============================================================
Breaking: #97201 - Removed hook for new content element wizard
==============================================================
See :issue:`97201`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms']['db_new_content_el']['wizardItemsHook']`
has been removed in favor of a new PSR-14 event :php:`\TYPO3\CMS\Backend\Controller\Event\ModifyNewContentElementWizardItemsEvent`.
Additionally, the :php:`params` property of a wizard item has been
removed, since it just duplicated the default values, configured with
:php:`tt_content_defValues` and therefore previously required extension
authors to provide the same information twice in two different formats.
.. note::
The public methods :php:`getPageInfo()`, :php:`getColPos()`,
:php:`getSysLanguage()` and :php:`getUidPid()` have been removed
from the internal :php:`NewContentElementController` class, since
they were only added for the use in the now removed hook. This
information is now directly available in the new PSR-14 event.
Impact
======
Any hook implementation registered is not executed anymore
in TYPO3 v12.0+.
The :php:`params` property on a wizard item is no longer evaluated.
Affected Installations
======================
TYPO3 installations with custom extensions using this hook.
TYPO3 installations setting the :php:`params` property on a wizard item.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <../12.0/Feature-97201-PSR-14EventForModifyingNewContentElementWizardItems>`
to allow greater influence in the functionality.
Migrate the :php:`params` property to :php:`tt_content_defValues` or just
remove :php:`params` in case the information had already been configured
for both properties.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,79 @@
.. include:: /Includes.rst.txt
.. _breaking-97210:
=======================================================================
Breaking: #97210 - Types added to method signatures or class properties
=======================================================================
See :issue:`97210`
Description
===========
The following PHP classes have had parameter and return types added to some or
all of their method signatures. The types are consistent with existing
docblock-documented type expectations and existing behavior.
- :php:`\TYPO3\CMS\Adminpanel\ModuleApi\ModuleDataStorageCollection`
- :php:`\TYPO3\CMS\Backend\Tree\SortedTreeNodeCollection`
- :php:`\TYPO3\CMS\Backend\Tree\TreeNodeCollection`
- :php:`\TYPO3\CMS\Core\Collection\AbstractRecordCollection`
- :php:`\TYPO3\CMS\Core\LinkHandling\FileLinkHandler`
- :php:`\TYPO3\CMS\Core\Log\LogRecord`
- :php:`\TYPO3\CMS\Core\Messaging\FlashMessageQueue`
- :php:`\TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider`
- :php:`\TYPO3\CMS\Core\Resource\Collection\AbstractFileCollection`
- :php:`\TYPO3\CMS\Core\Resource\MetaDataAspect`
- :php:`\TYPO3\CMS\Core\Resource\Search\Result\EmptyFileSearchResult`
- :php:`\TYPO3\CMS\Core\Routing\SiteRouteResult`
- :php:`\TYPO3\CMS\Core\Utility\ArrayUtility`
- :php:`\TYPO3\CMS\Core\Utility\ClassNamingUtility`
- :php:`\TYPO3\CMS\Core\Utility\CsvUtility`
- :php:`\TYPO3\CMS\Core\Utility\CommandUtility`
- :php:`\TYPO3\CMS\Core\Utility\DebugUtility`
- :php:`\TYPO3\CMS\Core\Utility\DiffUtility`
- :php:`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility`
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility`
- :php:`\TYPO3\CMS\Core\Utility\MailUtility`
- :php:`\TYPO3\CMS\Core\Utility\MathUtility`
- :php:`\TYPO3\CMS\Core\Utility\PathUtility`
- :php:`\TYPO3\CMS\Core\Utility\RootlineUtility`
- :php:`\TYPO3\CMS\Core\Utility\StringUtility`
- :php:`\TYPO3\CMS\Core\Utility\VersionNumberUtility`
- :php:`\TYPO3\CMS\Extbase\Mvc\Controller\Arguments`
- :php:`\TYPO3\CMS\Extbase\Persistence\Generic\LazyObjectStorage`
- :php:`\TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy`
- :php:`\TYPO3\CMS\Extbase\Persistence\ObjectStorage`
- :php:`\TYPO3\CMS\Extbase\Persistence\QueryResult`
The following PHP classes have added public class property types:
- :php:`\TYPO3\CMS\Core\Utility\DiffUtility`
Impact
======
Calling any of these methods with incompatible types now throws a :php:`\TypeError`,
especially if the calling code is within :php:`declare(strict_types=1);` context.
Before the result of such method calls was undefined or inconsistent.
Affected Installations
======================
Code routines that are passing an invalid type will need to ensure they pass a correct type.
If a code file is running with :php:`declare(strict_types=1);`, that includes, for instance,
passing a numeric string to a method that expects an int or float. Those will need to be
properly cast before being passed.
The extension scanner will not find affected extensions.
Migration
=========
Any code that is already passing the expected type to these methods will be unaffected.
Code that is passing an incorrect type will need to pass the correct type, possibly
including an explicit cast.
.. index:: PHP-API, NotScanned, ext:core
@@ -0,0 +1,67 @@
.. include:: /Includes.rst.txt
.. _breaking-97214:
==============================================================
Breaking: #97214 - Use UploadedFile objects instead of $_FILES
==============================================================
See :issue:`97214`
Description
===========
The TYPO3 request already contains a "disentangled" array of UploadedFile
objects. With this change, these UploadedFile objects are now used instead
of the superglobal :php:`$_FILES` in Extbase requests.
Additionally, the FAL ResourceStorage has been adjusted for handling
UploadedFile objects and the ExtensionManager upload handling has been
adjusted.
The next step would be to further adjust FAL to use only PSR provided
methods for handling uploaded files and implementing an API for file
uploads in Extbase.
Impact
======
The global :php:`$_FILES` object is not used in Extbase or the extension
manager anymore, instead the PSR request is used.
Affected Installations
======================
All installations extending the TYPO3 Core ResourceStorage object and
overwriting the :php:`addUploadedFile` method.
Migration
=========
Extension authors extending the TYPO3 Core resource storage and implementing
their own handling of :php:`addUploadedFile` need to allow objects of type
:php:`UploadedFile` in addition to the old array from global :php:`$_FILES`.
To do so, switch the type annotation to :php:`array|UploadedFile` and add code that
handles :php:`UploadedFile` objects and arrays.
Example
^^^^^^^
.. code-block:: php
if ($uploadedFileData instanceof UploadedFile) {
$localFilePath = $uploadedFileData->getTemporaryFileName();
if ($targetFileName === null) {
$targetFileName = $uploadedFileData->getClientFilename();
}
$size = $uploadedFileData->getSize();
} else {
$localFilePath = $uploadedFileData['tmp_name'];
if ($targetFileName === null) {
$targetFileName = $uploadedFileData['name'];
}
$size = $uploadedFileData['size'];
}
.. index:: PHP-API, NotScanned, ext:extbase
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _breaking-97230:
============================================================================
Breaking: #97230 - Removed hook for modifying image manipulation preview URL
============================================================================
See :issue:`97230`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['Backend/Form/Element/ImageManipulationElement']['previewUrl']`
has been removed in favor of a new PSR-14 event :php:`\TYPO3\CMS\Backend\Form\Event\ModifyImageManipulationPreviewUrlEvent`.
Impact
======
Any hook implementation registered is not executed anymore in
TYPO3 v12.0+. The extension scanner will report possible usages.
Affected Installations
======================
All TYPO3 installations using this hook in custom extension code.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <../12.0/Feature-97230-PSR-14EventForModifyingImageManipulationPreviewUrl>`
as an improved replacement.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _breaking-97231:
========================================================================
Breaking: #97231 - Removed hook for manipulating inline element controls
========================================================================
See :issue:`97231`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tceforms_inline.php']['tceformsInlineHook']`
has been removed in favor of the new PSR-14 events :php:`\TYPO3\CMS\Backend\Form\Event\ModifyInlineElementEnabledControlsEvent`
and :php:`\TYPO3\CMS\Backend\Form\Event\ModifyInlineElementControlsEvent`.
Impact
======
Any hook implementation registered is not executed anymore
in TYPO3 v12.0+.
Affected Installations
======================
TYPO3 installations with custom extensions using this hook.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 events <../12.0/Feature-97231-PSR-14EventsForModifyingInlineElementControls>`
to allow greater influence in the functionality.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _breaking-97243:
===========================================================
Breaking: #97243 - Remove global jQuery access via window.$
===========================================================
See :issue:`97243`
Description
===========
The global :js:`window.$` accessor to the jQuery instance is now no longer
provided.
Global jQuery usage has been deprecated in :issue:`86438` with the suggestion to
use JavaScript modules instead. With the integration of browser native ES6
modules jQuery should now be loaded as a regular module.
Impact
======
Loading the ES6 'jquery' module no longer has side effects, as the global
scope :js:`window` is no longer polluted by writing to the property :js:`$`.
This renders any :js:`jQuery.noConflict()` workarounds unneeded.
Affected Installations
======================
All installations that use `$` to invoke jQuery in inline JavaScripts or
custom JavaScript modules that miss to define their jQuery import, and
implicitly used the global before.
Migration
=========
Migrate to ES6 JavaScript modules and use :js:`import $ from 'jquery';` instead.
.. index:: Backend, JavaScript, NotScanned, ext:core
@@ -0,0 +1,117 @@
.. include:: /Includes.rst.txt
.. _breaking-97265:
================================================
Breaking: #97265 - Simplified access mode system
================================================
See :issue:`97265`
Description
===========
In preparation of a deployable backend access rights system based on
configuration files, some rarely used details of the permission system
have been streamlined and simplified:
* The global configuration option :php:`TYPO3_CONF_VARS['BE']['explicitADmode']`
has been removed and is not evaluated anymore.
* The only valid value for TCA config option :php:`authMode` on :php:`'type' => 'select'`
fields is now :php:`explicitAllow`. The values :php:`explicitDeny` and :php:`individual`
are invalid and no longer evaluated.
* With removal of :php:`authMode' => 'individual'` for TCA select fields, the sixth
:php:`items` option is obsolete and removed. The values :php:`EXPL_ALLOW` and
:php:`EXPL_DENY` are without any effect.
* Handling of TCA config option :php:`authMode_enforce` has been removed.
* The fourth tuple of :sql:`be_groups` field :sql:`explicit_allowdeny` that was
previously set to either :sql:`ALLOW` or :sql:`DENY` is removed.
* The fourth argument on :php:`BackendUserAuthentication->checkAuthMode()` has
been removed.
Impact
======
Using any of the above removed options will trigger a PHP :php:`E_USER_DEPRECATED` error.
Using :php:`explicitDeny` and :php:`individual` as value for TCA config option
:php:`authMode` is no longer supported by the system and may need manual
adaptions. Accessing :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['explicitADmode']`
may lead to a PHP warning level error.
Affected Installations
======================
* Instances with extensions using :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['explicitADmode']`.
The extension scanner will typically find affected instances.
* Instances with TCA select fields using :php:`'authMode' => 'explicitDeny'`.
* Instances with TCA select fields using :php:`'authMode' => 'individual'` and select
items being set to :php:`EXPL_ALLOW` or :php:`EXPL_DENY`. This is a very rarely used
option and it's unlikely modern extensions use this in practice: There is not a single
extension in the TER using this option combination and it's unlikely to be used in
custom extensions, either.
* Instances manually dealing with the :sql:`explicit_allowdeny` of table :sql:`be_groups`
may be affected if they expect the fourth field being set to :sql:`ALLOW` or :sql:`DENY`.
This is unlikely since the Core provides an API for this field using
:php:`BackendUserAuthentication->checkAuthMode()`.
* Instances calling :php:`BackendUserAuthentication->checkAuthMode()` with four instead of
three arguments. The extension scanner will find usages as weak match.
* Instances using :php:`authMode_enforce` for :php:`'type' => 'select'` fields.
Migration
=========
The majority of instances does not need to take care of anything. The values of the database
field :sql:`explicit_allowdeny` for table :sql:`be_groups` are updated with an upgrade wizard.
This should be executed. The following parts of this section outline options for rare cases
if specific seldom used options are used.
Accessing explicitADmode
------------------------
The handling of :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['explicitADmode']` has been changed as
if it is always set to :php:`explicitAllow`. Extensions should not assume this global array
key being set anymore since TYPO3 Core v12. Extensions that need to stay compatible with v11
and v12 should fall back: :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['explicitADmode'] ?? 'explicitAllow'`.
Using authMode_enforce='strict'
-------------------------------
Extensions with select fields using :php:`authMode` previously had different handling
if :php:`authMode_enforce => 'strict'` has been set: Let's say an editor accesses a record
with an :php:`authMode` field being set to a value it has no access to. With :php:`authMode_enforce`
*not* being set to :php:`strict`, the editor was still able to edit the record and set the value
to something it had access to. With :php:`authMode_enforce` being set to :php:`strict`, the editor
was not allowed to access the record. This has been streamlined: The backend interface no longer
renders those records for the editor and an "access denied" message is rendered instead. To
prevent this, a group this editor is member of needs to be adapted to allow access to this
particular value in the "Explicitly allow field values" (:sql:`explicit_allowdeny`) field.
Using authMode='explicitDeny'
-----------------------------
The "deny list" approach for single field values has been removed, the only allowed option
for :php:`authMode` is :php:`explicitAllow`. Extensions using config value :php:`explicitDeny`
should be adapted to switch to :php:`explicitAllow` instead. The upgrade wizard
"Migrate backend groups "explicit_allowdeny" field to simplified format." that transfers
existing :sql:`be_groups` rows to the new format *drops* any :sql:`DENY` fields and instructs
admins to set new access rights of affected backend groups.
Using authMode='individual'
---------------------------
Handling of :php:`authMode` being set to :php:`individual` has been fully dropped. There is
no Core-provided alternative. This has been an obscure setting since ever and there is no
direct migration. Extension that rely on this handling need to find a substitution based on
Core hooks, Core events or other existing Core API functionality.
.. index:: Backend, Database, LocalConfiguration, PHP-API, TCA, PartiallyScanned, ext:core
@@ -0,0 +1,70 @@
.. include:: /Includes.rst.txt
.. _breaking-97305-1664100009:
==================================================
Breaking: #97305 - Introduce CSRF-like login token
==================================================
See :issue:`97305`
Description
===========
:php:`\TYPO3\CMS\Core\Authentication\AbstractUserAuthentication` requires a
CSRF-like request-token to continue with the authentication process and to
create an actual server-side user session.
The request-token has to be submitted by one of these ways:
* HTTP body, e.g. in `<form>` via parameter `__request_token`
* HTTP header, e.g. in XHR via header `X-TYPO3-RequestToken`
Impact
======
Core user authentication is protected by a CSRF-like request-token, to
mitigate `Login CSRF <https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html>`__.
Custom implementations for login templates or client-side authentication
handling have to be adjusted to submit the required request-token.
Affected installations
======================
Sites having custom implementations for login templates or client-side authentication.
Migration
=========
The :php:`\TYPO3\CMS\Core\Security\RequestToken` signed with a :php:`\TYPO3\CMS\Core\Security\Nonce`
needs to be sent as JSON Web Token (JWT) to the server-side application handling of
the Core user authentication process. The scope needs to be :php:`core/user-auth/be`
or :php:`core/user-auth/fe` - depending on whether authentication is applied in
the website's backend or frontend context.
Example for overridden backend login HTML template (`ext:backend`)
------------------------------------------------------------------
.. code-block:: diff
--- a/typo3/sysext/backend/Resources/Private/Layouts/Login.html
+++ b/typo3/sysext/backend/Resources/Private/Layouts/Login.html
<input type="hidden" name="redirect_url" value="{redirectUrl}" />
<input type="hidden" name="loginRefresh" value="{loginRefresh}" />
+<input type="hidden" name="{requestTokenName}" value="{requestTokenValue}" />
Example for overridden frontend login HTML template (`ext:felogin`)
-------------------------------------------------------------------
.. code-block:: diff
--- a/typo3/sysext/felogin/Resources/Private/Templates/Login/Login.html
+++ b/typo3/sysext/felogin/Resources/Private/Templates/Login/Login.html
-<f:form target="_top" fieldNamePrefix="" action="login">
+<f:form target="_top" fieldNamePrefix="" action="login" requestToken="{requestToken}">
More details are explained in corresponding documentation on
:ref:`Feature #87616: Introduce CSRF-like request-token handling <feature-97305-1664099950>`.
.. index:: Backend, Fluid, Frontend, NotScanned, ext:core
@@ -0,0 +1,86 @@
.. include:: /Includes.rst.txt
.. _breaking-97312:
================================================
Breaking: #97312 - Remove context sensitive help
================================================
See :issue:`97312`
Description
===========
The arguments for removing context sensitive help were:
* The help was not really context sensitive, it only relied on tablename
and fieldname, if a field was used for different purposes in different
content types, the CSH always showed the same help
* There was outdated information in CSH (e.g. Screenshots form TYPO3 4.x)
and nobody is available to update the information
* Some CSH descriptions explained the same content with different words
which is confusing (e.g. tt_content - CType > Title: "Type" > CSH
Tooltip: "Select the kind of Page Content this element represents.
New options will appear when you save the record.")
* Many CSH texts did not provide useful additional information
(e.g. tt_content - header > Title: "Header" > CSH Tooltip:
"Enter header text for the Content Element.")
* The available online documentation https://docs.typo3.org/ improved
a lot and helps better than the CSH in most cases, as it is up to date
* CSH was hidden for most users, as it was only available by clicking on
a label (no hint that help was available without hovering the label by
mouse, not available for keyboard users)
* `description` is available for explanations when they are required.
Adding relevant information as `description` will help everyone as it is
visible.
* The removal was already proposed in 2019 (see
https://decisions.typo3.org/t/drop-context-sensitive-help-in-core/511)
and most arguments against removal can be solved using the `description`
or by linking to the official documentation
* Removal of CSH also removed a lot of outdated files (and results in
smaller footprint of the TYPO3 Core package)
The route `help_cshmanual_popup` has been removed.
Help buttons :php:`Components\Buttons\Action\HelpButton` only return an
empty string and trigger a deprecation warning.
The CSH descriptions are not loaded any longer for tables.
All labels are adjusted to not contain :html:`<abbr>` tags inside any longer.
The method :php:`cshItem()` of
:php:`TYPO3\CMS\Backend\Utility\BackendUtility` always returns an empty
string and triggers a deprecation warning.
The TYPO3 Manual menu item has been removed and a link to the
TYPO3 Online Documentation has been added to the menu.
The backend display related TCA option
:php:`$GLOBALS['TCA'][my_table]['interface']['always_description']`
is not evaluated anymore.
Impact
======
The context sensitive help is removed completely and only loading help
items for SelectCheckboxElements is still supported.
Affected Installations
======================
All installations that use CSH for own fields.
Migration
=========
Important CSH texts need to be migrated to a TCA :php:`description`, to
make the information available for all users.
An example for a TCA description is the :php:`protected` column in the
:php:`sys_redirect` TCA.
The TCA option :php:`['interface']['always_description']` can be removed from
any TCA definition.
.. index:: Backend, NotScanned, ext:core
@@ -0,0 +1,159 @@
.. include:: /Includes.rst.txt
.. _breaking-97320:
=======================================================================
Breaking: #97320 - Register Report and Status via Service Configuration
=======================================================================
See :issue:`97320`
Description
===========
The `reports` and `status` in EXT:reports are now registered via service
configuration, see the :doc:`feature changelog <Feature-97320-NewRegistrationForReportsAndStatus>`.
Therefore the registration via
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']`
has been removed.
Additionally, to be able to use autoconfiguration, the following interfaces have been extended:
- :php:`TYPO3\CMS\Reports\ReportInterface`: :php:`getIdentifier`, :php:`getIconIdentifier`, :php:`getTitle`, :php:`getDescription`
- :php:`TYPO3\CMS\Reports\StatusProviderInterface`: :php:`getLabel`
Impact
======
Registration of custom `reports` via :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']`
are not evaluated anymore.
Registration of custom `status` via :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']['tx_reports']['status']['providers']`
are not evaluated anymore.
:php:`ReportInterface` and :php:`StatusProviderInterface`: are extended by the mentioned methods. If the required methods are not implemented it will lead to fatal errors.
Affected Installations
======================
All TYPO3 installations using the old registration.
All TYPO3 installations with custom `reports`, not implementing :php:`public function getIdentifier()`,
:php:`public function getIconIdentifier()`, :php:`public function getTitle()`, :php:`public function getDescription()`
All TYPO3 installations with custom `status`, not implementing
:php:`public function getLabel()`
Migration
=========
By implementing the required methods of the interfaces, the custom reports are fully backwards compatible.
If TYPO3 v12+ is the only supported version, the configuration :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']` from the :file:`ext_localconf.php` file can be removed as well.
Report
------
If :yaml:`autoconfigure` is not enabled in your :file:`Configuration/Services.(yaml|php)`,
add the tag :yaml:`reports.report` manually to your `reports` service.
.. code-block:: yaml
Vendor\Extension\Report\MyReport:
tags:
- name: reports.report
The old registration can be removed, if support for TYPO3 v11 or lower is not
necessary.
.. code-block:: php
// Before in ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']['extension']['general'] = [
'title' => 'LLL:EXT:extension/Resources/Private/Language/locallang.xlf:title',
'description' => 'LLL:EXT:extension/Resources/Private/Language/locallang.xlf:description',
'icon' => 'EXT:extension/Resources/Public/Icons/Extension.svg',
'report' => \Vendor\Extension\Report::class
];
Additionally, make sure to implement all methods of :php:`TYPO3\CMS\Reports\ReportInterface`.
.. code-block:: php
// Changes for the report
class Report implements ReportInterface
{
public function getReport(): string
{
return 'Full report';
}
public function getIdentifier(): string
{
return 'general';
}
public function getTitle(): string
{
return 'LLL:EXT:extension/Resources/Private/Language/locallang.xlf:title';
}
public function getDescription(): string
{
return 'LLL:EXT:extension/Resources/Private/Language/locallang.xlf:description';
}
public function getIconIdentifier(): string
{
return 'module-reports';
}
}
Refer to the :ref:`Icon API <feature-94692-1657826754>`
on how to register the icon.
Status
------
If :yaml:`autoconfigure` is not enabled in your :file:`Configuration/Services.(yaml|php)`,
add the tag :yaml:`reports.status` manually to your `status` service.
.. code-block:: yaml
Vendor\Extension\Status\MyStatus:
tags:
- name: reports.report
The old registration can be removed, if support for TYPO3 v11 or lower is not
necessary.
.. code-block:: php
// Before in ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']['tx_reports']['status']['providers']['label'] = [
\Vendor\Extension\Status::class,
];
Additionally, make sure to implement all methods of :php:`TYPO3\CMS\Reports\StatusProviderInterface`.
.. code-block:: php
// Changes for the Status
class Status implements StatusProviderInterface
{
public function getStatus(): array
{
return [];
}
public function getLabel(): string
{
return 'label';
}
}
.. index:: Backend, LocalConfiguration, PHP-API, FullyScanned, ext:reports
@@ -0,0 +1,90 @@
.. include:: /Includes.rst.txt
.. _breaking-97358:
============================================================
Breaking: #97358 - Removed eval=int from TCA type "datetime"
============================================================
See :issue:`97358`
Description
===========
With :issue:`97232` the new TCA type :php:`datetime` has been introduced. To
further improve the usage of the new dedicated TCA type and to further reduce
complexity in the configuration, the :php:`eval=int` option has now been
removed as well. All TCA type :php:`datetime` fields, which do not use a
native database type (:php:`dbType`) are now always handled with :php:`int`.
It is therefore recommended to represent them by an :sql:`integer` database
field. To allow negative timestamps - used for dates before 1970 - the
:sql:`integer` database fields are required to be defined as :sql:`signed`.
This means, the :sql:`unsigned` definition must be omitted.
.. note::
TYPO3 automatically creates database fields for all TCA type
:php:`datetime` columns, if those are not already manually
defined in the corresponding extension's :file:`ext_tables.sql` file.
Impact
======
All TCA :php:`datetime` fields are now always handled with :php:`int`, as long
as no native database type is used.
TCA type :php:`datetime` was the last TCA type using :php:`eval=int`.
Therefore, the :php:`int` option is no longer evaluated by neither FormEngine
nor :php:`DataHandler`. This means, custom FormEngine elements, which do
currently rely on this option being evaluated in any way, have to implement
the necessary functionality by themselves now.
Affected Installations
======================
All installations which use TCA type :php:`datetime` columns
without a native database type (:php:`dbType`). Also installations, using
a non :php:`int` default value in TCA.
All installations, relying on evaluation of the :php:`eval=int` option
for their custom FormEngine elements.
Migration
=========
Remove :php:`eval=int` from any TCA column of type :php:`datetime`.
Migrate necessary functionality, related to TCA option :php:`eval=int`,
to your custom extension code, since FormEngine does no longer evaluate
this option.
Migrate :php:`default` values for TCA type :php:`datetime` fields
to :php:`int` (e.g. `''` to `0`).
Migrate corresponding database fields to :sql:`integer` where applicable.
.. code-block:: sql
# Before
CREATE TABLE tx_ext_my_table (
datetime text
);
# After
CREATE TABLE tx_ext_my_table (
datetime int(11) DEFAULT '0' NOT NULL,
);
.. note::
In case the corresponding TCA field defines :php:`eval=null`, the
:sql:`NOT NULL` definition must be omitted.
.. note::
In case you don't need any manual configuration (e.g. a special default
value), you can omit the definition of the database field, since TYPO3
automatically creates those fields for TCA type :php:`datetime` columns.
.. index:: Backend, Database, PHP-API, TCA, NotScanned, ext:backend
@@ -0,0 +1,43 @@
.. include:: /Includes.rst.txt
.. _breaking-97449:
===============================================================
Breaking: #97449 - Removed hook for modifying flex form parsing
===============================================================
See :issue:`97449`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'][FlexFormTools::class]['flexParsing']`,
supporting the four hook methods
- :php:`getDataStructureIdentifierPreProcess`
- :php:`getDataStructureIdentifierPostProcess`
- :php:`parseDataStructureByIdentifierPreProcess`
- :php:`parseDataStructureByIdentifierPostProcess`
has been removed in favor of four new dedicated :doc:`PSR-14 events <../12.0/Feature-97449-PSR-14EventsForModifyingFlexFormParsing>`.
Impact
======
Any hook implementation registered is not executed anymore in
TYPO3 v12.0+. The extension scanner will report possible usages.
Affected Installations
======================
TYPO3 installations with custom extensions using this hook.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the PSR-14 events as an improved replacement.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _breaking-97450:
=================================================================
Breaking: #97450 - Removed hook for modifying version differences
=================================================================
See :issue:`97450`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['workspaces']['modifyDifferenceArray']`
has been removed in favor of a new PSR-14 event :php:`\TYPO3\CMS\Workspaces\Event\ModifyVersionDifferencesEvent`.
Impact
======
Any hook implementation registered is not executed anymore in
TYPO3 v12.0+. The extension scanner will report possible usages.
Affected Installations
======================
All TYPO3 installations using this hook in custom extension code.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <../12.0/Feature-97450-PSR-14EventForModifyingVersionDifferences>`
as an improved replacement.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _breaking-97451:
=======================================================
Breaking: #97451 - Removed BackendController page hooks
=======================================================
See :issue:`97451`
Description
===========
The hooks :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/backend.php']['constructPostProcess']`,
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/backend.php']['renderPreProcess']`, and
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/backend.php']['renderPostProcess']` have
been removed in favor of a new PSR-14 event :php:`\TYPO3\CMS\Backend\Controller\Event\AfterBackendPageRenderEvent`.
Additionally, the :php:`BackendController->addCss()` method has been removed without replacement,
as it is no longer used.
Impact
======
Any hook implementation registered is not executed anymore in
TYPO3 v12.0+. The extension scanner will report possible usages.
Affected Installations
======================
All TYPO3 installations using this hook in custom extension code.
Migration
=========
The hooks are removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <../12.0/Feature-97451-PSR-14EventsForBackendPageController>`
as an improved replacement.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _breaking-97452:
===================================================
Breaking: #97452 - Removed EditFileController hooks
===================================================
See :issue:`97452`
Description
===========
The hooks :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/file_edit.php']['preOutputProcessingHook']`
and :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/file_edit.php']['postOutputProcessingHook']`
have been removed, since adjusting the generated content can be achieved using template overrides
and modifying the form data, used to generate the edit file form, can be done
using the PSR-14 :php:`TYPO3\CMS\Filelist\Event\ModifyEditFileFormDataEvent`.
Impact
======
Any hook implementation registered is not executed anymore in TYPO3 v12.0+.
The extension scanner will report possible usages.
Affected Installations
======================
All TYPO3 installations using these hook in custom extension code. This is
pretty unlikely, since both hooks were of limited use.
Migration
=========
The form data modification, allowed by :php:`preOutputProcessingHook`, can be
achieved with the new :ref:`PSR-14 ModifyEditFileFormDataEvent <feature-98521-1664890745>`.
The content manipulation :php:`postOutputProcessingHook` hook can be substituted with a template override
as outlined in :ref:`this changelog entry <feature-96812>`.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,47 @@
.. include:: /Includes.rst.txt
.. _breaking-97454-1657327622:
=============================================
Breaking: #97454 - Removed Link Browser hooks
=============================================
See :issue:`97454`
Description
===========
The hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['LinkBrowser']['hooks']`
with its two functions :php:`modifyLinkHandlers()` and
:php:`modifyAllowedItems()` has been removed in favor of two new PSR-14 events
:php:`\TYPO3\CMS\Backend\Controller\Event\ModifyLinkHandlersEvent`
and :php:`\TYPO3\CMS\Backend\Controller\Event\ModifyAllowedItemsEvent`.
.. seealso::
* :ref:`feature-97454-1657327622`
* :ref:`t3coreapi:modifyLinkHandlers`
* :ref:`t3coreapi:ModifyLinkHandlersEvent`
* :ref:`t3coreapi:ModifyAllowedItemsEvent`
Impact
======
Any hook implementation registered is not executed anymore in
TYPO3 v12.0+. The extension scanner will report possible usages.
Affected Installations
======================
All TYPO3 installations using this hook in custom extension code.
Migration
=========
The hook is removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :ref:`PSR-14 event <feature-97454-1657327622>`
as an improved replacement.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _breaking-97530-1651500260:
===================================================================================
Breaking: #97530 - Indexed Search option searchSkipExtendToSubpagesChecking removed
===================================================================================
See :issue:`97530`
Description
===========
The TypoScript property :typoscript:`searchSkipExtendToSubpagesChecking`
related to Indexed Search query results has been removed.
Setting the option made Indexed Search bypass the check for validating pages
related to TYPO3's :php:`extendToSubpages` Core feature. However, since the
:php:`extendToSubpages` functionality has now been optimized via an alternative
to :php:`getTreeList()`, the option is removed.
Impact
======
Setting the option
:typoscript:`plugin.tx_indexedsearch.settings.searchSkipExtendToSubpagesChecking`
has no effect anymore.
All search requests within indexed search will now respect the
:php:`extendToSubpages` flag.
Affected installations
======================
TYPO3 installations using Indexed Search having this option set.
Migration
=========
If you still encounter using indexed search related to :php:`extendToSubpages` it is
recommended to extend Indexed Search queries with custom hooks to manipulate
the search query.
.. index:: TypoScript, NotScanned, ext:indexed_search
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _breaking-97550-1651697278:
========================================================================
Breaking: #97550 - TypoScript option config.disableCharsetHeader removed
========================================================================
See :issue:`97550`
Description
===========
The TypoScript flag :typoscript:`config.disableCharsetHeader` has been completely removed
from TYPO3 Core.
This option was used to avoid sending HTTP headers of type `Content-Type` to
the client. This flag was mainly used to overcome a technical limitation to
override the Content-Type information back in TYPO3 v4.x.
Impact
======
TYPO3 now always sends the `Content-Type` header to the client in the TYPO3
Frontend.
Affected installations
======================
TYPO3 installations having this option enabled via TypoScript.
Migration
=========
It is not needed to set this option. Even when Extbase plugins return JSON-based
Responses, the Content-Type header is already modified.
In special cases, when custom headers are required, it is possible to modify
the headers via a PHP-based PSR-15 middleware, or via TypoScript with
"config.additionalHeaders".
.. index:: TypoScript, NotScanned, ext:frontend
@@ -0,0 +1,33 @@
.. include:: /Includes.rst.txt
.. _breaking-97605-1652214290:
============================================================================
Breaking: #97605 - Remove field resizeTextareas_MaxHeight from user settings
============================================================================
See :issue:`97605`
Description
===========
The field :php:`resizeTextareas_MaxHeight` with the label *Maximum height of text areas in pixels* has been removed.
The impact of the field is low and its removal simplifies the user settings module.
Impact
======
The height of textareas is the same for every user.
Affected installations
======================
Every TYPO3 installation.
Migration
=========
There is no migration available. If this feature is needed, the rendering of a field can be modified by a custom :php:`FormElement`.
.. index:: Backend, NotScanned, ext:backend
@@ -0,0 +1,50 @@
.. include:: /Includes.rst.txt
.. _breaking-97701-1655154047:
=========================================================================
Breaking: #97701 - TSconfig option disableNewContentElementWizard removed
=========================================================================
See :issue:`97701`
Description
===========
The TSconfig option :typoscript:`mod.web_layout.disableNewContentElementWizard`
has been used to explicitly disable the content element wizard. When set,
a new Content Element of type "Text" was created by default, which was then
changed to a different Content Type.
Along with this the option :typoscript:`mod.newContentElementWizard.override` has
been removed, as it served a similar purpose to override the route name itself.
Impact
======
Both TSconfig options have no effect anymore. TYPO3 behaves as if the options
were never set.
Affected installations
======================
TYPO3 installations having one of these options explicitly enabled.
Migration
=========
Remove the TSconfig settings as they have no effect anymore.
Instead, use other TSconfig options to adapt the "New Content Element Wizard"
to your needs. You can find according examples in
:file:`EXT:frontend/Configuration/page.tsconfig`.
It is also possible to create a custom backend route in your extension code
to reimplement both functionalities in a custom TYPO3 Extension, if this option
is still relevant for you.
If you overwrite the Fluid template :file:`EXT:backend/Resources/Private/Partials/PageLayout/Record.html`
you have to adjust your template accordingly and remove the "if" condition
checking for `{item.column.context.drawingConfiguration.showNewContentWizard}`.
.. index:: Backend, Fluid, TSConfig, PartiallyScanned, ext:backend
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _breaking-97729-1654627167:
==========================================================
Breaking: #97729 - Respect attribute approved in XLF files
==========================================================
See :issue:`97729`
Description
===========
The new option :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['lang']['requireApprovedLocalizations']`
controls whether only approved translations are taken into account when parsing XLF files.
This option is enabled by default for new and existing TYPO3 installations.
Impact
======
If set to `true` - which is the default value - only approved translations are used.
Any non-approved translation will be ignored.
If the attribute approved is omitted, the translation is still taken into account.
.. code-block:: xml
<trans-unit id="label2" approved="yes">
<source>This is label #2</source>
<target>Ceci est le libellé no. 2</target>
</trans-unit>
Affected installations
======================
All TYPO3 translations using translations from XLF files.
Migration
=========
Either set :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['lang']['requireApprovedLocalizations']`
to `false` or add `approved="yes"` to all translations.
.. index:: Backend, Fluid, Frontend, TCA, TypoScript, NotScanned, ext:core
@@ -0,0 +1,53 @@
.. include:: /Includes.rst.txt
.. _breaking-97737-1654595331:
=====================================================
Breaking: #97737 - Page-related hooks in TSFE removed
=====================================================
See :issue:`97737`
Description
===========
The following hooks, which were executed during the process of resolving page
details of a frontend request have been removed:
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['determineId-PreProcessing']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['fetchPageId-PostProcessing']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['settingLanguage_preProcess']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['determineId-PostProc']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['settingLanguage_postProcess']`
They have been replaced by improved PSR-14 events.
Impact
======
Extensions that hook into these places are not executing the PHP-code anymore.
Affected installations
======================
TYPO3 installations with extensions using one of the hooks.
Check the "Configuration" module to see if your TYPO3 installation is using
one of the hooks by browsing :php:`$TYPO3_CONF_VARS[SC_OPTIONS]` or using the
Extension Scanner.
Migration
=========
The hooks are removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 events <../12.0/Feature-97737-PSR-14EventsWhenPageRootlineInFrontendIsResolved>`
* :php:`BeforePageIsResolvedEvent`
* :php:`AfterPageWithRootLineIsResolvedEvent`
* :php:`AfterPageAndLanguageIsResolvedEvent`
as an improved replacement.
.. index:: Frontend, FullyScanned, ext:frontend
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _breaking-97752-1654761506:
=================================================
Breaking: #97752 - MailerAdapterInterface removed
=================================================
See :issue:`97752`
Description
===========
The :php:`\TYPO3\CMS\Core\Mail\MailerAdapterInterface` has been removed,
since the interface became unused in v7 due to removal of Core's
:php:`SwiftMailerAdapter` implementation, which had been used as hook
subscriber in the also removed :php:`MailUtility::mail()` method.
Impact
======
Implementing the interface in custom extension code will trigger
a PHP Error.
Affected installations
======================
All installations implementing the interface in custom extension code,
which is very unlikely. The extension scanner will report any usage as
strong match.
Migration
=========
Remove any usage of the interface in extension code.
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,60 @@
.. include:: /Includes.rst.txt
.. _breaking-97787-1657629392:
====================================================================================
Breaking: #97787 - AbstractMessage->getSeverity() returns ContextualFeedbackSeverity
====================================================================================
See :issue:`97787`
Description
===========
The class :php:`\TYPO3\CMS\Core\Messaging\AbstractMessage` and the extended
class :php:`\TYPO3\CMS\Core\Messaging\FlashMessage` both have a method
:php:`getSeverity()` to return a flash message's severity. The return type of
the method is changed to return an instance of :php:`\TYPO3\CMS\Core\Type\ContextualFeedbackSeverity`.
As this method isn't supposed to be used publicly, it is declared `internal` now.
Impact
======
Relying on the return type of :php:`\TYPO3\CMS\Core\Messaging\AbstractMessage->getSeverity()`
being `int` will throw a :php:`TypeError` exception.
There is no negative impact in the following cases:
* Using the severity enum in Fluid for direct rendering
* Using the severity enum in :php:`json_encode()`
In these cases, the enum's value is automatically used.
Affected installations
======================
All extensions using :php:`\TYPO3\CMS\Core\Messaging\AbstractMessage->getSeverity()`
in PHP are affected, if the integer type is expected.
Migration
=========
If the integer type of :php:`\TYPO3\CMS\Core\Messaging\AbstractMessage->getSeverity()`
is expected, use the :php:`value` property of the :php:`ContextualFeedbackSeverity` enum:
.. code-block:: php
$flashMessage = new \TYPO3\CMS\Core\Messaging\FlashMessage('This is a message');
$severityAsInt = $flashMessage->getSeverity()->value;
The same applies to Fluid template, where the severity is used within another
structure, e.g. as an array key:
.. code-block:: html
<div class="x" class="{severityClassMapping.{status.severity.value}}">
<!-- stuff happens here -->
</div>
.. index:: PHP-API, NotScanned, ext:core
@@ -0,0 +1,51 @@
.. include:: /Includes.rst.txt
.. _breaking-97797-1655730428:
=========================================================
Breaking: #97797 - GFX setting processor_path_lzw removed
=========================================================
See :issue:`97797`
Description
===========
The global configuration option :php:`$GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_path_lzw']`
was used to compress GIF and TIFF files with a different ImageMagick version,
as LZW compression was removed from the distributed ImageMagick binaries back in
2004-2006.
Since then, both GIF and TIFF have had reduced impact on the web we know today.
For this reason, the value is removed. If GIF compression via LZW is wanted,
it should be pointing to the main `processor_path` setting.
Impact
======
Compression via LZW for GIF files is now only applied when the corresponding
ImageMagick version, found in `processor_path` is supporting LZW compression.
The GFX setting `processor_path_lzw` is not used anymore, and can safely be
removed. When accessing the Install Tool, the setting is automatically removed
from :file:`LocalConfiguration.php`.
Affected installations
======================
TYPO3 installations actively using GIF compression or GIF thumbnails over PNG
thumbnails (if `GFX/thumbnails_png` is set to false), which might result in
GIF files with a larger file size.
Migration
=========
It is recommended to switch to PNG thumbnails (TYPO3 setting `GFX/thumbnails_png`),
or use an ImageMagick version supporting LZW compression for GIF files, if this
functionality is explicitly needed.
In addition, solutions such as `gifsicle` can be used instead to optimize
GIF images.
.. index:: Frontend, PartiallyScanned, ext:core
@@ -0,0 +1,107 @@
.. include:: /Includes.rst.txt
.. _breaking-97816-1664800747:
====================================================
Breaking: #97816 - New TypoScript parser in Frontend
====================================================
See :issue:`97816`
Description
===========
The rewrite of the TypoScript parser has been enabled for Frontend
rendering.
See :ref:`breaking-97816-1656350406` and :ref:`feature-97816-1656350667`
for more details on the new parser.
Impact
======
The change has impact on Frontend caching, hooks, some classes and properties. In detail:
* Hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['Core/TypoScript/TemplateService']['runThroughTemplatesPostProcessing']`
is gone and substituted by :php:`AfterTemplatesHaveBeenDeterminedEvent`. See :ref:`feature-97816-1664801053` for more details.
* The classes :php:`TYPO3\CMS\Core\TypoScript\TemplateService` and :php:`TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser`
have been marked as deprecated and shouldn't be used anymore.
An instance of :php:`TemplateService` is still kept as property :php:`TypoScriptFrontendController->tmpl` (:php:`$GLOBALS['TSFE']->tmpl)
as backwards compatible layer, and the most important properties within the class, namely especially :php:`TemplateService->setup` is
still set. To avoid using these properties, the Frontend request object will contain this state.
In rare cases, where extensions need to parse TypoScript on their own, they should switch to the Tokenizer and AstBuilder structures
of the new parser. Note these classes are still young and currently marked @internal, the API may still slightly change with further
v12 development.
* The :php:`pagesection` cache has been removed. This was a helper cache that grew O(n) with the number of
called Frontend pages. The new :php:`typoscript` cache is used instead: This grows only O(n) with the
number of different sys_template and condition combinations and is a filesystem based :php:`PhpFrontend` implementation.
When upgrading, the database tables :sql:`cache_pagesection` and :sql:`cache_pagesections_tags` can be safely removed, the
install tool will also silently remove any existing entries from :file:`settings.php` that reconfigure the cache.
* The Frontend rendering changed TypoScript cache behavior slightly, which may have an impact on integrators developing
and testing TypoScript in the Frontend. The short version is: When changing :sql:`sys_template` records, changes have
immediate effect, and when changing included TypoScript files, the Frontend browser tab should be reloaded using "shift-reload"
or the browser inspector should be opened and the "Disable cache" toggle turned on. Note when changes like this should
go live for everyone, Frontend caches must still be cleared using the Backend toolbar "Flush frontend caches" to have
an effect on "normal users" without active Backend login.
Some more details on this: Frontend TypoScript in general now uses caches across multiple pages, which
increases rendering performance. After calling a first page with empty caches, a second page call to a different
page will re-use most, if not all, TypoScript from cache entries created by the first page access.
This has impact on cache invalidation when developing Frontend TypoScript:
First, changing :sql:`sys_template` records always has immediate effect to all requests, even without clearing caches manually.
The system detects field changes of :sql:`sys_template` changes automatically, reloading a page in the Frontend will trigger
re-calculation of TypoScript and thus re-rendering of the page. Note this is only true for directly loaded :sql:`sys_template`
records. Changes on records included indirectly via the relatively seldom used :sql:`basedOn` field are *not* detected
automatically, and the same systematics as outlined below for file includes kicks in.
The cache behavior is slightly different for files included using :typoscript:`@import`, :typoscript:`<INCLUDE_TYPOSCRIPT: ...`
and for :sql:`sys_template` records included using the :sql:`basedOn` field. To suppress expensive filesystem calls in production,
the cache layer for included files is more aggressive and does *not* automatically trigger Frontend page re-rendering when included
TypoScript files are changed. There are however some ways to easily work around this as an integrator: When a backend user is
logged in, a Frontend call recognizes this since various functionality is bound to logged in Backend users in the Frontend, most notably
the ability to preview hidden pages or hidden content, and the admin panel functionality. When changing Frontend TypoScript in included
files, being logged in with a Backend user, and then pressing "shift-reload" for the Frontend page, this will trigger "no cache",
which forces content re-rendering including TypoScript re-calculation. Additionally, the "Browser Inspectors" in Chrome and
Firefox both have a "Disable cache" toggle, which sends the same HTTP header as done with "shift-reload", which will *also*
force re-rendering. Note integrators should still "Flush frontend caches" when changes in included TypoScript files should
go-live for all other Frontend requests and thus "normal users" as well.
* The following properties and methods in :php:`TypoScriptFrontendController` have been set to :php:`@internal` and should not
be used any longer since they may vanish without further notice:
* :php:`TypoScriptFrontendController->no_cache`
* :php:`TypoScriptFrontendController->tmpl`
* :php:`TypoScriptFrontendController->pageContentWasLoadedFromCache`
* :php:`TypoScriptFrontendController->getFromCache_queryRow()`
* :php:`TypoScriptFrontendController->populatePageDataFromCache()`
* :php:`TypoScriptFrontendController->shouldAcquireCacheData()`
* :php:`TypoScriptFrontendController->acquireLock()`
* :php:`TypoScriptFrontendController->releaseLock()`
* The following methods in :php:`TypoScriptFrontendController` have been removed:
* :php:`TypoScriptFrontendController->getHash()`
* :php:`TypoScriptFrontendController->getLockHash()`
* :php:`TypoScriptFrontendController->getConfigArray()`
* :php:`TypoScriptFrontendController->()`
Affected installations
======================
Many instances will only recognize that the :php:`pagesection` cache is gone and should continue to work.
Instances with extensions that use :php:`TemplateService` or :php:`TypoScriptParser`, or access the
property :php:`TypoScriptFrontendController->tmpl` may need adaptions.
Migration
=========
See the impact description above for some migration hints.
.. index:: Database, Frontend, PHP-API, TypoScript, LocalConfiguration, PartiallyScanned, ext:frontend
@@ -0,0 +1,326 @@
.. include:: /Includes.rst.txt
.. _breaking-97816-1656350406:
============================================
Breaking: #97816 - TypoScript syntax changes
============================================
See :issue:`97816`
Description
===========
TYPO3 v12 comes with a new TypoScript syntax parser that is more performant,
more robust and allows better tooling in the Backend.
The new parser is more forgiving in many places, but some seldom used syntax
details have been removed, too. This documentation explains details that may
be breaking for existing instances.
Also see :ref:`the feature documentation <feature-97816-1656350667>`
for an overview of syntax improvements.
Impact
======
Using one of the constructs below stops working in v12 and needs
TypoScript adaptions.
Affected installations
======================
Instances using TypoScript as outlined below.
Migration
=========
Streamlined constants usage
---------------------------
It has never been fully documented in which context "constants" :typoscript:`{$foo}`
shall be used and which exact capabilities they have. The main TypoScript constants
documentation within the :ref:`TypoScript Reference <t3tsref:typoscript-syntax-constants>` was partially
outdated, and the :ref:`TSconfig documentation <t3tsref:Syntax>` claimed TSconfig
is not constants aware at all, which isn't fully the case anymore. Let's sort out
some details:
* Nesting constants is **not** possible and never has been. A construct like
this is invalid syntax and is treated as string literal: :typoscript:`{$foo{$bar}}`
* Recursive constants were possible with the old parser but are not supported with the new
parser anymore. This was never documented, the Backend Template module never showed them as
resolved, only the Frontend parsed recursive constants. The simple rule is now: Never
access a constant within another constant. Instances using a construct like the below one
need to untie constants.
.. code-block:: typoscript
constants:
foo = fooValue
# This does not resolve to "fooValue" but is kept as string literal "{$foo}"
bar = {$foo}
setup:
# This does NOT resolve to "fooValue", but to the string literal "{$foo}"
myValue = {$bar}
* Similar to the above restriction, constants can be used in Frontend TypoScript *setup* conditions,
but not in Frontend TypoScript *constants* conditions. As example, a :sql:`sys_template` record with
the below content set in the :sql:`constants` field always evaluates the condition to false:
.. code-block:: typoscript
my.constant = myValue
['{$my.constant}' == 'myValue']
# Never executed since the above constant usage is NOT substituted to 'myValue'
other.constant = otherValue
[global]
If something like this is really needed, integrators can potentially work around by accessing
a :ref:`site setting <t3coreapi:sitehandling-settings>` directly in a constants condition:
.. code-block:: typoscript
The sites settings.yaml:
some:
setting: someValue
A sys_template record constants field within this site:
my.constant = myValue
[traverse(site('configuration'), 'settings/some/setting') == 'someValue']
# This works but is rather ugly to rely on
other.constant = otherValue
[global]
* Constants are now restricted to "assignments" and "conditions". Using a constant to
substitute an "identifier" / "object path" is no longer allowed. This has never been
clarified in the docs before and instances abusing constants to specify object paths
should be seldom and need to resolve the situation with the new parser now:
This is supported:
.. code-block:: typoscript
# Simple constant usage as assignment value:
foo = {$bar}
# Compiling a value with string literals and constants:
foo = I am {$bar}
# Using a constant in a condition:
[ myValue = {$bar} ]
# Using constant(s) in multiline assignments:
foo (
I am {$bar} and {$baz}
)
These constructs are *not* supported:
.. code-block:: typoscript
# Using a constant as object path specification
{$bar} = myValue
# This is an object path specification, too, and not supported:
foo < {$bar}
* PageTsConfig *does* support constant substitution: Site constants can be used
in PageTsconfig. This has been introduced with TYPO3 v10, see
:ref:`feature-91080-1657827157` for details.
File includes are always top level
----------------------------------
File includes with :typoscript:`@import` and :typoscript:`<INCLUDE_TYPOSCRIPT:` within
curly braces are not relative anymore. A construct like this is invalid:
.. code-block:: typoscript
page = PAGE
page {
@import 'EXT:my_extension/Configuration/TypoScript/bar.typoscript'
20 = TEXT
20.value = bar
}
With :file:`EXT:my_extension/Configuration/TypoScript/bar.typoscript` having this content:
.. code-block:: typoscript
10 = TEXT
10.value = foo
This *no longer* leads to this TypoScript:
.. code-block:: typoscript
page = PAGE
page.10 = TEXT
page.10.value = foo
page.20 = TEXT
page.20.value = bar
Instead, the following TypoScript will be calculated:
.. code-block:: typoscript
page = PAGE
10 = TEXT
10.value = foo
20 = TEXT
20.value = bar
This means :typoscript:`@import` and :typoscript:`<INCLUDE_TYPOSCRIPT:` basically break
any curly braces level, resetting current scope to top level. While inclusion of files has
never been documented to be valid within braces assignments, it still worked until TYPO3 v11.
This is now disallowed and must not be used anymore.
:typoscript:`<INCLUDE_TYPOSCRIPT:` with :typoscript:`DIR:` and relative paths
always assumes the :file:`public/` directory as base directory now.
(Formerly it was relative to the file holding the include statement.)
@import is more restrictive with wildcards
------------------------------------------
The previous implementation of :typoscript:`@import` relied on Symfony Finder. This turned out
to be a performance bottleneck, the new implementation is based on "native" PHP file and directory
lookup logic. For performance, security and best practice considerations, :typoscript:`@import`
is now a bit more restrictive than before, especially with wildcard :typoscript:`*` handling.
Integrators are encouraged to switch from :typoscript:`<INCLUDE_TYPOSCRIPT:` to
:typoscript:`@import` in TYPO3 v12 projects: The :typoscript:`<INCLUDE_TYPOSCRIPT:`
is more complex and harder to handle, but a bit more permissive. Note :typoscript:`@import`
can be placed within conditions bodies now: :typoscript:`@import` lines are only considered
if the condition matches. This did not work with TYPO3 v11. It is likely that
:typoscript:`<INCLUDE_TYPOSCRIPT:` will be deprecated with TYPO3 v13, integrators
should adapt to :typoscript:`@import` when upgrading to TYPO3 v12 already.
The following rules apply to :typoscript:`@import`:
* Files *must* reside in extensions, the lookup pattern *must* start with :typoscript:`EXT`
if absolute. Including TypoScript snippets, for instance, from :file:`fileadmin` is *not* allowed
and never has been for :typoscript:`@import`.
* File includes *may* be relative to the current file, and *must* be prefixed with :file:`./`
in this case. Subdirectories are allowed, path traversal using :file:`../` is not allowed.
* Files *must* end with :file:`.typoscript` in frontend TypoScript. With TSconfig, both
:file:`.tsconfig` and :file:`.typoscript` are allowed, but :file:`.tsconfig` should be
preferred.
* Directory includes are *not* recursive.
* Directory traversal using :file:`../` is *not* allowed.
* Wildcards for directories are *not* allowed. This has never been documented as working, and
is considered an unplanned side-effect of Symfony Finder. Few people used this undocumented
feature, it should be possible to restructure existing uses relatively easily.
* Only a single wildcard :typoscript:`*` is allowed for filename patterns.
Valid examples:
.. code-block:: typoscript
@import 'EXT:my_extension/Configuration/TypoScript/bar.typoscript'
# Import all files in directory, ending with :file:`.typoscript`, or additionally
# :file:`.tsconfig` in TSconfig scope, in native operating system ascending order.
@import 'EXT:my_extension/Configuration/TypoScript/'
@import 'EXT:my_extension/Configuration/TypoScript/*.typoscript'
@import 'EXT:my_extension/Configuration/TypoScript/*.setup.typoscript'
# Import setupFoo.typoscript, setup.foo.typoscript and similar
@import 'EXT:my_extension/Configuration/TypoScript/setup*.typoscript'
@import 'EXT:my_extension/Configuration/TypoScript/setup*'
# If this is in file 'EXT:my_extension/Configuration/TypoScript/foo.typoscript',
# file 'EXT:my_extension/Configuration/TypoScript/bar.typoscript is included
@import './bar.typoscript`
# Relative sub directories includes are supported
@import './SubDirectory/bar.typoscript`
# Relative sub directories with wildcards are supported,
# this will include ./SubDirectory/foo.typoscript
@import './SubDirectory/*'
Invalid examples:
.. code-block:: typoscript
# fileadmin and friends not allowed
@import 'fileadmin/foo.typoscript'
# Tries to include foo.txt.typoscript, *not* foo.txt
@import 'EXT:my_extension/Configuration/TypoScript/foo.txt'
# Directory traversal is not allowed
@import 'EXT:my_extension/Configuration/TypoScript/Foo/../Bar/bar.typoscript'
# Directory wildcards are not allowed
@import 'EXT:my_extension/Configuration/TypoScript/*/foo.typoscript'
# Multiple wildcards in filename pattern are not allowed
@import 'EXT:my_extension/Configuration/TypoScript/foo.*.*.typoscript'
UTF-8 BOM in TypoScript files
-----------------------------
The new TypoScript parser no longer ignores `UTF-8 BOM <https://en.wikipedia.org/wiki/Byte_order_mark>`_
in included files: Having a Byte-order-mark in TypoScript files may create undesired
results. They should be removed. UTF-8 BOM is disallowed in various other languages,
for instance JSON and PHP. The new parser follows here. Modern editors typically don't
add an UTF-8 BOM anymore.
Instances can check if they use UTF-8 BOM with a Unix shell command:
.. code-block:: bash
# find affected files
find . -type f -print0 | xargs -0 -n1 file {} | grep 'UTF-8 Unicode (with BOM)'
# remove UTF-8 BOM from a single file
sed -i '1s/^\xEF\xBB\xBF//' affectedFile.typoscript
Support for \\n and \\r\\n linebreaks only
------------------------------------------
TypoScript sources must terminate single lines with either "\\n" (Unix ending: LineFeed),
or "\\r\\n" (Windows ending: Carriage return, LineFeed). Ancient Mac, prior to Mac OS X
used "\\r" as single linebreak character. This old linebreak type is no longer detected
when parsing TypoScript and may lead to funny results, but chances are very low any
instance is affected by this.
Operator matching has higher precedence
---------------------------------------
The new parser looks for valid operators first, then parses things behind it.
Consider this example:
.. code-block:: typoscript
lib.nav.wrap =<ul id="nav">|</ul>
This is ambiguous: The above :typoscript:`=<ul` could be interpreted both as an
assignment :typoscript:`=` of the value :typoscript:`<ul`, or as a reference
:typoscript:`=<` to the identifier :typoscript:`ul`.
While the old parser interpreted this as an assignment, the new parser treats it
as a reference.
The above example aims for an assignment, though, which can be achieved by adding
a whitespace between :typoscript:`=` and :typoscript:`<`:
.. code-block:: typoscript
lib.nav.wrap = <ul id="nav">|</ul>
Frontend TypoScript `temp.` top level object
--------------------------------------------
The Frontend TypoScript related top level object :typoscript:`temp` had special
functionality until v12: Any TypoScript defined within was "temporary" at parse time
and unset afterwards. It was not cached and could not be used as reference
(:typoscript:`=<` operator). This special meaning has been removed, the key
:typoscript:`temp` now works just like any other top level key.
.. index:: Backend, Frontend, TSConfig, TypoScript, NotScanned, ext:core
@@ -0,0 +1,78 @@
.. include:: /Includes.rst.txt
.. _breaking-97862-1657195630:
===================================================================
Breaking: #97862 - Hooks related to generating page content removed
===================================================================
See :issue:`97862`
Description
===========
The existing TYPO3 hooks in the process of generating a TYPO3 Frontend page
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-cached']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-all']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['usePageCache']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['insertPageIncache']`
have been removed. These hooks have been used to execute custom PHP code after
a page is generated in the TYPO3 frontend and ready to be stored in cache.
Due to the removal of the hooks and the introduction of the new PSR-14 events
the method signature of :php:`TypoScriptFrontendController->generatePage_postProcessing()`
has been changed. The method now requires a :php:`ServerRequestInterface` as first
argument.
Impact
======
Extension code that hooks into these places will not be executed anymore in
TYPO3 v12+.
Extension code calling :php:`TypoScriptFrontendController->generatePage_postProcessing()`
without providing a :php:`ServerRequestInterface` as first argument
will trigger a PHP `ArgumentCountError`.
Affected installations
======================
TYPO3 installations with custom extensions using these hooks such as static file
generation or modifying the page content cache, which is highly likely in
third-party extensions. The extension scanner will detect usages as
strong match.
Extensions, manually calling :php:`TypoScriptFrontendController->generatePage_postProcessing()`
without providing a :php:`ServerRequestInterface` as first argument. The
extension scanner will detect usages as weak match.
Migration
=========
Use one of the two newly introduced
:doc:`PSR-14 events <../12.0/Feature-97862-NewPSR-14EventsForManipulatingFrontendPageGenerationAndCacheBehaviour>`:
* :php:`TYPO3\CMS\Frontend\Event\AfterCacheableContentIsGeneratedEvent`
* :php:`TYPO3\CMS\Frontend\Event\AfterCachedPageIsPersistedEvent`
Extensions using the hooks can be made compatible with TYPO3 v11 and TYPO3 v12
by registering a PSR-14-based event listener while keeping the legacy hook
in place.
The :php:`AfterCacheableContentIsGeneratedEvent` acts as a replacement for
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-cached']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-all']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['usePageCache']`
whereas the :php:`AfterCachedPageIsPersistedEvent` is the replacement for
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['insertPageIncache']`.
Provide a :php:`ServerRequestInterface` as first argument when calling
:php:`TypoScriptFrontendController->generatePage_postProcessing()` in custom
extension code.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,56 @@
.. include:: /Includes.rst.txt
.. _breaking-97926-1657726187:
========================================================
Breaking: #97926 - Extbase QuerySettings methods removed
========================================================
See :issue:`97926`
Description
===========
Extbase's Persistence functionality is basing ORM queries on certain settings
usually fetched from :php:`QuerySettingsInterface`, with a default
implementation :php:`Typo3QuerySettings`.
The interface itself has changed so that it now requires two new methods:
:php:`QuerySettingsInterface::getLanguageAspect(): LanguageAspect`
:php:`QuerySettingsInterface::setLanguageAspect(LanguageAspect $aspect)`
The LanguageAspect covers both the overlay functionality and setting the
language ID.
For this reason, the following methods are removed from
:php:`QuerySettingsInterface`:
- :php:`QuerySettingsInterface::getLanguageOverlayMode()`
- :php:`QuerySettingsInterface::setLanguageOverlayMode($languageOverlayMode)`
- :php:`QuerySettingsInterface::getLanguageUid()`
- :php:`QuerySettingsInterface::setLanguageUid($languageUid)`
All adaptions have been made to the default implementation in
:php:`Typo3QuerySettings`, however the removed methods from the interface are kept
within the implementation to avoid fatal PHP errors.
Impact
======
Any custom implementation of :php:`QuerySettingsInterface` needs to implement
the newly defined methods of the interface.
Affected installations
======================
TYPO3 installations with custom Extbase extensions dealing with QuerySettings
that are adjusted with the methods used above.
Migration
=========
Switch the affected extensions via PHP to calling the newly added methods, as this is
how TYPO3 Core behaves the most reliable.
.. index:: PHP-API, FullyScanned, ext:extbase
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _breaking-97927-1657730964:
=================================================================
Breaking: #97927 - Removed TypoScript option config.doctypeSwitch
=================================================================
See :issue:`97927`
Description
===========
Previous TYPO3 versions allowed to set :typoscript:`config.doctypeSwitch`
via TypoScript.
If this option was set, the order of <?xml...> and <!DOCTYPE...> during the
rendering of a Frontend page was reversed. This was needed in the past for
Internet Explorer to be standards-compliant with XHTML. Otherwise IE's
"Quirks Mode" was used.
Nowadays, usages for both Internet Explorer (which is not supported anymore) and
XHTML have been low, which is why the option is now removed from TYPO3 Core.
Impact
======
Setting the option :typoscript:`config.doctypeSwitch` has no effect anymore, the
XML declaration and doctype statement are kept as is.
Affected installations
======================
TYPO3 installations with old templates having this TypoScript option set.
Migration
=========
It is recommended to avoid using this functionality, and to switch to HTML5.
.. index:: TypoScript, NotScanned, ext:frontend
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _breaking-97945:
=================================================
Breaking: #97945 - Removed WorkspaceService hooks
=================================================
See :issue:`97945`
Description
===========
The hooks :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\CMS\Workspaces\Service\WorkspaceService']['hasPageRecordVersions']`
and :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\CMS\Workspaces\Service\WorkspaceService']['fetchPagesWithVersionsInTable']`,
used to manipulate the state of versions for pages and tables have been removed.
This information has been used to highlight pages in the page tree. This
modification however can now be done using the new PSR-14
:php:`\TYPO3\CMS\Backend\Controller\Event\AfterPageTreeItemsPreparedEvent`.
Impact
======
Any hook implementation registered is not executed anymore since
TYPO3 v12.0. The extension scanner will report possible usages.
Affected Installations
======================
All TYPO3 installations using these hooks in custom extension code.
Migration
=========
The hooks are removed without deprecation in order to allow extensions
to work with TYPO3 v11 (using the hook) and v12+ (using the new event).
Use the :doc:`PSR-14 event <../12.0/Feature-97945-PSR14AfterPageTreeItemsPreparedEvent>`
as replacement.
.. index:: Backend, PHP-API, FullyScanned, ext:workspaces
@@ -0,0 +1,47 @@
.. include:: /Includes.rst.txt
.. _breaking-98016-1658731955:
===================================================
Breaking: #98016 - Removed TypoScript function hook
===================================================
See :issue:`98016`
Description
===========
With the transition to the :ref:`new TypoScript parser <feature-97816-1656350667>`,
the hook :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tsparser.php']['preParseFunc']`
is no longer called.
This hook has been used to implement own functions for the TypoScript "function" operator :typoscript:`:=`.
Additional functions can now be implemented using the
:php:`\TYPO3\CMS\Core\TypoScript\AST\Event\EvaluateModifierFunctionEvent`
as described in :ref:`this Changelog <feature-98016-1658732423>`.
Impact
======
With the continued implementation of the new TypoScript parser in TYPO3 v12,
registered hook implementations are not executed anymore. The extension scanner
will report possible usages.
Affected installations
======================
Extensions registering own TypoScript function implementations like this:
.. code-block:: typoscript
myValue := myCustomFunction(modifierArgument)
Migration
=========
Implement the :ref:`new event <feature-98016-1658732423>`. Extensions that want to keep
compatibility with both TYPO3 v11 and v12 can keep the old hook implementation without
further deprecations.
.. index:: PHP-API, TSConfig, TypoScript, FullyScanned, ext:core
@@ -0,0 +1,55 @@
.. include:: /Includes.rst.txt
.. _breaking-98024:
=================================================
Breaking: #98024 - TCA option `cruser_id` removed
=================================================
See :issue:`98024`
Description
===========
The TCA option in the :php:`ctrl` section of each TCA table :php:`cruser_id` has been
removed, along with populating this system-related information within DataHandler
and the auto-creation of the database field.
The setting was used to fill the UID of the Backend User who originally created
the affected row. However, this information is also available through TYPO3's
History functionality, and does not need to be persisted twice.
Several drawbacks came with this feature, which is why it was removed entirely:
* Extbase did not support this functionality
* When a record was created via the Frontend in the plugin, the userid was not available
Information about a record ("Info Popup" or within Workspaces) is now fetched
through TYPO3's History functionality.
Impact
======
When creating new records, the value of the database field is not auto-populated.
Also, when upgrading to TYPO3 v12, the database field is prepared to be removed.
The option :php:`$GLOBALS['TCA'][$tableName]['ctrl']['cruser_id']` is also
automatically removed during cache warmup from the final TCA listing.
Affected Installations
======================
TYPO3 installations actively using this field for querying or filling, not using
TYPO3 API, and accessing the database directly.
Migration
=========
If the need for the information that is who created the record is needed,
use the History functionality to fetch the creation details of a record.
If this field is actively queried, it is recommended to add this field as a
regular TCA column with a custom hook or PSR-14 event to fill this information.
.. index:: Database, TCA, NotScanned, ext:core
@@ -0,0 +1,46 @@
.. include:: /Includes.rst.txt
.. _breaking-98032:
=======================================================
Breaking: #98032 - Serializable Interface fully removed
=======================================================
See :issue:`98032`
Description
===========
The :php:`Serializable` interface has been deprecated, and is
slated for removal entirely in PHP 9. The preferred
serialization tool is the :php:`__serialize`/:php:`__unserialize`
method pair.
All serializable classes in TYPO3 Core already implement
:php:`__serialize`/:php:`__unserialize`, which is automatically
used by PHP in place of :php:`Serializable`. The now-vestigial
:php:`Serializable` references have been removed.
Impact
======
Generally none, unless a text string of an object serialized in TYPO3 v10
or earlier (using :php:`Serializable`) is deserialized in TYPO3 v12, in
which case it will not deserialize correctly due to the different
string format used by :php:`Serializable`. That is extremely unlikely
to happen.
The use of :php:`Serializable` in extensions is not recommended anymore,
and will be removed from PHP in version 9.
Affected Installations
======================
None.
Migration
=========
None needed.
.. index:: PHP-API, NotScanned, ext:core
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _breaking-98069-1659536025:
=======================================
Breaking: #98069 - DebugConsole removed
=======================================
See :issue:`98069`
Description
===========
The DebugConsole comes from ExtJS times and was triggered when e.g. a request
failed to give a developer its response, including the stacktrace. Nowadays,
browsers offer a console allowing to investigate requests. Also, PHP debuggers
(e.g. xdebug) are commonly known and used, which makes the DebugConsole obsolete.
Impact
======
Triggering the DebugConsole is not possible anymore. Also, the PHP method
:php:`\TYPO3\CMS\Core\Utility\DebugUtility::debug()` always renders the plain
debug output to the client.
The 3rd argument :php:`$group` of the method
:php:`\TYPO3\CMS\Core\Utility\DebugUtility::debug()` is removed.
Affected installations
======================
All installations are affected.
Migration
=========
No migration is available.
.. index:: Backend, JavaScript, PHP-API, PartiallyScanned, ext:backend
@@ -0,0 +1,43 @@
.. include:: /Includes.rst.txt
.. _breaking-98089-1659734321:
======================================
Breaking: #98089 - Removed FontAwesome
======================================
See :issue:`98089`
Description
===========
The node package `font-awesome` and the related CSS and font files have been
removed from the TYPO3 backend. This also includes the icon provider class
:php:`\TYPO3\CMS\Core\Imaging\IconProvider\FontawesomeIconProvider`.
The configuration option :php:`icon-class` of login providers has no effect
anymore.
Impact
======
Using the aforementioned icon provider to register icons is not possible
anymore. Also, any direct usage of :css:`fa-*` classes will not work anymore.
Affected installations
======================
All installations relying on FontAwesome are affected.
Migration
=========
Migrate to the `@typo3/icons` package if possible. If the TYPO3 installation
still requires FontAwesome, install the polyfill extension `fontawesome_provider`.
To install the extension via Composer, run the command
:bash:`composer require friendsoftypo3/fontawesome-provider`.
The extension will be available in TER soon as `fontawesome_provider <https://extensions.typo3.org/extension/fontawesome_provider>`__.
.. index:: Backend, PHP-API, NotScanned, ext:core

Some files were not shown because too many files have changed in this diff Show More