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,37 @@
.. include:: /Includes.rst.txt
.. _breaking-86492:
=======================================================================
Breaking: #86492 - Removed stdWrap support for config.additionalHeaders
=======================================================================
See :issue:`86492`
Description
===========
The feature to use :typoscript:`stdWrap` for :typoscript:`config.additionalHeaders` has been removed due to
an incompatibility with page caching.
Impact
======
:typoscript:`stdWrap` cannot be used anymore to manipulate additional headers set via TypoScript.
Affected Installations
======================
Any TYPO3 instance that uses this feature, which has been introduced with version 9.0.
Migration
=========
For the time being there will be no TypoScript based solution for dynamic HTTP headers.
Consider implementing a PSR-15 middleware to add advanced logic for additional frontend response headers.
.. index:: Frontend, TypoScript, NotScanned, ext:frontend
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-83793:
=============================================================
Deprecation: #83793 - FAL ResourceStorage->dumpFileContents()
=============================================================
See :issue:`83793`
Description
===========
The method :php:`TYPO3\CMS\Core\Resource\ResourceStorage->dumpFileContents()` has been marked as deprecated.
Impact
======
Calling this method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with extensions, which use the method.
Migration
=========
Use :php:`TYPO3\CMS\Core\Resource\ResourceStorage->streamFile()` instead.
.. index:: FAL, PHP-API, FullyScanned
@@ -0,0 +1,59 @@
.. include:: /Includes.rst.txt
.. _deprecation-84196:
=================================================================================
Deprecation: #84196 - Backend controller actions do not receive prepared response
=================================================================================
See :issue:`84196`
Description
===========
The second argument to backend and eID controller actions has been marked as deprecated.
Controllers should create a response object implementing
:php:`Psr\Http\Message\ResponseInterface` on their own instead of relying
on a prepared response.
The signature of controller actions should look like
.. code-block:: php
public function myAction(ServerRequestInterface $request): ResponseInterface
Impact
======
Controllers should typically instantiate one of the three core response classes
and return it. Note that these classes are internal API and it is therefore
recommended to use PSR-17 reponse factory interfaces once updating to TYPO3 v10
instead.
.. code-block:: php
public function myAction(ServerRequestInterface $request): ResponseInterface
{
return new HtmlResponse('content');
return new JsonResponse($jsonArray);
return new RedirectResponse($url);
}
Affected Installations
======================
Instances with extensions that register backend controllers (eg. modules) or eID
may be affected.
The dynamic scanning for not yet adapted controller actions relies on reflection and
costs some CPU cycles. If all affected extensions have been adapted, the feature toggle
:php:`simplifiedControllerActionDispatching` should be enabled. This can be managed in
the backend Settings -> Configure Installation-Wide Options module.
Migration
=========
See above code examples for typical controller actions return values and signature.
.. index:: Backend, PHP-API, NotScanned
@@ -0,0 +1,80 @@
.. include:: /Includes.rst.txt
.. _deprecation-85031:
======================================================
Deprecation: #85031 - Protected ImportExportController
======================================================
See :issue:`85031`
Description
===========
The following properties of class :php:`TYPO3\CMS\Impexp\Controller\ImportExportController` changed their visibility from public to protected and should not be called any longer:
* [not scanned] :php:`pageinfo`
* [not scanned] :php:`id`
* [not scanned] :php:`perms_clause`
* [not scanned] :php:`extObj`
* [not scanned] :php:`doc`
* [not scanned] :php:`content`
* [not scanned] :php:`extClassConf`
* [not scanned] :php:`modMenu_setDefaultList`
* [not scanned] :php:`modMenu_dontValidateList`
* [not scanned] :php:`modMenu_type`
* [not scanned] :php:`modTSconfig`
* [not scanned] :php:`MOD_SETTINGS`
* [not scanned] :php:`MOD_MENU`
* [not scanned] :php:`CMD`
* [not scanned] :php:`MCONF`
The following methods of class :php:`TYPO3\CMS\Impexp\Controller\ImportExportController` changed their visibility from public to protected and should not be called any longer:
* [not scanned] :php:`init()`
* [not scanned] :php:`main()`
* [not scanned] :php:`exportData()`
* :php:`addRecordsForPid()`
* :php:`exec_listQueryPid()`
* :php:`makeConfigurationForm()`
* :php:`makeAdvancedOptionsForm()`
* :php:`makeSaveForm()`
* [not scanned] :php:`importData()`
* [not scanned] :php:`checkUpload()`
* :php:`getTableSelectOptions()`
* :php:`filterPageIds()`
* [not scanned] :php:`getExtObjContent()`
* [not scanned] :php:`extObjContent()`
* [not scanned] :php:`extObjHeader()`
* [not scanned] :php:`checkSubExtObj()`
* [not scanned] :php:`checkExtObj()`
* [not scanned] :php:`getExternalItemConfig()`
* [not scanned] :php:`handleExternalFunctionValue()`
* [not scanned] :php:`mergeExternalItems()`
* [not scanned] :php:`menuConfig()`
Additionally, the assignment of an object instance of class :php:`ImportExportController` as
:php:`GLOBALS['SOBE']` has been marked as deprecated and will not be set anymore in TYPO3 v10.
Furthermore, class :php:`ImportExportController` does not inherit class :php:`BaseScriptClass` anymore.
Impact
======
Calling one of the above methods or accessing above properties triggers a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
It is relatively unlikely instances are affected by this change since it is rather uncommon
to extend the import / export extension. The extension scanner will find some of the usages.
Migration
=========
No migration possible.
.. index:: Backend, PHP-API, PartiallyScanned, ext:impexp
@@ -0,0 +1,59 @@
.. include:: /Includes.rst.txt
.. _deprecation-85970:
=========================================
Deprecation: #85970 - FILE content object
=========================================
See :issue:`85970`
Description
===========
The cObject :typoscript:`FILE` mixed concerns (rendering an image, or dumping file contents), and
rather became low-level since Fluid's rise in rendering Frontend.
:typoscript:`FILE` shows an image if the file is jpg,jpeg,gif,png (but not SVG). If a
different file ending is detected, it will check if the file is less than 1MB, and will get its contents
and output that. If the file is 1 byte bigger, nothing is done.
Fluid offers more flexibility nowadays.
Thus, cObject :typoscript:`FILE` will be removed in TYPO3 v10.
Impact
======
Instances using the TypoScript cObject :typoscript:`FILE` will find PHP :php:`E_USER_DEPRECATED` errors for each usage.
Affected Installations
======================
Instances using the TypoScript cObject :typoscript:`FILE`.
Migration
=========
Use :typoscript:`IMAGE` to show images instead.
For realising :typoscript:`TEMPLATE`, migrate to using :typoscript:`FLUIDTEMPLATE`. It comes with all
the benefits Fluid offers.
However due to the flexibility of custom cObjects, an extension author could just re-implement
the functionality in a custom extension within minutes.
See this example for ext:frontend where the registration resides in :file:`ext_localconf.php`.
.. code-block:: php
$GLOBALS['TYPO3_CONF_VARS']['FE']['ContentObjects'] = array_merge(
$GLOBALS['TYPO3_CONF_VARS']['FE']['ContentObjects'],
[
'FILE' => \TYPO3\CMS\Frontend\ContentObject\FileContentObject::class,
],
);
.. index:: TypoScript, NotScanned
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _deprecation-85980:
==============================================================
Deprecation: #85980 - @internal annotation in extbase commands
==============================================================
See :issue:`85980`
Description
===========
The :php:`@internal` annotation has been marked as deprecated and will be removed from TYPO3 v10
without any replacement.
This is a regular phpDocumentor annotation that is used to denote that associated structural
elements are elements internal to the application or library. It has been misused by Extbase to tell
if a command is internal and thus should not be exposed through help texts, user documentation etc.
TYPO3 does no longer support the use of the :php:`@internal` annotation to influence the behaviour
of the code.
Impact
======
Using :php:`@internal` on methods of classes extending
:php:`TYPO3\CMS\Extbase\Mvc\Controller\CommandController` will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
All installations that make use of Extbase commands whose methods are tagged with :php:`@internal`.
Migration
=========
Just remove the annotation from the affected controllers.
.. index:: ext:extbase, NotScanned
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _deprecation-83094-1668719172:
===============================================
Deprecation: #83094 - Annotation @flushesCaches
===============================================
See :issue:`85981`
Description
===========
The :php:`@flushesCaches` annotation has been marked as deprecated and will be removed with TYPO3 v10.
The annotation was introduced during backport from FLOW and never implemented to actually do anything
useful. It will be removed without substitution.
With it, the method :php:`TYPO3\CMS\Extbase\Mvc\Cli\Command->isFlushingCaches()` has been marked as deprecated
and will also be removed in TYPO3 v10.
Impact
======
Usage of Annotation :php:`@flushesCaches` and method :php:`TYPO3\CMS\Extbase\Mvc\Cli\Command->isFlushingCaches()`
will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
All extensions that use :php:`@flushesCaches` or call the method :php:`TYPO3\CMS\Extbase\Mvc\Cli\Command->isFlushingCaches()`.
Migration
=========
Just remove annotation and method call. They did not do anything before.
.. index:: PHP-API, ext:extbase, FullyScanned
@@ -0,0 +1,55 @@
.. include:: /Includes.rst.txt
.. _deprecation-86047:
=====================================================================
Deprecation: #86047 - TSFE properties / methods and change visibility
=====================================================================
See :issue:`86047`
Description
===========
The following properties of class :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController` have changed their visibility from public to protected and should not be called any longer.
* :php:`pageAccessFailureHistory`
* :php:`workspacePreview` (not in use anymore)
* :php:`ADMCMD_preview_BEUSER_uid` (not in use anymore)
* :php:`debug` (not in use anymore)
* :php:`MP_defaults` (not in use anymore outside of TSFE)
* :php:`loginAllowedInBranch` (use checkIfLoginAllowedInBranch())
The following methods of class :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController` have changed their visibility from public to protected, as their purpose is to be called from
within :php:`TypoScriptFrontendController`.
* :php:`tempPageCacheContent()`
* :php:`realPageCacheContent()`
* :php:`setPageCacheContent()`
* :php:`clearPageCacheContent_pidList()`
* :php:`setSysLastChanged()`
* :php:`contentStrReplace()`
Impact
======
Calling any of the PHP methods will trigger a PHP :php:`E_USER_DEPRECATED` error, as well as accessing any of the
previously public properties.
Affected Installations
======================
Any TYPO3 installation with extensions directly calling one of the methods or using one of the
public properties.
Migration
=========
For :php:`TypoScriptFrontendController->ADMCMD_preview_BEUSER_uid` use the backend.user aspect of the Context API.
For :php:`TypoScriptFrontendController->workspacePreview` use the workspace aspect of the Context API.
For :php:`TypoScriptFrontendController->loginAllowedInBranch` use the method :php:`checkIfLoginAllowedInBranch()` instead.
.. index:: Frontend, FullyScanned, ext:frontend
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _deprecation-86068:
==========================================
Deprecation: #86068 - old condition syntax
==========================================
See :issue:`86068`
Description
===========
The Symfony expression language is available for TypoScript since :issue:`85829` has been merged.
Accordingly the classic TypoScript condition syntax has been marked as deprecated.
For detailed information about the new expression language see :doc:`#85829 <../9.4/Feature-85829-ImplementSymfonyExpressionLanguageForTypoScriptConditions>`.
Impact
======
Using the old condition syntax will trigger a PHP :php:`E_USER_DEPRECATED` error.
Also the combination of multiple condition blocks with :typoscript:`AND`, :typoscript:`OR`, :typoscript:`&&` and :typoscript:`||` has been
marked as deprecated and will trigger a PHP :php:`E_USER_DEPRECATED` error.
If it is not possible yet to fully migrate to Symfony expression language, the feature flag :php:`[SYS][features][TypoScript.strictSyntax]`
can be disabled via Settings -> Configure Installation-Wide Options or directly in :file:`LocalConfiguration.php`.
Affected Installations
======================
TYPO3 installations with extensions which define conditions using the old syntax or setups which
make use of the old condition syntax.
Migration
=========
The old conditions can be replaced with the new expression language.
.. index:: Backend, Frontend, TSConfig, TypoScript, NotScanned, ext:core
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _deprecation-86110:
===============================================
Deprecation: #86110 - FrontendEditingController
===============================================
See :issue:`86110`
Description
===========
The class :php:`\TYPO3\CMS\Core\FrontendEditing\FrontendEditingController` is not in use anymore, only feedit
instantiates the class for legacy reasons.
Also, property :php:`FrontendBackendUserAuthentication->frontendEdit` which holds an instance of
it, has been marked as deprecated.
Impact
======
The functionality of this class has been moved into ext:feedit.
If an instance needs access to frontend editing, it can be accessed from there.
Affected Installations
======================
Instances accessing the deprecated class or function will **NOT** trigger a PHP :php:`E_USER_DEPRECATED` error.
Migration
=========
Refer to ext:feedit for inspiration.
.. index:: PHP-API, FullyScanned, ext:feedit
@@ -0,0 +1,113 @@
.. include:: /Includes.rst.txt
.. _deprecation-86163:
========================================================
Deprecation: #86163 - TCA type="user" without renderType
========================================================
See :issue:`86163`
Description
===========
The following :php:`TCA` properties on :php:`type="user"` config types have been marked as deprecated and
should not be used any longer:
* :php:`userFunc`
* :php:`parameters`
* :php:`noTableWrapping`
Impact
======
This especially means that :php:`userFunc` should not be used any longer on :php:`TCA` fields
registered as config type :php:`user`. Those can be substituted with a custom :php:`renderType`
since TYPO3 v7. See example below for more details.
Affected Installations
======================
Instances are affected if an extension registers a :php:`type=user` :php:`TCA` config type with a
custom :php:`userFunc`. If a field uses the :php:`userFunc` property, a PHP :php:`E_USER_DEPRECATED`
error is triggered during rendering.
Migration
=========
:php:`userFunc` implementations can switch to use a custom :php:`renderType` as outlined
in the :ref:`FormEngine documentation <t3coreapi:FormEngine-Rendering-NodeFactory>`. The TYPO3 core
did that for example with the `is_public` field of table `sys_file_storge` in patch 58141_.
To switch from a :php:`userFunc` implementation to a :php:`renderType`, an extension typically has
to register an own element node in :file:`ext_localconf.php`. Then change the user function to a class
that extends :php:`AbstractFormElement` where method :php:`render()` returns an array as defined
in helper method :php:`initializeResultArray`. The `HTML` created by the former user function should be
returned in :php:`$resultArray['html']`, parameters like the `tableName` can be found in :php:`$this->data`.
Note the `renderType` variant can additionally load custom `JavaScript` and `CSS` using further parts of the
result array, typically :php:`requireJsModules` and :php:`stylesheetFiles`. Arguments to the element
can be defined by using any property within the `config` section, it is up to the specific `renderType` to
do this, using `parameters` as property key is probably a good idea, though.
As example, imagine a :php:`TCA` user element has been defined like this in the `columns` section::
'myMapElement' = [
'label' => 'My map element'
'config' => [
'type' => 'user',
'userFunc' => 'Vendor\Extension\Tca\UserFunc\MyMap->render',
'parameters' => [
'useOpenStreetMap' => true,
],
],
],
This should be adapted to a registered node element class::
// Register a node in ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['nodeRegistry'][<unix timestamp of "now">] = [
'nodeName' => 'customMapElement',
'priority' => 40,
'class' => \Vendor\Extension\Form\Element\CustomMapElement::class,
];
With a `TCA` registration like this to delegate the element rendering to the registered class::
'myMapElement' = [
'label' => 'My map element'
'config' => [
'type' => 'user',
'renderType' => 'customMapElement',
'parameters' => [
'useOpenStreetMap' => true,
],
],
],
And a class implementation that extends :php:`AbstractFormElement`::
<?php
declare(strict_types = 1);
namespace Vendor\Extension\Form\Element;
use TYPO3\CMS\Backend\Form\Element\AbstractFormElement;
class CustomMapElement extends AbstractFormElement
{
public function render()
{
// Custom TCA properties and other data can be found in $this->data, for example the above
// parameters are available in $this->data['parameterArray']['fieldConf']['config']['parameters']
$result = $this->initializeResultArray();
$result['html'] = 'my map content';
return $result;
}
}
.. _58141: https://review.typo3.org/#/c/58141/
.. index:: Backend, TCA, NotScanned
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _deprecation-86178:
============================================================
Deprecation: #86178 - Class ElementBrowserFramesetController
============================================================
See :issue:`86178`
Description
===========
Class :php:`TYPO3\CMS\Recordlist\Controller\ElementBrowserFramesetController` and the route
target of :php:`browser` have been marked as deprecated and should not be used any longer.
Impact
======
If calling that controller class a PHP :php:`E_USER_DEPRECATED` error is triggered.
Affected Installations
======================
The route target is unused in core for a while already. Extensions are only affected
if they call the Backend route target :php:`browser` that renders the element browser
in a frameset.
Migration
=========
Use the modal based element browser with the route :php:`wizard_element_browser` instead.
.. index:: Backend, PHP-API, NotScanned, ext:recordlist
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _deprecation-86179:
====================================================================
Deprecation: #86179 - Protected render() method in BackendController
====================================================================
See :issue:`86179`
Description
===========
Method :php:`TYPO3\CMS\Backend\Controller\BackendController->render()` has changed visibility
from public to protected and should not be called any longer.
Impact
======
Calling the method from an external object triggers a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
This internal method is usually not called by extensions directly. Since the method name
is so generic, the extension scanner is not configured to search for usages, it would
trigger far too many false positives.
Migration
=========
Use route target :php:`main` instead that calls method :php:`mainAction` and returns a
proper PSR-7 Response object.
.. index:: Backend, PHP-API, NotScanned
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _deprecation-86180:
================================================================
Deprecation: #86180 - Protected methods in SetupModuleController
================================================================
See :issue:`86180`
Description
===========
The following methods of class :php:`TYPO3\CMS\Setup\Controller\SetupModuleController`
changed their visibility from public to protected and should not be called any longer:
* [not scanned] :php:`main()`
* [not scanned] :php:`init()`
* :php:`storeIncomingData()`
Impact
======
Calling one of the above methods from an external object will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
These methods are usually called internally only, extensions should not be affected by this.
Migration
=========
Use the entry method :php:`mainAction()` that returns a PSR-7 response object.
.. index:: Backend, PHP-API, PartiallyScanned, ext:setup
@@ -0,0 +1,73 @@
.. include:: /Includes.rst.txt
.. _deprecation-86182:
====================================================
Deprecation: #86182 - Protected TaskModuleController
====================================================
See :issue:`86182`
Description
===========
Class :php:`TYPO3\CMS\Taskcenter\Controller\TaskModuleController` no longer inherits
:php:`TYPO3\CMS\Backend\Module\BaseScriptClass`.
Single task classes should no longer expect to have an instance of the :php:`TaskModuleController`
set as :php:`$GLOBALS['SOBE']`.
The following properties of class :php:`TYPO3\CMS\Taskcenter\Controller\TaskModuleController`
changed their visibility from public to protected and should not be called any longer:
* [not scanned] :php:`MCONF`
* [not scanned] :php:`id`
* [not scanned] :php:`MOD_MENU`
* [not scanned] :php:`modMenu_type`
* [not scanned] :php:`modMenu_setDefaultList`
* [not scanned] :php:`modMenu_dontValidateList`
* [not scanned] :php:`content`
* [not scanned] :php:`perms_clause`
* [not scanned] :php:`CMD`
* [not scanned] :php:`extClassConf`
* [not scanned] :php:`extObj`
The following properties of class :php:`TYPO3\CMS\Taskcenter\Controller\TaskModuleController`
changed their visibility from public to protected and should not be called any longer:
* [not scanned] :php:`menuConfig`
* [not scanned] :php:`mergeExternalItems`
* [not scanned] :php:`handleExternalFunctionValue`
* [not scanned] :php:`getExternalItemConfig`
* [not scanned] :php:`main`
* :php:`urlInIframe`
* [not scanned] :php:`extObjHeader`
* [not scanned] :php:`checkSubExtObj`
* [not scanned] :php:`checkExtObj`
* [not scanned] :php:`extObjContent`
* [not scanned] :php:`getExtObjContent`
Impact
======
Calling one of the above methods from an external object will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Most methods and properties are used internally in the :php:`TaskModuleController` only.
Instances with extensions delivering additional tasks for the
taskcenter may be affected.
Migration
=========
Single task should no longer rely on having an instance of :php:`TaskModuleController` set as
:php:`$GLOBALS['SOBE']`, an instance of the object is given as first constructor argument.
Properties and methods that have been set to protected should be calculated internally instead.
.. index:: Backend, PHP-API, PartiallyScanned, ext:taskcenter
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _deprecation-86184:
===========================================================
Deprecation: #86184 - Protected methods in ReportController
===========================================================
See :issue:`86184`
Description
===========
The following methods of class :php:`TYPO3\CMS\Reports\Controller\ReportController`
changed their visibility from public to protected and should not be called any longer:
* :php:`indexAction()`
* :php:`detailAction()`
Impact
======
Calling one of the above methods from an external object will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Both methods are called internally only. Extensions extending the reports module
using the normal reports API are not affected by this.
Migration
=========
No migration possible.
.. index:: Backend, PHP-API, NotScanned, ext:reports
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _deprecation-86192:
===================================================================
Deprecation: #86192 - Protected methods in ElementBrowserController
===================================================================
See :issue:`86192`
Description
===========
The following methods of class :php:`TYPO3\CMS\Recordlist\Controller\ElementBrowserController`
changed their visibility from public to protected and should not be called any longer:
* :php:`main()`
Impact
======
Calling the above method from an external object will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
The method is called internally only. Extensions are usually not affected by this.
Migration
=========
Use the entry method :php:`mainAction()` that returns a PSR-7 response object.
.. index:: Backend, PHP-API, NotScanned, ext:recordlist
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _deprecation-86193:
======================================================================
Deprecation: #86193 - Protect methods in AbstractLinkBrowserController
======================================================================
See :issue:`86193`
Description
===========
The following methods changed their visibility from public to protected and
should not be called any longer:
* :php:`TYPO3\CMS\Recordlist\Controller\AbstractLinkBrowserController->renderLinkAttributeFields()`
* :php:`TYPO3\CMS\Recordlist\Controller\AbstractLinkBrowserController->getDisplayedLinkHandlerId()`
* :php:`TYPO3\CMS\RteCKEditor\Controller\BrowseLinksController->renderLinkAttributeFields()`
* :php:`TYPO3\CMS\RteCKEditor\Controller\BrowseLinksController->getPageConfigLabel()`
* :php:`TYPO3\CMS\RteCKEditor\Controller\BrowseLinksController->getDisplayedLinkHandlerId()`
Impact
======
Calling one of the above methods from an external object will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
These link browser specific methods are usually not used by extensions externally. The extension
scanner will reveal possible usages.
Migration
=========
No migration possible.
.. index:: Backend, PHP-API, FullyScanned, ext:reports
@@ -0,0 +1,60 @@
.. include:: /Includes.rst.txt
.. _deprecation-86197:
==================================================
Deprecation: #86197 - Protected FileListController
==================================================
See :issue:`86197`
Description
===========
The following properties of class :php:`TYPO3\CMS\Filelist\Controller\FileListController` changed their visibility from public to protected and should not be called any longer:
* :php:`MOD_MENU`
* :php:`MOD_SETTINGS`
* :php:`doc`
* :php:`id`
* :php:`pointer`
* :php:`table`
* :php:`imagemode`
* :php:`cmd`
* :php:`filelist`
The following methods of class :php:`TYPO3\CMS\Filelist\Controller\FileListController` changed their visibility from public to protected and should not be called any longer:
* :php:`menuConfig()`
* :php:`initializeView()`
* :php:`initializeIndexAction()`
* :php:`indexAction()`
* :php:`missingFolderAction()`
* :php:`searchAction()`
Also, :php:`TYPO3\CMS\Beuser\Controller\BackendUserController->initializeView()` changed visibility from public to protected and should not be called any longer.
Additionally, first constructor argument :php:`$fileListController` of class
:php:`TYPO3\CMS\Filelist\FileList` is now optional, class property :php:`$fileListController`
should not be used any longer in hooks of that class.
Impact
======
Calling one of the above properties or methods from a third party object will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Controllers of the core are usually not called by extensions directly, but only through core routing and
dispatching mechanisms. Extensions are unlikely to be affected by this change.
Migration
=========
No migration possible.
.. index:: Backend, PHP-API, NotScanned, ext:filelist
@@ -0,0 +1,111 @@
.. include:: /Includes.rst.txt
.. _deprecation-86198:
====================================================
Deprecation: #86198 - Protected RecordListController
====================================================
See :issue:`86198`
Description
===========
The following properties of class :php:`TYPO3\CMS\Recordlist\Controller\RecordListController` changed their visibility from public
to protected and should not be called any longer:
* :php:`id`
* :php:`pointer`
* :php:`table`
* :php:`search_field`
* :php:`search_levels`
* :php:`showLimit`
* :php:`returnUrl`
* :php:`clear_cache`
* :php:`cmd`
* :php:`cmd_table`
* :php:`perms_clause`
* :php:`pageinfo`
* :php:`MOD_MENU`
* :php:`content`
* :php:`body`
* :php:`imagemode`
* :php:`doc`
The following methods of class :php:`TYPO3\CMS\Recordlist\Controller\RecordListController` changed their visibility from public
to protected and should not be called any longer:
* :php:`init()`
* :php:`menuConfig()`
* :php:`clearCache()`
* :php:`main()`
* :php:`getModuleTemplate()`
Additionally, the two hooks
* :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']`
changed their signature:
The second argument, an instance of the parent object :php:`RecordListController` will be removed in TYPO3 v10. Use the instance of the PSR-7
:php:`ServerRequestInterface` that is provided as array key :php:`request` of the first argument.
Furthermore, the assignment of an object instance of class :php:`RecordListController` as
:php:`GLOBALS['SOBE']` has been marked as deprecated and will not be set anymore in TYPO3 v10.
Impact
======
Calling one of the above methods or accessing above properties will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Instances are usually only affected if an extension registers a hook for
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['recordlist/Modules/Recordlist/index.php']['drawHeaderHook']` or
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['recordlist/Modules/Recordlist/index.php']['drawFooterHook']`. They will
work as before in TYPO3 v9, but using a property or calling a method of the provided parent object will trigger a PHP :php:`E_USER_DEPRECATED` error.
Migration
=========
Hooks registered should change their parent object usage and signature. An example can be found in the `sys_notes` extension
in class :php:`TYPO3\CMS\SysNote\Hook\RecordListHook`.
Code before::
/**
* Add sys_notes as additional content to the header of the list module
*
* @param array $params
* @param RecordListController $parentObject
* @return string
*/
public function renderInHeader(array $params = [], RecordListController $parentObject)
{
$controller = GeneralUtility::makeInstance(NoteController::class);
return $controller->listAction($parentObject->id, SysNoteRepository::SYS_NOTE_POSITION_TOP);
}
Adapted hook usage::
/**
* Add sys_notes as additional content to the header of the list module
*
* @param array $params
* @return string
*/
public function renderInHeader(array $params): string
{
/** @var ServerRequestInterface $request */
$request = $params['request'];
$id = (int)($request->getParsedBody()['id'] ?? $request->getQueryParams()['id'] ?? 0);
$controller = GeneralUtility::makeInstance(NoteController::class);
return $controller->listAction($id, SysNoteRepository::SYS_NOTE_POSITION_TOP);
}
.. index:: Backend, PHP-API, NotScanned, ext:recordlist
@@ -0,0 +1,114 @@
.. include:: /Includes.rst.txt
.. _deprecation-86207:
====================================================
Deprecation: #86207 - Protected tstemplate extension
====================================================
See :issue:`86207`
Description
===========
To allow refactoring of the Web -> Template module in TYPO3 v10, the involved controller classes
have been disentangled and better encapsulated:
* Class :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController`
does not extend :php:`TYPO3\CMS\Backend\Module\BaseScriptClass` anymore
* Class :php:`TYPO3\CMS\Tstemplate\Controller\TemplateAnalyzerModuleFunctionController`
does not extend :php:`TYPO3\CMS\Backend\Module\AbstractFunctionModule` anymore
* Class :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateConstantEditorModuleFunctionController`
does not extend :php:`TYPO3\CMS\Backend\Module\AbstractFunctionModule` anymore
* Class :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateInformationModuleFunctionController`
does not extend :php:`TYPO3\CMS\Backend\Module\AbstractFunctionModule` anymore
* Class :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateObjectBrowserModuleFunctionController`
does not extend :php:`TYPO3\CMS\Backend\Module\AbstractFunctionModule` anymore
Setting an instance of class :php:`TypoScriptTemplateModuleController` as global object :php:`$GLOBALS['SOBE']`
has been marked as deprecated and will be removed in TYPO3 v10.
The following class properties have been set from public to protected and will not be accessible in TYPO3 v10 anymore:
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->textExtensions`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->pageinfo`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->id`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->modTSconfig`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->content`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->extObj`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->access`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->perms_clause`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->extClassConf`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->edit`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->modMenu_type`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->MCONF`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->CMD`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateModuleController->sObj`
* :php:`TYPO3\CMS\Tstemplate\Controller\TemplateAnalyzerModuleFunctionController->pObj`
* :php:`TYPO3\CMS\Tstemplate\Controller\TemplateAnalyzerModuleFunctionController->function_key`
* :php:`TYPO3\CMS\Tstemplate\Controller\TemplateAnalyzerModuleFunctionController->extClassConf`
* :php:`TYPO3\CMS\Tstemplate\Controller\TemplateAnalyzerModuleFunctionController->localLangFile`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateConstantEditorModuleFunctionController->pObj`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateConstantEditorModuleFunctionController->function_key`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateConstantEditorModuleFunctionController->extClassConf`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateConstantEditorModuleFunctionController->localLangFile`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateInformationModuleFunctionController->pObj`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateInformationModuleFunctionController->function_key`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateInformationModuleFunctionController->extClassConf`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateInformationModuleFunctionController->localLangFile`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateInformationModuleFunctionController->tce_processed`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateObjectBrowserModuleFunctionController->pObj`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateObjectBrowserModuleFunctionController->function_key`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateObjectBrowserModuleFunctionController->extClassConf`
* :php:`TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateObjectBrowserModuleFunctionController->localLangFile`
The following class methods have been set from public to protected and will not be accessible in TYPO3 v10 anymore:
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->getExternalItemConfig()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->init()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->clearCache()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->main()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->setInPageArray()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->menuConfig()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->mergeExternalItems()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->handleExternalFunctionValue()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->checkExtObj()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->extObjContent()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->getExtObjContent()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->checkSubExtObj()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateModuleController->extObjHeader()`
* :php:`TYPO3CMSTstemplateControllerTemplateAnalyzerModuleFunctionControllerinitialize_editor()`
* :php:`TYPO3CMSTstemplateControllerTemplateAnalyzerModuleFunctionControllermodMenu()`
* :php:`TYPO3CMSTstemplateControllerTemplateAnalyzerModuleFunctionControllerhandleExternalFunctionValue()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateConstantEditorModuleFunctionControllerinitialize_editor()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateConstantEditorModuleFunctionControllerhandleExternalFunctionValue()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateInformationModuleFunctionControllerinitialize_editor()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateInformationModuleFunctionControllertableRowData()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateInformationModuleFunctionControllerhandleExternalFunctionValue()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateObjectBrowserModuleFunctionControllerinitialize_editor()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateObjectBrowserModuleFunctionControllermodMenu()`
* :php:`TYPO3CMSTstemplateControllerTypoScriptTemplateObjectBrowserModuleFunctionControllerhandleExternalFunctionValue()`
Impact
======
If an extension accesses one of the above protected properties or calls one of the above protected methods,
a :php:`E_USER_DEPRECATED` error will be triggered.
Affected Installations
======================
There are not many extensions that extend the `tstemplate` extension with own modules, it is relatively
unlikely that instances are affected by this.
Migration
=========
If extending the `tstemplate` module with an own extension, the extension should be adapted to not call
the above methods or properties any longer. Most usages can be easily adapted, for instance
to retrieve the current page id, use :php:`GeneralUtility::_GP('id')` instead of :php:`$this->pObj->id`.
.. index:: Backend, PHP-API, NotScanned, ext:tstemplate
@@ -0,0 +1,116 @@
.. include:: /Includes.rst.txt
.. _deprecation-86210:
==============================================
Deprecation: #86210 - Protected info extension
==============================================
See :issue:`86210`
Description
===========
To allow refactoring of the Web -> Info module in TYPO3 v10, the involved controller classes
have been disentangled and better encapsulated:
* Class :php:`TYPO3\CMS\Info\Controller\InfoModuleController`
does not extend :php:`TYPO3\CMS\Backend\Module\BaseScriptClass` anymore
* Class :php:`TYPO3\CMS\Linkvalidator\Report\LinkValidatorReport`
does not extend :php:`TYPO3\CMS\Backend\Module\AbstractFunctionModule` anymore
* Class :php:`TYPO3\CMS\Info\Controller\PageInformationController`
does not extend :php:`TYPO3\CMS\Backend\Module\AbstractFunctionModule` anymore
* Class :php:`TYPO3\CMS\Info\Controller\InfoPageTyposcriptConfigController`
does not extend :php:`TYPO3\CMS\Backend\Module\AbstractFunctionModule` anymore
* Class :php:`TYPO3\CMS\Info\Controller\TranslationStatusController`
does not extend :php:`TYPO3\CMS\Backend\Module\AbstractFunctionModule` anymore
Setting an instance of class :php:`InfoModuleController` as global object :php:`$GLOBALS['SOBE']`
has been marked as deprecated and will be removed in TYPO3 v10.
The following class properties have been set from public to protected and will not be accessible in TYPO3 v10 anymore:
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->perms_clause`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->modTSconfig`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->modMenu_setDefaultList`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->modMenu_dontValidateList`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->modMenu_type`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->extClassConf`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->extObj`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->content`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->pObj`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->id`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->CMD`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->doc`
* :php:`TYPO3\CMS\Info\Controller\InfoModuleController->MCONF`
* :php:`TYPO3\CMS\Linkvalidator\Report\LinkValidatorReport->pObj`
* :php:`TYPO3\CMS\Linkvalidator\Report\LinkValidatorReport->doc`
* :php:`TYPO3\CMS\Linkvalidator\Report\LinkValidatorReport->function_key`
* :php:`TYPO3\CMS\Linkvalidator\Report\LinkValidatorReport->extClassConf`
* :php:`TYPO3\CMS\Linkvalidator\Report\LinkValidatorReport->localLangFile`
* :php:`TYPO3\CMS\Linkvalidator\Report\LinkValidatorReport->extObj`
* :php:`TYPO3\CMS\Info\Controller\PageInformationController->pObj`
* :php:`TYPO3\CMS\Info\Controller\PageInformationController->function_key`
* :php:`TYPO3\CMS\Info\Controller\PageInformationController->extClassConf`
* :php:`TYPO3\CMS\Info\Controller\PageInformationController->localLangFile`
* :php:`TYPO3\CMS\Info\Controller\PageInformationController->extObj`
* :php:`TYPO3\CMS\Info\Controller\InfoPageTyposcriptConfigController->pObj`
* :php:`TYPO3\CMS\Info\Controller\InfoPageTyposcriptConfigController->function_key`
* :php:`TYPO3\CMS\Info\Controller\InfoPageTyposcriptConfigController->extClassConf`
* :php:`TYPO3\CMS\Info\Controller\InfoPageTyposcriptConfigController->localLangFile`
* :php:`TYPO3\CMS\Info\Controller\InfoPageTyposcriptConfigController->extObj`
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->pObj`
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->function_key`
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->extClassConf`
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->localLangFile`
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->extObj`
The following class methods have been set from public to protected and will not be accessible in TYPO3 v10 anymore:
* :php:`TYPO3CMSInfoControllerInfoModuleController->main()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->init()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->getModuleTemplate()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->menuConfig()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->handleExternalFunctionValue()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->mergeExternalItems()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->getExternalItemConfig()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->extObjContent()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->getExtObjContent()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->checkExtObj()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->extObjHeader()`
* :php:`TYPO3CMSInfoControllerInfoModuleController->checkSubExtObj()`
* :php:`TYPO3\CMS\Linkvalidator\Report\LinkValidatorReport->extObjContent()`
* :php:`TYPO3\CMS\Info\Controller\PageInformationController->modMenu()`
* :php:`TYPO3\CMS\Info\Controller\PageInformationController->extObjContent()`
* :php:`TYPO3\CMS\Info\Controller\InfoPageTyposcriptConfigController->modMenu()`
* :php:`TYPO3\CMS\Info\Controller\InfoPageTyposcriptConfigController->extObjContent()`
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->getContentElementCount()`
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->getLangStatus()`
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->renderL10nTable()`
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->modMenu()`
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->extObjContent()`
Impact
======
If an extension accesses one of the above protected properties or calls one of the above protected methods,
a :php:`E_USER_DEPRECATED` error will be triggered.
Affected Installations
======================
Various extensions extend the Web -> Info module. Those typically call
:php:`ExtensionManagementUtility::insertModuleFunction('web_info', ...)` in :file:`ext_tables.php` or
:file:`ext_localconf.php`. Those instances may need adaptions.
Migration
=========
If extending the `info` module with an own extension, the extension should be adapted to not call
the above methods or properties any longer. Most usages can be easily adapted, for instance
to retrieve the current page id, use :php:`GeneralUtility::_GP('id')` instead of :php:`$this->pObj->id`.
.. index:: Backend, PHP-API, NotScanned, ext:info
@@ -0,0 +1,53 @@
.. include:: /Includes.rst.txt
.. _deprecation-86225:
========================================================================
Deprecation: #86225 - Classes BaseScriptClass and AbstractFunctionModule
========================================================================
See :issue:`86225`
Description
===========
The two classes :php:`TYPO3\CMS\Backend\Module\BaseScriptClass`, also known as
:php:`t3lib_SCbase` and :php:`TYPO3\CMS\Backend\Module\AbstractFunctionModule`,
also known as :php:`t3lib_extobjbase` have been marked as deprecated and will be removed
in TYPO3 v10.
Impact
======
Using one of the classes will trigger a :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
The :php:`BaseScriptClass` has been commonly extended by extensions that add own
backend modules and did not rely on extbase for that. There is nothing wrong
with not using extbase, but most of the methods from :php:`BaseScriptClass`
were unused by own extensions and hard to understand, too.
Class :php:`AbstractFunctionModule` has been extended by some extensions that
add own sub modules to the Page -> Info or the Page -> Template view.
The extension scanner will find possible usages.
Migration
=========
A migration is often relatively simple: Extensions that extend :php:`BaseScriptClass`
should verify which methods and properties are actually used from the parent class. The
most simple solution is to just copy those over to the own class and remove the
inheritance. It is good practice to at least change their visibility from :php:`public`
to :php:`protected` at the same time if possible.
Extensions that extend :php:`AbstractFunctionModule` should do the same. The main `info`
and `tstemplate` controllers typically only call the methods :php:`init()` and :php:`main()`
of those classes as entry points, those need to be kept public.
.. index:: Backend, PHP-API, FullyScanned
@@ -0,0 +1,51 @@
.. include:: /Includes.rst.txt
.. _deprecation-86270:
==============================================================================
Deprecation: #86270 - config.tx_extbase.objects and plugin.tx_%plugin%.objects
==============================================================================
See :issue:`86270`
Description
===========
The :typoscript:`config.tx_extbase.objects` and :typoscript:`plugin.tx_%plugin%.objects` configuration options
have been marked as deprecated.
Impact
======
Configuring class overrides using :typoscript:`config.tx_extbase.objects` or :typoscript:`plugin.tx_%plugin%.objects`
will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
All installations that make use of the TypoScript :typoscript:`config.tx_extbase.objects` or :typoscript:`plugin.tx_%plugin%.objects`
configuration options are affected.
Migration
=========
Use XCLASSes configured in :file:`ext_localconf.php` using
:php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects']`.
Register implementations in the Extbase object container instead if you need to override classes
that are processed by the :php:`PropertyMapper` like domain models or if you rely on additional
injections:
.. code-block:: php
GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\Container\Container::class)
->registerImplementation(Base::class, Override::class);
If you conditionally configured :typoscript:`config.tx_extbase.objects` or
:typoscript:`plugin.tx_%plugin%.objects`, then move that conditional logic into the
overriding class itself.
.. index:: TypoScript, NotScanned, ext:extbase
@@ -0,0 +1,65 @@
.. include:: /Includes.rst.txt
.. _deprecation-86279:
==========================================================
Deprecation: #86279 - Various Hooks and PSR-15 Middlewares
==========================================================
See :issue:`86279`
Description
===========
The new PSR-15-based middleware concept allows for a more fine-grained "hooking" mechanism when enhancing the HTTP
Request or Response object.
The following hooks have therefore been marked as deprecated:
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['tslib_fe-PostProc']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['connectToDB']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['initFEuser']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkDataSubmission']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/index_ts.php']['preBeUser']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/index_ts.php']['postBeUser']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkAlternativeIdMethods-PostProc']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/index_ts.php']['preprocessRequest']`
On top, some middlewares have only been introduced in order to execute these hooks, or due to, and are marked for
internal use:
* :file:`typo3/cms-core/normalized-params-attribute`
* :file:`typo3/cms-backend/legacy-document-template`
* :file:`typo3/cms-backend/output-compression`
* :file:`typo3/cms-backend/response-headers`
* :file:`typo3/cms-frontend/timetracker`
* :file:`typo3/cms-frontend/preprocessing`
* :file:`typo3/cms-frontend/eid`
* :file:`typo3/cms-frontend/content-length-headers`
* :file:`typo3/cms-frontend/tsfe`
* :file:`typo3/cms-frontend/output-compression`
* :file:`typo3/cms-frontend/prepare-tsfe-rendering`
* :file:`typo3/cms-frontend/shortcut-and-mountpoint-redirect`
As these middlewares are marked as internal, it is recommended not to reference them directly, as these might get removed
in TYPO3 v10.
Impact
======
Making use of one of the hooks in an extension will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 instances with extensions using any of the hooks.
Migration
=========
Use a custom PSR-15 middleware instead.
.. index:: PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _deprecation-86288:
===============================================================
Deprecation: #86288 - FrontendBackendUserAuthentication methods
===============================================================
See :issue:`86288`
Description
===========
Due to refactorings within AdminPanel, EXT:feedit and via PSR-15 middlewares, the extension class
:php:`TYPO3\CMS\Backend\FrontendBackendUserAuthentication`, which is instantiated in Frontend
Requests as :php:`$GLOBALS['BE_USER']` has some unused methods which have been marked as deprecated:
* :php:`checkBackendAccessSettingsFromInitPhp()`
* :php:`extPageReadAccess()`
* :php:`extGetTreeList()`
* :php:`extGetLL()`
Impact
======
Calling any of the methods above will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with custom PHP code accessing any of the methods above.
Migration
=========
Use either methods from :php:`BackendUserAuthentication` directly, or - if in context of Admin Panel or
Frontend Editing - use the API methods within these modules directly, if necessary.
.. index:: PHP-API, Frontend, Backend, FullyScanned
@@ -0,0 +1,47 @@
.. include:: /Includes.rst.txt
.. _deprecation-86320:
=================================================================
Deprecation: #86320 - Mark internal $TSFE properties as protected
=================================================================
See :issue:`86320`
Description
===========
The following properties of class :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController` have changed their visibility to be protected from public and should not be called any longer.
The properties are only used and needed internally.
* :php:`loginAllowedInBranch_mode`
* :php:`cacheTimeOutDefault`
* :php:`cacheContentFlag`
* :php:`cacheExpires`
* :php:`isClientCachable`
* :php:`no_cacheBeforePageGen`
* :php:`tempContent`
* :php:`pagesTSconfig`
* :php:`uniqueCounter`
* :php:`uniqueString`
* :php:`lang`
Impact
======
Calling any of the properties will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation directly accessing any of the mentioned properties.
Migration
=========
Properties are only for internal use, no migration available.
.. index:: Frontend, FullyScanned, ext:frontend
@@ -0,0 +1,36 @@
.. include:: /Includes.rst.txt
.. _deprecation-86323:
=========================================================================
Deprecation: #86323 - Configuration key "site" in YAML site configuration
=========================================================================
See :issue:`86323`
Description
===========
The site configuration is a file called :file:`config` in a folder called :file:`sites` and does not need a ``site`` key
to identify its purpose. To keep writing the config as easy as possible, the site configuration moved one level up and
now resides directly in :file:`config.yaml`.
Impact
======
Having the site configuration below the key "site" has been marked as deprecated and will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Installations with a site config that have a key "site" are affected.
Migration
=========
Remove the "site" key and first level indentation either by directly editing the YAML file or by saving via the sites module.
.. index:: Backend, NotScanned, ext:core
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-86338:
===============================================================
Deprecation: #86338 - Change visibility of PageRepository->init
===============================================================
See :issue:`86338`
Description
===========
The method :php:`TYPO3\CMS\Frontend\Page\PageRepository::init()` is now called implicitly within the constructor.
Impact
======
Calling the method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with extensions directly calling :php:`TYPO3\CMS\Frontend\Page\PageRepository::init()`.
Migration
=========
Remove the method call. The constructor is taking care of calling the method.
.. index:: ext:frontend, NotScanned
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _deprecation-86353:
=============================================================
Deprecation: #86353 - CacheManager usage in ext_localconf.php
=============================================================
See :issue:`86353`
Description
===========
Usage of :php:`\TYPO3\CMS\Core\Cache\CacheManager->getCache()` during
:file:`ext_localconf.php` loading phase has been marked as deprecated.
Impact
======
Using :php:`\TYPO3\CMS\Core\Cache\CacheManager->getCache()` in
:file:`ext_localconf.php` will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
All installations with third party extensions that use
:php:`\TYPO3\CMS\Core\Cache\CacheManager->getCache()` in
:file:`ext_localconf.php`.
Migration
=========
Load caches on demand, when actually needed.
.. index:: PHP-API, NotScanned
@@ -0,0 +1,56 @@
.. include:: /Includes.rst.txt
.. _deprecation-86366:
===============================================
Deprecation: #86366 - Methods in AbstractUpdate
===============================================
See :issue:`86366`
Description
===========
To ease the update pain a compatibility layer for AbstractUpdate based
upgrade wizards has been implemented, that allows running "old" wizards
on CLI (enabling extension authors to support both TYPO3 v8 and TYPO3 v9 with one
wizard).
The following methods of class :php:`TYPO3\CMS\Install\Updates\AbstractUpdate` have been marked as deprecated and will be removed with TYPO3 v10:
* [not scanned] :php:`getTitle()`
* [not scanned] :php:`setTitle()`
* [not scanned] :php:`getIdentifier()`
* [not scanned] :php:`setIdentifier()`
* [not scanned] :php:`getDescription()`
* :php:`executeUpdate()`
* :php:`updateNecessary()`
* :php:`getPrerequisites()`
* :php:`setOutput()`
* :php:`shouldRenderWizard()`
* :php:`checkIfTableExists()`
* :php:`installExtensions()`
* :php:`markWizardAsDone()`
* :php:`isWizardDone()`
The class itself has also been marked as deprecated, construction will trigger a PHP :php:`E_USER_DEPRECATED` error.
Impact
======
Calling the mentioned methods through an extended class will trigger a PHP :php:`E_USER_DEPRECATED` error.
All UpdateWizards extending AbstractUpdate gained cli capability since :issue:`86076`.
Affected Installations
======================
Each instance with custom update wizards that extend AbstractUpdate.
Migration
=========
Use the interfaces instead the abstract class to define the capabilities of the Upgrade Wizard class.
See https://docs.typo3.org/typo3cms/extensions/core/latest/Changelog/9.4/Feature-86076-NewAPIForUpgradeWizards.html.
.. index:: Backend, CLI, PHP-API, PartiallyScanned, ext:install
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _deprecation-86389:
==============================================================================
Deprecation: #86389 - GeneralUtility::_GETset() and TSFE->mergingWithGetVars()
==============================================================================
See :issue:`86389`
Description
===========
Two methods related to setting global :php:`$_GET` parameters have been marked as deprecated:
* :php:`TYPO3\CMS\Core\Utility\GeneralUtility::_GETset()`
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->mergingWithGetVars()`
The two methods are wrappers to set the :php:`$_GET` properties, however, this concept has been superseded
by using the PSR-7 request object within PSR-15 middlewares to replace the variables.
Impact
======
Calling any of the two methods within PHP will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any installation making use of these methods within a TYPO3 extension, e.g. RealURL.
Migration
=========
Implement a custom PSR-15 middleware to update the PSR-7 request object, and to manually set :php:`$_GET` on top,
as long as TYPO3 still supports :php:`GeneralUtility::_GP()`, although these methods will vanish in the near future.
Relying on the request object, and using PSR-15 middlewares to manipulate request parameters is more future-proof
for extensions and TYPO3 sites.
.. index:: Frontend, PHP-API, FullyScanned
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _deprecation-86404:
==================================================
Deprecation: #86404 - $GLOBALS['TYPO3_LOADED_EXT']
==================================================
See :issue:`86404`
Description
===========
The global :php:`$GLOBALS['TYPO3_LOADED_EXT']` has been marked as deprecated in favor
of the :php:`PackageManager` API.
Impact
======
Accessing :php:`$GLOBALS['TYPO3_LOADED_EXT']` is discouraged.
Affected Installations
======================
Instances with extensions using :php:`$GLOBALS['TYPO3_LOADED_EXT']`.
Migration
=========
Use the :php:`getActivePackages()` method of
:php:`\TYPO3\CMS\Core\Package\PackageManager` to get a list of active
packages.
.. index:: PHP-API, FullyScanned
@@ -0,0 +1,68 @@
.. include:: /Includes.rst.txt
.. _deprecation-86406:
==========================================================================
Deprecation: #86406 - TCA type group internal_type file and file_reference
==========================================================================
See :issue:`86406`
Description
===========
The :php:`TCA` property values :php:`internal_type="file"` and :php:`internal_type="file_reference"`
for columns config :php:`type="group"` have been marked as deprecated.
A series of related methods have been marked as deprecated:
* :php:`TYPO3\CMS\Core\DataHandling\DataHandler->checkValue_group_select_file()`
* :php:`TYPO3\CMS\Core\DataHandling\DataHandler->copyRecord_procFilesRefs()`
* :php:`TYPO3\CMS\Core\DataHandling\DataHandler->extFileFields()`
* :php:`TYPO3\CMS\Core\DataHandling\DataHandler->extFileFunctions()`
* :php:`TYPO3\CMS\Core\Database\ReferenceIndex->getRelations_procFiles()`
* :php:`TYPO3\CMS\Core\Integrity\DatabaseIntegrityCheck->getFileFields()`
Some constants have bee marked as deprecated:
* :php:`TYPO3\CMS\Core\DataHandling\TableColumnSubType::FILE`
* :php:`TYPO3\CMS\Core\DataHandling\TableColumnSubType::FILE_REFERENCE`
The "internal_type" functionality has been superseded by the File Abstraction Layer (FAL) since TYPO3 6.0
and has several drawbacks within TYPO3 (e.g. multiple copies of files based on a file name, no flexibility
for moving data to a different storage, no metadata functionality, no cropping functionality).
Impact
======
The Backend module "Upgrade" > "Check TCA migrations" shows them as deprecated, and triggers a
:php:`E_USER_DEPRECATED` error.
Using the TCA property values mentioned above will trigger a PHP :php:`E_USER_DEPRECATED` error when the cache is cleared.
Affected Installations
======================
Installations still using the methods or constants, or TYPO3 installations with extensions registering custom
TCA fields with the mentioned TCA properties.
Migration
=========
It is rather unlikely instances use one of the above methods or constants. The extension scanner will find possible
usages, though.
It's more likely that extensions use :php:`type=group` with :php:`internal_type=file` or
:php:`internal_type=file_reference`. Those should switch to use FAL references based on
:php:`type=inline` instead.
The core code changed one last :php:`internal_type=file` usage in TYPO3 v9 and moved it to FAL. Several use-cases
within the last TYPO3 major versions show how to migrate a legacy file field to FAL (e.g. "fe_users.image"
or "tt_content.image" including automatic upgrade wizards for the database - an example of the last migration can be
found online_. These previous changes give some insight on how a file relation could be changed to FAL and comes
with an upgrade wizard that can be a helpful example if existing extension data needs to be migrated.
.. _online: https://review.typo3.org/#/c/54830/
.. index:: Backend, PHP-API, TCA, PartiallyScanned
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _deprecation-86411:
===========================================
Deprecation: #86411 - TSFE->makeCacheHash()
===========================================
See :issue:`86411`
Description
===========
The method :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->makeCacheHash()`
which acts for validating the `&cHash` GET parameter against other given GET parameters
has been marked as deprecated, as this functionality has been moved into a PSR-15 middleware.
Impact
======
Calling the method directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with extensions calling the PHP method directly.
Migration
=========
Ensure to use the PSR-15 middleware stack with the PageArgumentValidator in use to verify a
given cHash signature against given query parameters.
.. index:: Frontend, FullyScanned
@@ -0,0 +1,53 @@
.. include:: /Includes.rst.txt
.. _deprecation-86433:
=========================================================================================
Deprecation: #86433 - Various stdWrap functions and ContentObjectRenderer-related methods
=========================================================================================
See :issue:`86433`
Description
===========
The following TypoScript :typoscript:`stdWrap` sub-properties and functions have been marked as deprecated:
* :typoscript:`stdWrap.addParams`
* :typoscript:`stdWrap.filelist`
* :typoscript:`stdWrap.filelink`
In conjunction with the properties, the following methods of class :php:`TYPO3\CMS\Frontend\ContentObjectRenderer` have been marked as deprecated:
* :php:`stdWrap_addParams()`
* :php:`stdWrap_filelink()`
* :php:`stdWrap_filelist()`
* :php:`addParams()`
* :php:`filelink()`
* :php:`filelist()`
* :php:`typolinkWrap()`
* :php:`currentPageUrl()`
These functions were part of TYPO3 Core due to legacy functionality related
to ContentObject "TABLE" and "CSS Styled Content".
Impact
======
Calling any of the methods or using the properties will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom TypoScript options which have not been migrated to FAL
or Fluid Styled Content.
Migration
=========
Use Fluid Styled Content, or DataProcessors instead.
.. index:: Frontend, TypoScript, FullyScanned
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _deprecation-86438:
================================================
Deprecation: #86438 - PageRenderer->loadJQuery()
================================================
See :issue:`86438`
Description
===========
The method
:php:`TYPO3\CMS\Core\Page\PageRenderer->loadJQuery()`
and the constants
:php:`TYPO3\CMS\Core\Page\PageRenderer::JQUERY_VERSION_LATEST` and
:php:`TYPO3\CMS\Core\Page\PageRenderer::JQUERY_NAMESPACE_NONE` have been marked as deprecated.
Impact
======
Calling this method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom or third party extensions, which use the method.
Migration
=========
Use a package manager for frontend or custom jQuery files instead.
.. index:: Backend, Frontend, PHP-API, FullyScanned
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _deprecation-86439:
=============================================================================
Deprecation: #86439 - Mark several methods within TemplateService as internal
=============================================================================
See :issue:`86439`
Description
===========
The following methods in :php:`TYPO3\CMS\Core\TypoScript\TemplateService` have been marked as protected:
* :php:`prependStaticExtra()`
* :php:`versionOL()`
* :php:`processIncludes()`
* :php:`mergeConstantsFromPageTSconfig()`
* :php:`flattenSetup()`
* :php:`substituteConstants()`
Impact
======
Calling the methods in a public context will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom extensions working with the :php:`TemplateService` class.
Migration
=========
Avoid using the methods, and re-implement the functionality on your own, if necessary.
.. index:: Backend, FullyScanned, ext:core
@@ -0,0 +1,69 @@
.. include:: /Includes.rst.txt
.. _deprecation-86440:
==========================================================================
Deprecation: #86440 - Internal Methods and properties within RteHtmlParser
==========================================================================
See :issue:`86440`
Description
===========
Several methods and properties in class :php:`TYPO3\CMS\Core\Html\RteHtmlParser` have changed visibility
from public to protected.
Some additional functionality has been marked as deprecated, as this has been replaced with the new RTE configuration
since TYPO3 v8.
The following properties have changed visibility from public to protected and should not be called any longer:
* :php:`blockElementList`
* :php:`recPid`
* :php:`elRef`
* :php:`tsConfig`
* :php:`procOptions`
* :php:`TS_transform_db_safecounter`
* :php:`getKeepTags_cache`
* :php:`allowedClasses`
The following methods have changed visibility from public to protected and should not be called any longer:
* :php:`TS_images_db()`
* :php:`TS_links_db()`
* :php:`TS_transform_db()`
* :php:`TS_transform_rte()`
* :php:`HTMLcleaner_db()`
* :php:`getKeepTags()`
* :php:`divideIntoLines()`
* :php:`setDivTags()`
* :php:`getWHFromAttribs()`
* :php:`urlInfoForLinkTags()` (deprecated, not in use anymore)
* :php:`TS_AtagToAbs()`
The following processing options (`RTE.proc.`) have been marked as deprecated:
* :typoscript:`keepPDIVattribs`
* :typoscript:`dontRemoveUnknownTags_db`
Impact
======
Setting any of the options, calling the methods above or accessing the properties will trigger a
PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with extensions or custom usages for RTE handling (e.g. `l10nmgr`).
Migration
=========
Migrate to use the public API only and use other options (such as :typoscript:`allowAttributes` instead of
:typoscript:`dontRemoveUnknownTags_db`) in order to only run certain instructions on the RteHtmlParser object.
.. index:: RTE, FullyScanned, PHP-API
@@ -0,0 +1,48 @@
.. include:: /Includes.rst.txt
.. _deprecation-86441:
=====================================================================================
Deprecation: #86441 - Various methods and properties inside BackendUserAuthentication
=====================================================================================
See :issue:`86441`
Description
===========
Some minor changes have been made with :php:`TYPO3\CMS\Core\Authentication\BackendUserAuthentication` in order
to continue cleaning up the code.
The property :php:`checkWorkspaceCurrent_cache` has been marked as protected, as it is an internal cache.
The second argument of method :php:`modAccess()` has been marked as deprecated, as the method should not trigger runtime exceptions anymore.
The method :php:`isPSet()` has been marked as deprecated.
The following - mostly workspaces-related - methods have been marked as "internal":
* :php:`workspaceCannotEditOfflineVersion()`
* :php:`workspacePublishAccess()`
* :php:`workspaceSwapAccess()`
* :php:`workspaceCannotEditOfflineVersion()`
Impact
======
Calling the deprecated method or the protected property will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with enhanced workspace or permission functionality.
Migration
=========
Avoid using the methods, and re-implement the functionality on your own, if necessary.
.. index:: Frontend, FullyScanned, PHP-API
@@ -0,0 +1,59 @@
.. include:: /Includes.rst.txt
.. _deprecation-86461:
===============================================================================
Deprecation: #86461 - Mark various TypoScript parsing functionality as internal
===============================================================================
See :issue:`86461`
Description
===========
The following properties and methods of class :php:`TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser`
have changed visibility from public to protected as they are used for internal purpose:
* :php:`raw`
* :php:`rawP`
* :php:`lastComment`
* :php:`commentSet`
* :php:`multiLineEnabled`
* :php:`multiLineObject`
* :php:`multiLineValue`
* :php:`inBrace`
* :php:`lastConditionTrue`
* :php:`syntaxHighLight`
* :php:`highLightData`
* :php:`highLightData_bracelevel`
* :php:`highLightStyles`
* :php:`highLightBlockStyles`
* :php:`highLightBlockStyles_basecolor`
* :php:`nextDivider()`
* :php:`parseSub()`
* :php:`rollParseSub()`
* :php:`setVal()`
* :php:`error()`
* :php:`regHighLight()`
* :php:`syntaxHighlight_print()`
Impact
======
Calling any of the methods or accessing any of the properties will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom TypoScript Parsers or extensions which make use of internal
TypoScript parsings.
Migration
=========
Ensure to only use public entry-points of the TypoScript parsers.
.. index:: TypoScript, FullyScanned, PHP-API
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _deprecation-86466:
=================================================================
Deprecation: #86466 - AbstractUserAuthentication->fetchUserRecord
=================================================================
See :issue:`86466`
Description
===========
Method :php:`TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->fetchUserRecord()`
has been marked as deprecated.
Impact
======
Calling the method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
The methods has been called indirectly via
:php:`TYPO3\CMS\Core\Authentication\AbstractAuthenticationService->fetchUserRecord()` as
:php:`$this->pObj->fetchUserRecord()`. It has usually not been called directly through
custom authentication services. Instances are usually not affected by the change, the
extension scanner will find possible usages.
Migration
=========
If used within authentication services, use :php:`$this->fetchUserRecord()` instead, otherwise
copy the method around.
.. index:: PHP-API, FullyScanned
@@ -0,0 +1,36 @@
.. include:: /Includes.rst.txt
.. _deprecation-86486:
===================================================================
Deprecation: #86486 - TypoScriptFrontendController->processOutput()
===================================================================
See :issue:`86486`
Description
===========
The method :php:`TypoScriptFrontendController->processOutput()` has been
marked as deprecated.
Impact
======
Calling this method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with extensions that use the method.
Migration
=========
Use :php:`TypoScriptFrontendController->applyHttpHeadersToResponse()` and
:php:`TypoScriptFrontendController->processContentForOutput()` instead, if necessary.
.. index:: Frontend, PHP-API, FullyScanned
@@ -0,0 +1,36 @@
.. include:: /Includes.rst.txt
.. _feature-20051:
=============================================
Feature: #20051 - Support the "canonical" tag
=============================================
See :issue:`20051`
Description
===========
TYPO3 will finally provide built-in support for the :html:`<link rel="canonical" href="">` tag.
If the core extension "seo" is installed, it will automatically add the canonical link to the page.
The canonical link is basically the same absolute link as the link to the current hreflang and is meant
to indicate where the original source of the content is. It is a tool to prevent duplicate content
penalties.
In the page properties, the canonical link can be overwritten per language. The link wizard offers all
possibilities including external links and link handler configurations.
Should an empty href occur when generating the link to overwrite the canonical (this happens e.g. if the
selected page is not available in the current language), the fallback to the current hreflang will be activated
automatically. This ensures that there is no empty canonical.
Impact
======
If you have other SEO extensions installed that generate canonical links, you have to make sure only one creates it.
If both core and an extension are generating a canonical link, it will
result in 2 canonical links which might cause confusion for search engines.
.. index:: Backend, Database, Frontend, TCA, ext:seo
@@ -0,0 +1,63 @@
.. include:: /Includes.rst.txt
.. _feature-80398:
===============================================================
Feature: #80398 - utf8mb4 on mysql by default for new instances
===============================================================
See :issue:`80398`
Description
===========
New instances created by the TYPO3 installer now set `utf8mb4` as charset and `utf8mb4_unicode_ci`
collation by default for instances running on MySQL. This allows 4 byte unicode characters
like emojis in MySQL.
If upgrading instances, admins may change :file:`LocalConfiguration.php` to use this feature.
The core does not provide mechanisms to update the collation of existing tables
from `utf8_unicode_ci` to `utf8mb4_unicode_ci` for existing instances, though. Admins need
to manage that on their own if needed, the reports module shows an information if the
table schema uses mixed collations. This should be fixed after manually configuring
`utf8mb4` to avoid SQL errors when joining tables having different collations.
Also note that manually upgrading to `utf8mb4` may lead to index length issues: The maximum key
length on InnoDB tables is often 767 bytes and options to increase that have even been actively
removed, for instance in recent MariaDB versions.
A typical case is an index on a varchar(255) field: The DBMS assumes the worst case for the index
length, which is 3 bytes per character for a utf8 (utf8mb3), but 4 bytes for utf8mb4: With utf8,
the maximum index length is 3*255 + 1 = 766 bytes which fits into 767, but with utf8mb4, this
is 4*255 + 1 = 1021 bytes, which exceeds the maximum length and leads to SQL errors when setting
such an index.
This scenario gets more complex with combined indices and may need manual investigation when
upgrading an existing instance from `utf8` to `utf8mb4`. One solution is to restrict the
index length in ext_tables.sql of the affected extension: :php:`KEY myKey (myField(191))`, which
in this case leads to 4*191 + 1 = 764 bytes as maximum used length.
The basic settings to use `utf8mb4` in :file:`LocalConfiguration.php` are:
.. code-block:: php
'DB' => [
'Connections' => [
'Default' => [
'driver' => 'mysqli',
...
'charset' => 'utf8mb4',
'tableoptions' => [
'charset' => 'utf8mb4',
'collate' => 'utf8mb4_unicode_ci',
],
],
],
],
Impact
======
`utf8mb4` is an allowed charset and `utf8mb4_unicode_ci` is an allowed collation and
used by default for new instances running on MySQL.
.. index:: PHP-API, LocalConfiguration, Database
@@ -0,0 +1,83 @@
.. include:: /Includes.rst.txt
.. _feature-86160:
==============================================================
Feature: #86160 - PageTypeEnhancer for mapping &type parameter
==============================================================
See :issue:`86160`
Description
===========
A new Route Enhancer is added to the newly introduced Routing functionality which allows to add
a suffix to the existing route (including existing other enhancers) to map a page type (GET parameter &type=)
to a suffix.
It is now possible to map various page types to endings.
Example TypoScript:
.. code-block:: typoscript
page = PAGE
page.typeNum = 0
page.10 = TEXT
page.10.value = Default page
rssfeed = PAGE
rssfeed.typeNum = 13
rssfeed.10 < plugin.tx_myplugin
rssfeed.config.disableAllHeaderCode = 1
rssfeed.config.additionalHeaders.10.header = Content-Type: xml/rss
jsonview = PAGE
jsonview.typeNum = 26
jsonview.config.disableAllHeaderCode = 1
jsonview.config.additionalHeaders.10.header = Content-Type: application/json
jsonview.10 = USER
jsonview.10.userFunc = MyVendor\MyExtension\Controller\JsonPageController->renderAction
Now configure the Route Enhancer in your site's :file:`config.yaml` file like this:
.. code-block:: yaml
routeEnhancers:
PageTypeSuffix:
type: PageType
default: ''
map:
'rss.feed': 13
'.json': 26
The :yaml:`map` allows to add a filename or a file ending and map this to a :typoscript:`page.typeNum` value.
It is also possible to set :yaml:`default` to e.g. ".html" to add a ".html" suffix to all default pages.
.. code-block:: yaml
routeEnhancers:
PageTypeSuffix:
type: PageType
default: '.json'
index: 'index'
map:
'rss.feed': 13
'.json': 26
The :yaml:`index` property is used when generating links on root-level page, thus, instead of e.g. having
`/en/.json` thus would then result in `/en/index.json`.
Impact
======
The TYPO3 Frontend-internal `&type` parameter can now also be part of a human readable URL with a simple
line of configuration.
Please note that the implementation is a Decorator Enhancer, which means that the PageTypeEnhancer
is only there for adding suffixes to an existing route / variant, but not to substitute something
within the middle of a human readable URL segment.
.. index:: Frontend
@@ -0,0 +1,80 @@
.. include:: /Includes.rst.txt
.. _feature-86214:
=========================================
Feature: #86214 - Implement static routes
=========================================
See :issue:`86214`
Description
===========
The site configuration module now has configuration options to add static routes on a per site basis.
Take the following example: In a multi-site installation you want to have different :file:`robots.txt` files for each site that
should be reachable at ``/robots.txt`` on each site. You can now add a static route "robots.txt" to your site and
define which content should be delivered.
The TYPO3 SEO extension provides a sitemap for TYPO3 out of the box, but it's only reachable at a specific page type.
To enable easier access you can now configure a static route :file:`sitemap.xml` that maps to that page type (see example
below).
Routes can be configured as toplevel files (as in the :file:`sitemap.xml` and :file:`robots.txt` case) but may also be configured
to deeper route paths (`my/deep/path/to/a/static/text` for example). Matching is done on the full path but without any
parameters.
Impact
======
Static routes can be configured via the user interface or directly in the yaml configuration.
There are two options: deliver static text or resolve a TYPO3 URL.
StaticText
----------
The :yaml:`staticText` option allows to deliver simple text content. The text can be added through a text field directly in
the site configuration. This is suitable for files like :file:`robots.txt` or :file:`humans.txt`.
YAML Configuration Example:
.. code-block:: yaml
route: robots.txt
type: staticText
content: |
Sitemap: https://example.com/sitemap.xml
User-agent: *
Allow: /
Disallow: /forbidden/
TYPO3 URL (t3://)
-----------------
The type :yaml:`uri` for TYPO3 URL provides the option to render either a file, page or url. Internally a request to the
file or URL is done and its content delivered.
YAML Configuration Examples:
.. code-block:: yaml
-
route: sitemap.xml
type: uri
source: 't3://page?uid=1&type=1533906435'
-
route: favicon.ico
type: uri
source: 't3://file?uid=77'
Implementation
==============
Static route resolving is implemented as a PSR-15 middleware. If the route path requested matches any one of the
configured site routes, a response is directly generated and returned. This way there is minimal bootstrap code to
be executed on a static route resolving request, mainly the site configuration needs to be loaded. Static routes cannot
get parameters as the matching is done solely on the path level.
.. index:: Frontend, ext:frontend
@@ -0,0 +1,90 @@
.. include:: /Includes.rst.txt
.. _feature-86303:
==========================================
Feature: #86303 - Variants for site's base
==========================================
See :issue:`86303`
See :issue:`87831`
Description
===========
The site configuration allows to specify variants of the site's base.
Take the following example: The base of a site is set to `https://www.domain.tld` but the staging environment uses
`https://staging.domain.tld` and the local development uses `https://www.domain.local`.
The expression language feature is used to define which variant is taken into account.
Update since TYPO3 9.5.5:
This is also possible for site languages (however only via editing the respective `config.yaml` file
manually, not via the TYPO3 Backend yet). See example yaml file below.
Impact
======
The base of a site can be changed depending on a condition. Typical examples are:
- :typoscript:`applicationContext == "Production"`: Check the application context
- :typoscript:`getenv("mycontext") == "production`: Check a custom environment variable
This is an example where the default site has base variants, but also a translation (in this case German)
has a custom domain or sub-domain instead of a first part of the path segment of the URL.
.. code-block:: yaml
rootPageId: 1
base: 'https://www.example.com/'
baseVariants:
-
base: 'https://example.local/'
condition: 'applicationContext == "Development"'
-
base: 'https://staging.example.com/'
condition: 'applicationContext == "Production/Sydney"'
-
base: 'https://testing.example.com/'
condition: 'applicationContext == "Testing/Paris"'
languages:
-
title: 'Global'
enabled: true
languageId: '0'
base: /
typo3Language: default
locale: en_UK.UTF-8
iso-639-1: en
navigationTitle: English
hreflang: gb-en
direction: ''
flag: gb
-
title: 'DE'
enabled: true
languageId: '1'
base: https://example.de/'
baseVariants:
-
base: 'https://de.example.local/'
condition: 'applicationContext == "Development"'
-
base: 'https://staging.example.de/'
condition: 'applicationContext == "Production/Sydney"'
-
base: 'https://testing.example.de/'
condition: 'applicationContext == "Testing/Paris"'
typo3Language: de
locale: de_DE.UTF-8
iso-639-1: de
navigationTitle: Deutsch
hreflang: de-de
direction: ''
fallbackType: strict
flag: de
.. index:: Backend, Frontend, TypoScript, ext:core
@@ -0,0 +1,484 @@
.. include:: /Includes.rst.txt
.. _feature-86365:
===============================================
Feature: #86365 - Routing Enhancers and Aspects
===============================================
See :issue:`86365`
Description
===========
Page-based routing is now flexible by adding enhancers to routes that are generated or resolved with parameters, which
were previously appended as GET parameters.
An enhancer creates variants of a specific page-base route for a specific purpose (e.g. one plugin, one Extbase plugin)
and enhances the existing route path which can contain flexible values, so-called "placeholders".
On top, aspects can be registered to a specific enhancer to modify a specific placeholder, like static human readable names
within the route path, or dynamically generated.
To give you an overview of what the distinction is, we take a regular page which is available at
`https://www.example.com/path-to/my-page`
to access the Page with ID 13.
Enhancers are ways to extend this route with placeholders on top of this specific route to a page.
`https://www.example.com/path-to/my-page/products/{product-name}`
The suffix `/products/{product-name}` to the base route of the page is added by an enhancer. The placeholder variable
which is added by the curly braces can then be statically or dynamically resolved or built by an Aspect or more
commonly known a Mapper.
Enhancers and aspects are activated and configured in a site configuration, currently possible by modifying the
site's :file:`config.yaml` and adding the :yaml:`routeEnhancers` section manually, as there is no UI available for
this configuration. See examples below.
It is possible to use the same enhancers multiple times with different configurations, however, be aware that
it is not possible to combine multiple variants / enhancers that match multiple configurations.
However, custom enhancers can be built to overcome special use cases where e.g. two plugins with multiple parameters
each could be configured. Otherwise, the first variant that matches the URL parameters is used for generation and
resolving.
Enhancers
^^^^^^^^^
TYPO3 comes with the following enhancers out of the box:
- Simple Enhancer (enhancer type "Simple")
- Plugin Enhancer (enhancer type "Plugin")
- Extbase Plugin Enhancer (enhancer type "Extbase")
Custom enhancers can be registered by adding an entry to an extensions :file:`ext_localconf.php`.
:php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['enhancers']['CustomEnhancer'] = \MyVendor\MyPackage\Routing\CustomEnhancer::class;`
Within a configuration, an enhancer always evaluates the following properties:
* `type` - the short name of the enhancer as registered within :php:`$TYPO3_CONF_VARS`. This is mandatory.
* `limitToPages` - an array of page IDs where this enhancer should be called. This is **optional**. This property (array)
evaluates to only trigger an enhancer for specific pages. In case of special plugin pages it is
useful to only enhance pages with IDs, to speed up performance for building page routes of all other pages.
Simple Enhancer
---------------
The Simple Enhancer works with various route arguments to map them to an argument to be used later-on.
`index.php?id=13&category=241&tag=Benni`
results in
`https://www.example.com/path-to/my-page/show-by-category/241/Benni`
The configuration looks like this:
.. code-block:: yaml
routeEnhancers:
# Unique name for the enhancers, used internally for referencing
CategoryListing:
type: Simple
limitToPages: [13]
routePath: '/show-by-category/{category_id}/{tag}'
defaults:
tag: ''
requirements:
category_id: '[0-9]{1,3}'
tag: '[a-zA-Z0-9].*'
_arguments:
category_id: 'category'
The configuration option `routePath` defines the static keyword (previously known to some as "postVarSets" keyword for
some TYPO3 folks), and the available placeholders.
The `defaults` section defines which URL parameters are optional. If the parameters are omitted on generation, they
can receive a default value, and do not need a placeholder - it is also possible to add them at the very end of the
`routePath`.
The `requirements` section exactly specifies what kind of parameter should be added to that route as regular expression.
This way, it is configurable to only allow integer values for e.g. pagination. If the requirements are too loose, a
URL signature parameter ("cHash") is added to the end of the URL which cannot be removed.
The `_arguments` section defines what Route Parameters should be available to the system. In this example, the
placeholder is called `category_id` but the URL generation receives the argument `category`, so this is mapped to
this very name.
An enhancer is only there to replace a set of placeholders and fill in URL parameters or resolve them properly
later-on, but not to substitute the values with aliases, this can be achieved by Aspects.
Plugin Enhancer
---------------
The Plugin Enhancer works with plugins on a page that are commonly known as `Pi-Based Plugins`, where previously
the following GET/POST variables were used:
* `index.php?id=13&tx_felogin_pi1[forgot]=1` (form to request token)
* `index.php?id=13&tx_felogin_pi1[user]=82&tx_felogin_pi1[hash]=12345679%7CABCDEFGHIJKLMNOPQRSTUVWXYZ012345`
(form to actually recover password, `%7C` is URL-encoded pipe character `|`)
The base for the plugin enhancer is to configure a so-called "namespace", in this case `tx_felogin_pi1` - the plugin's
namespace.
The Plugin Enhancer explicitly sets exactly one additional variant for a specific use-case. In case of Frontend Login,
we would need to set up multiple configurations of Plugin Enhancer for forgot and recover passwords.
.. code-block:: yaml
routeEnhancers:
ForgotPasswordForm:
type: Plugin
limitToPages: [13]
routePath: '/forgot-password/{forgot}'
namespace: 'tx_felogin_pi1'
defaults:
forgot: '1'
requirements:
forgot: '1'
ForgotPasswordRecover:
type: Plugin
limitToPages: [13]
routePath: '/forgot-password/{user}/{forgothash}'
namespace: 'tx_felogin_pi1'
requirements:
user: '[0-9]{1,3}'
forgothash: '\d+\|[[:xdigit:]]{32}'
If URLs are generated with the given parameters to link to a page, the results will look like this:
* `https://www.example.com/path-to/my-page/forgot-password`
(for `index.php?id=13&tx_felogin_pi1[forgot]=1`)
* `https://www.example.com/path-to/my-page/forgot-password/82/12345679%7CABCDEFGHIJKLMNOPQRSTUVWXYZ012345`
(for `index.php?id=13&tx_felogin_pi1[user]=82&tx_felogin_pi1[hash]=12345679%7CABCDEFGHIJKLMNOPQRSTUVWXYZ012345`)
If the input given to generate the URL does not meet the requirements, the route enhancer does not offer the
variant and the parameters are added to the URL as regular query parameters. If e.g. the user parameter would be more
than three characters, or non-numeric, this enhancer would not match anymore.
As you see, the Plugin Enhancer is used to specify placeholders and requirements, with a given namespace.
If you want to replace the user ID (in this example "82") with the username, you would need an aspect that can be
registered within any enhancer, but see below for details on Aspects.
Extbase Plugin Enhancer
-----------------------
When creating extbase plugins, it is very common to have multiple controller/action combinations. The Extbase Plugin
Enhancer is therefore an extension to the regular Plugin Enhancer, providing the functionality that multiple variants
are generated, typically built on the amount of controller/action pairs.
The `namespace` option is omitted, as this is built with `extension` and `plugin` name.
The Extbase Plugin enhancer with the configuration below would now apply to the following URLs:
* `index.php?id=13&tx_news_pi1[controller]=News&tx_news_pi1[action]=list`
* `index.php?id=13&tx_news_pi1[controller]=News&tx_news_pi1[action]=list&tx_news_pi1[page]=5`
* `index.php?id=13&tx_news_pi1[controller]=News&tx_news_pi1[action]=detail&tx_news_pi1[news]=13`
* `index.php?id=13&tx_news_pi1[controller]=News&tx_news_pi1[action]=archive&tx_news_pi1[year]=2018&&tx_news_pi1[month]=8`
And generate the following URLs
* `https://www.example.com/path-to/my-page/list/`
* `https://www.example.com/path-to/my-page/list/5`
* `https://www.example.com/path-to/my-page/detail/13`
* `https://www.example.com/path-to/my-page/archive/2018/8`
.. code-block:: yaml
routeEnhancers:
NewsPlugin:
type: Extbase
limitToPages: [13]
extension: News
plugin: Pi1
routes:
- { routePath: '/list/{page}', _controller: 'News::list', _arguments: {'page': '@widget_0/currentPage'} }
- { routePath: '/tag/{tag_name}', _controller: 'News::list', _arguments: {'tag_name': 'overwriteDemand/tags'}}
- { routePath: '/detail/{news_title}', _controller: 'News::detail', _arguments: {'news_title': 'news'} }
- { routePath: '/archive/{year}/{month}', _controller: 'News::archive' }
defaultController: 'News::list'
defaults:
page: '1'
requirements:
page: '\d+'
In this example, you also see that the `_arguments` parameter can be used to bring them into sub properties of an array,
which is typically the case within demand objects for filtering functionality.
For the Extbase Plugin Enhancer, it is also possible to configure the namespace directly by skipping `extension`
and `plugin` properties and just using the `namespace` property as in the regular Plugin Enhancer.
Aspects
^^^^^^^
Now that we've looked into ways on how to extend a route to a page with arguments, and to put them into the URL
path as segments, the detailed logic within one placeholder is in an aspect. The most common practice of an aspect
is a so-called mapper. Map `{news_title}` which is a UID within TYPO3 to the actual news title, which is a field
within the database table.
An aspect can be a way to modify, beautify or map an argument from the URL generation into a placeholder. That's why
the terms "Mapper" and "Modifier" will pop up, depending on the different cases.
Aspects are registered within one single enhancer configuration with the option `aspects` and can be used with any
enhancer.
.. note::
Values in `defaults` and `requirements` always focus on corresponding internal raw values and not on
generated route values.
.. note::
`requirements` are ignored for route variables having a corresponding setting in `aspects`. Imagine there
would be an aspect that is mapping internal value `1` to route value `one` and vice verse - it is not possible
to explicitly define the `requirements` for this case - which is why `aspects` take precedence.
Let's start with some simpler examples first:
StaticValueMapper
-----------------
The StaticValueMapper replaces values simply on a 1:1 mapping list of an argument into a speaking segment, useful
for a checkout process to define the steps into "cart", "shipping", "billing", "overview" and "finish", or in a
simpler example to create human readable segments for all available months.
The configuration could look like this:
.. code-block:: yaml
routeEnhancers:
NewsArchive:
type: Extbase
limitToPages: [13]
extension: News
plugin: Pi1
routes:
- { routePath: '/{year}/{month}', _controller: 'News::archive' }
defaultController: 'News::list'
defaults:
month: ''
aspects:
month:
type: StaticValueMapper
map:
january: 1
february: 2
march: 3
april: 4
may: 5
june: 6
july: 7
august: 8
september: 9
october: 10
november: 11
december: 12
You'll see the placeholder "month" where the aspect replaces the value to a human readable url path segment.
It is possible to add an optional `localeMap` to that aspect to use the locale of a value to use in multi-language
setups.
.. code-block:: yaml
routeEnhancers:
NewsArchive:
type: Extbase
limitToPages: [13]
extension: News
plugin: Pi1
routes:
- { routePath: '/{year}/{month}', _controller: 'News::archive' }
defaultController: 'News::list'
defaults:
month: ''
aspects:
month:
type: StaticValueMapper
map:
january: 1
february: 2
march: 3
april: 4
may: 5
june: 6
july: 7
august: 8
september: 9
october: 10
november: 11
december: 12
localeMap:
- locale: 'de_.*'
map:
januar: 1
februar: 2
maerz: 3
april: 4
mai: 5
juni: 6
juli: 7
august: 8
september: 9
oktober: 10
november: 11
dezember: 12
LocaleModifier
--------------
The enhanced part of a route path could be `/archive/{year}/{month}` - however, in multi-language setups, it should be
possible to rename `/archive/` depending on the language that is given for this page translation. This modifier is a
good example where a route path is modified but is not affected by arguments.
The configuration could look like this:
.. code-block:: yaml
routeEnhancers:
NewsArchive:
type: Extbase
limitToPages: [13]
extension: News
plugin: Pi1
routes:
- { routePath: '/{localized_archive}/{year}/{month}', _controller: 'News::archive' }
defaultController: 'News::list'
aspects:
localized_archive:
type: LocaleModifier
default: 'archive'
localeMap:
- locale: 'fr_FR.*|fr_CA.*'
value: 'archives'
- locale: 'de_DE.*'
value: 'archiv'
You'll see the placeholder "localized_archive" where the aspect replaces the localized archive based on the locale of
the language of that page.
StaticRangeMapper
-----------------
A static range mapper allows to avoid the `cHash` and narrow down the available possibilities for a placeholder,
and to explicitly define a range for a value, which is recommended for all kinds of pagination functionality.
.. code-block:: yaml
routeEnhancers:
NewsPlugin:
type: Extbase
limitToPages: [13]
extension: News
plugin: Pi1
routes:
- { routePath: '/list/{page}', _controller: 'News::list', _arguments: {'page': '@widget_0/currentPage'} }
defaultController: 'News::list'
defaults:
page: '0'
requirements:
page: '\d+'
aspects:
page:
type: StaticRangeMapper
start: '1'
end: '100'
This limits down the pagination to max. 100 pages, if a user calls the news list with page 101, then the route enhancer
does not match and would not apply the placeholder.
PersistedAliasMapper
--------------------
If an extension ships with a slug field, or a different field used for the speaking URL path, this database field
can be used to build the URL:
.. code-block:: yaml
routeEnhancers:
NewsPlugin:
type: Extbase
limitToPages: [13]
extension: News
plugin: Pi1
routes:
- { routePath: '/detail/{news_title}', _controller: 'News::detail', _arguments: {'news_title': 'news'} }
defaultController: 'News::detail'
aspects:
news_title:
type: PersistedAliasMapper
tableName: 'tx_news_domain_model_news'
routeFieldName: 'path_segment'
routeValuePrefix: '/'
The PersistedAliasMapper looks up (via a so-called delegate pattern under the hood) to map the given value to a
a URL. The property `tableName` points to the database table, property `routeFieldName` is the field which will be
used within the route path for example.
The special `routeValuePrefix` is used for TCA type `slug` fields where the prefix `/` is within all fields of the
field names, which should be removed in the case above.
If a field is used for `routeFieldName` that is not prepared to be put into the route path, e.g. the news title field,
it still must be ensured that this is unique. On top, if there are special characters like spaces they will be
URL-encoded, to ensure a definitive value, a slug TCA field is recommended.
PersistedPatternMapper
----------------------
When a placeholder should be fetched from multiple fields of the database, the PersistedPatternMapper is for you.
It allows to combine various fields into one variable, ensuring a unique value by e.g. adding the UID to the field
without having the need of adding a custom slug field to the system.
.. code-block:: yaml
routeEnhancers:
Blog:
type: Extbase
limitToPages: [13]
extension: BlogExample
plugin: Pi1
routes:
- { routePath: '/blog/{blogpost}', _controller: 'Blog::detail', _arguments: {'blogpost': 'post'} }
defaultController: 'Blog::detail'
aspects:
blogpost:
type: PersistedPatternMapper
tableName: 'tx_blogexample_domain_model_post'
routeFieldPattern: '^(?P<title>.+)-(?P<uid>\d+)$'
routeFieldResult: '{title}-{uid}'
The `routeFieldPattern` option builds the title and uid fields from the database, the `routeFieldResult` shows
how the placeholder will be output.
Impact
======
Some notes to the implementation:
While accessing a page in TYPO3 in the Frontend, all arguments are currently built back into the global
GET parameters, but are also available as so-called `PageArguments` object, which is then used to be signed and verified
that they are valid, when handing them to process a frontend request further.
If there are dynamic parameters (= parameters which are not strictly limited), a verification GET parameter `cHash`
is added, which can and should not be removed from the URL. The concept of manually activating or deactivating
the generation of a `cHash` is not optional anymore, but strictly built-in to ensure proper URL handling. If you
really have the requirement to never have a cHash argument, ensure that all placeholders are having strict definitions
on what could be the result of the page segment (e.g. pagination), and feel free to build custom mappers.
Setting the TypoScript option `typolink.useCacheHash` is not necessary anymore when running with a site configuration.
Please note that Enhancers and Page-based routing is only available for pages that are built with a site configuration.
All existing APIs like `typolink` or functionality evaluate the new Page Routing API directly and come with route
enhancers.
Please note that if you update the Site configuration with enhancers that you need to clear all caches.
.. index:: Frontend, PHP-API
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _feature-86409:
============================================================================
Feature: #86409 - Allow usage of environment variables in site configuration
============================================================================
See :issue:`86409`
Description
===========
To enable environment variable based configuration the TYPO3 Core Yaml loader has been adjusted to
be able to resolve environment variables. Resolving of variables in the loader can be enabled or
disabled via flags. When editing the site configuration through the backend interface the resolving
of environment variables needs to be disabled to be able to add environment configuration through
the interface.
The format for environment variables is :yaml:`%env(ENV_NAME)%`. Environment variables may be used to replace
complete values or parts of a value.
Impact
======
In site configuration environment variables can be used. One common example would be the base url
that can now be configured via an environment variable.
Additionally, the Yaml Loader class has two new flags: :yaml:`PROCESS_PLACEHOLDERS` and :yaml:`PROCESS_IMPORTS`.
* :yaml:`PROCESS_PLACEHOLDERS` decides whether or not placeholders (`%abc%`) will be resolved.
* :yaml:`PROCESS_IMPORTS` decides whether or not imports (`imports` key) will be resolved.
Example usage in site configuration:
.. code-block:: yaml
base: 'https://%env(BASE_DOMAIN)%/'
.. index:: Backend, ext:core
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _feature-86422:
==================================================
Feature: #86422 - TypoScript getText property site
==================================================
See :issue:`86422`
Description
===========
Site configuration can now be accessed via the :typoscript:`getText` property in TypoScript.
Example:
.. code-block:: typoscript
page.10 = TEXT
page.10.data = site:base
page.10.wrap = This is your base URL: |
Where :typoscript:`site` is the keyword for accessing an aspect, and the following parts are the configuration key(s) to access.
.. code-block:: typoscript
data = site:customConfigKey.nested.value
Impact
======
Accessing site configuration is now possible in TypoScript, which enables to store site specific configuration options
in one central place and allows usage of that configuration from different contexts. While this sounds similar to using
TypoScript, with using site configuration this may also be used from backend or CLI context as long as the rootPageId
of the site is known. To avoid duplicating configuration options, TypoScript can now access these properties, too.
.. index:: PHP-API, ext:frontend
@@ -0,0 +1,46 @@
.. include:: /Includes.rst.txt
.. _feature-86457:
=======================================================
Feature: #86457 - TCA Type Slug adds a prepending slash
=======================================================
See :issue:`86457`
Description
===========
The new TCA type slug field now hard-codes a slash as a prefix for all pages, as this is
mandatory for URL resolving and ensuring a uniqueness within a site.
However, for slug types within regular records, it is not necessary to do so, therefore the slash
is never prepended on a "regular" slug field.
If - in some special cases - the "slug" field should contain a slash (due to e.g. nested categories
with human readable url path segments), a new option `prependSlash` is added to TCA type slug.
Impact
======
Third-party extensions using the slug field now receive a slug value without a slash, and
can use this as a regular - sanitized - slug field. It is however recommended to use the
`uniqueInPid` eval option to ensure uniqueness.
If a nested record structure is given, it is recommended to use the new option :php:`prependSlash`
by setting it to :php:`true`.
.. code-block:: php
'type' => 'slug',
'config' => [
'generatorOptions' => [
'fields' => ['title'],
]
'fallbackCharacter' => '-',
'prependSlash' => true,
'eval' => 'uniqueInPid'
]
.. index:: TCA
@@ -0,0 +1,27 @@
.. include:: /Includes.rst.txt
.. _feature-90115:
======================================================
Feature: #90115 - Add support for Kinyarwanda language
======================================================
See :issue:`90115`
Description
===========
Kinyarwanda - the Rwanda official language is now available to use in TYPO3 system-wide for
translation labels, giving full support for having a TYPO3 installation (Frontend and Backend)
working with Kinyarwanda out-of-the-box.
The ISO-639-1 language code "rw" is now added to TYPO3's default locales.
Impact
======
Kinyarwanda will be shown on the "Manage Language Packs" modal and also possible to select
in BE user preferences. It is possible to use the "kw" ISO-639-1 iso code in site languages
to use the labels in TYPO3 Frontend.
.. index:: Backend, ext:core
@@ -0,0 +1,232 @@
.. include:: /Includes.rst.txt
.. _important-82363:
================================================================================
Important: #82363 - Make Extbase translation handling consistent with TypoScript
================================================================================
See :issue:`82363`
Description
===========
Extbase now renders the translated records in the same way TypoScript rendering does.
The new behaviour is controlled by the Extbase feature switch :typoscript:`consistentTranslationOverlayHandling`.
.. code-block:: typoscript
config.tx_extbase.features.consistentTranslationOverlayHandling = 1
The new behaviour is enabled by default in TYPO3 v9. The feature switch will be removed in TYPO3 v10, so there will be just
one way of fetching records.
You can override the setting using normal TypoScript.
Impact
======
Users relying on the old behaviour can disable the feature switch.
The change modifies how Extbase interprets the TypoScript settings
:typoscript:`config.sys_language_mode` and :typoscript:`config.sys_language_overlay` and the
:php:`Typo3QuerySettings` properties :php:`languageOverlayMode` and :php:`languageMode`.
Changes in the rendering:
1) Setting :php:`Typo3QuerySettings->languageMode` does **not** influence how Extbase queries records anymore.
The corresponding TypoScript setting :typoscript:`config.sys_language_mode` is used by the core
to decide what to do when a page is not translated to the given language (display 404, or try page with different language).
Users who used to set :php:`Typo3QuerySettings->languageMode` to `strict` should use
:php:`Typo3QuerySettings->setLanguageOverlayMode('hideNonTranslated')` to get translated records only.
The old behavior was confusing, because `languageMode` had different meaning and accepted different
values in TS context and in Extbase context.
2) Setting :php:`Typo3QuerySettings->languageOverlayMode` to :php:`true` makes Extbase fetch records
from default language and overlay them with translated values. So e.g. when a record is hidden in
the default language, it will not be shown. Also records without translation parents will not be shown.
For relations, Extbase reads relations from a translated record (so its not possible to inherit
a field value from translation source) and then passes the related records through :php:`$pageRepository->getRecordOverlay()`.
So e.g. when you have a translated `tt_content` with FAL relation, Extbase will show only those
`sys_file_reference` records which are connected to the translated record (not caring whether some of
these files have `l10n_parent` set).
Previously :php:`Typo3QuerySettings->languageOverlayMode` had no effect.
Extbase always performed an overlay process on the result set.
3) Setting :php:`Typo3QuerySettings->languageOverlayMode` to :php:`false` makes Extbase fetch aggregate
root records from a given language only. Extbase will follow relations (child records) as they are,
without checking their `sys_language_uid` fields, and then it will pass these records through
:php:`$pageRepository->getRecordOverlay()`.
This way the aggregate root record's sorting and visibility doesn't depend on default language records.
Moreover, the relations of a record, which are often stored using default language uids,
are translated in the final result set (so overlay happens).
For example:
Given a translated `tt_content` having relation to 2 categories (in the mm table translated
tt_content record is connected to category uid in default language), and one of the categories is translated.
Extbase will return a `tt_content` model with both categories.
If you want to have just translated category shown, remove the relation in the translated `tt_content`
record in the TYPO3 Backend.
Note that by default :php:`Typo3QuerySettings` uses the global TypoScript configuration like
:typoscript:`config.sys_language_overlay` and :php:`$GLOBALS['TSFE']->sys_language_content`
(calculated based on :typoscript:`config.sys_language_uid` and :typoscript:`config.sys_language_mode`).
So you need to change :php:`Typo3QuerySettings` manually only if your Extbase code should
behave different than other `tt_content` rendering.
Setting :php:`setLanguageOverlayMode()` on a query influences **only** fetching of the aggregate root. Relations are always
fetched with :php:`setLanguageOverlayMode(true)`.
When querying data in translated language, and having :php:`setLanguageOverlayMode(true)`, the relations
(child objects) are overlaid even if aggregate root is not translated.
See :php:`QueryLocalizedDataTest->queryFirst5Posts()`.
Following examples show how to query data in Extbase in different scenarios, independent of the global TS settings:
1) Fetch records from the language uid=1 only, with no overlays.
Previously (:typoscript:`consistentTranslationOverlayHandling = 0`):
It was not possible.
Now (:typoscript:`consistentTranslationOverlayHandling = 1`):
.. code-block:: php
$querySettings = $query->getQuerySettings();
$querySettings->setLanguageUid(1);
$querySettings->setLanguageOverlayMode(false);
2) Fetch records from the language uid=1, with overlay, but hide non-translated records
Previously (:typoscript:`consistentTranslationOverlayHandling = 0`):
.. code-block:: php
$querySettings = $query->getQuerySettings();
$querySettings->setLanguageUid(1);
$querySettings->setLanguageMode('strict');
Now (:typoscript:`consistentTranslationOverlayHandling = 1`):
.. code-block:: php
$querySettings = $query->getQuerySettings();
$querySettings->setLanguageUid(1);
$querySettings->setLanguageOverlayMode('hideNonTranslated');
+------------------------+-------------------------------------------------------------------------------------------------+----------------------------------------------+------------------------------+
| QuerySettings property | old behaviour | new behaviour | default value (TSFE|Extbase) |
+========================+=================================================================================================+==============================================+==============================+
| languageUid | | same | 0 |
+------------------------+-------------------------------------------------------------------------------------------------+----------------------------------------------+------------------------------+
| respectSysLanguage | | same | `true` |
+------------------------+-------------------------------------------------------------------------------------------------+----------------------------------------------+------------------------------+
| languageOverlayMode | not used | values: `true`, `false`, `hideNonTranslated` | 0 | `true` |
| | | | |
+------------------------+-------------------------------------------------------------------------------------------------+----------------------------------------------+------------------------------+
| languageMode | documented values: `null`, `content_fallback`, `strict` or `ignore`. | not used | `null` |
| | Only `strict` was evaluated. Setting `LanguageMode` to `strict` | | |
| | caused passing `hideNonTranslated` param to `getRecordOverlay` in :php:`Typo3DbBackend` | | |
| | and changing the query to work similar to TypoScript `sys_language_overlay = hideNonTranslated` | | |
+------------------------+-------------------------------------------------------------------------------------------------+----------------------------------------------+------------------------------+
Identifiers
-----------
Domain models have a main identifier `uid` and two additional properties `_localizedUid` and `_versionedUid`.
Depending on whether the `languageOverlayMode` mode is enabled (`true` or `'hideNonTranslated'`) or disabled (`false`),
the identifier contains different values.
When `languageOverlayMode` is enabled then `uid` property contains `uid` value of the default language record,
the `uid` of the translated record is kept in the `_localizedUid`.
+----------------------------------------------------------+-------------------------+---------------------------+
| Context | Record in language 0 | Translated record |
+==========================================================+=========================+===========================+
| Database | uid:2 | uid:11, l10n_parent:2 |
+----------------------------------------------------------+-------------------------+---------------------------+
| Domain Object values with `languageOverlayMode` enabled | uid:2, _localizedUid:2 | uid:2, _localizedUid:11 |
+----------------------------------------------------------+-------------------------+---------------------------+
| Domain Object values with `languageOverlayMode` disabled | uid:2, _localizedUid:2 | uid:11, _localizedUid:11 |
+----------------------------------------------------------+-------------------------+---------------------------+
See tests in :file:`extbase/Tests/Functional/Persistence/QueryLocalizedDataTest.php`.
The :php:`$repository->findByUid()` (or :php:`$persistenceManager->getObjectByIdentifier()`) method takes current
rendering language into account (e.g. L=1). It does not take `defaultQuerySetting` set on the repository into account.
This method always performs an overlay.
Values in braces show previous behaviour (disabled flag) if different than current.
The bottom line is that with the feature flag on, you can now use :php:`findByUid()` using translated record uid to get
translated content independently from language set in global context.
+-------------------+----------------+----------------------+----------------------+----------------------+----------------------+
| | | L=0 | L=1 |
+-------------------+----------------+----------------------+----------------------+----------------------+----------------------+
| repository method | property | Overlay | No overlay | Overlay | No overlay |
+===================+================+======================+======================+======================+======================+
| findByUid(2) | title | Post 2 | Post 2 | Post 2 - DA | Post 2 - DA |
+-------------------+----------------+----------------------+----------------------+----------------------+----------------------+
| | uid | 2 | 2 | 2 | 2 |
+-------------------+----------------+----------------------+----------------------+----------------------+----------------------+
| | _localizedUid | 2 | 2 | 11 | 11 |
+-------------------+----------------+----------------------+----------------------+----------------------+----------------------+
| findByUid(11) | title | Post 2 - DA (Post 2) | Post 2 - DA (Post 2) | Post 2 - DA | Post 2 - DA |
+-------------------+----------------+----------------------+----------------------+----------------------+----------------------+
| | uid | 2 | 2 | 2 | 2 |
+-------------------+----------------+----------------------+----------------------+----------------------+----------------------+
| | _localizedUid | 11 (2) | 11 (2) | 11 | 11 |
+-------------------+----------------+----------------------+----------------------+----------------------+----------------------+
.. note::
Note that :php:`$repository->findByUid()` internally sets :php:`respectSysLanguage(false)` so it behaves differently
than a regular query by an `uid` like :php:`$query->matching($query->equals('uid', 11));`
The regular query will return :php:`null` if passed `uid` doesn't match
the language set in the :php:`$querySettings->setLanguageUid()` method.
Filtering & sorting
-------------------
When filtering by aggregate root property like `Post->title`,
both filtering and sorting takes translated values into account and you will get correct results, also with pagination.
When filtering or ordering by child object property, then Extbase does a left join between aggregate root
table and child record table.
Then the filter is applied as where clause. This means that filtering or ordering by child record property
only takes values from child records which uids are stored in db (in most cases its default language record).
See :php:`TranslationTest::fetchingTranslatedPostByBlogTitle()`
This limitation also applies to Extbase with feature flag being disabled.
Summary of the important code changes
=====================================
1) :php:`DataMapper` gets a :php:`Query` as a constructor parameter. This allows to use aggregate root :php:`QuerySettings` (language)
when fetching child records/relations. Later, in a separate patch we can pass other settings too e.g. :php:`setIgnoreEnableFields`
to fix issue around this setting. See :php:`DataMapper->getPreparedQuery` method.
2) :php:`DataMapper` is passed to :php:`LazyLoadingProxy` and :php:`LazyObjectStorage`, so the settings don't get lost when fetching data lazily.
3) :php:`Query` object gets a new property `parentQuery` which is useful to detect whether we're fetching aggregate root or child object.
4) Extbase model for :php:`FileReference` uses `_localizedUid` for fetching `OriginalResource`
5) :php:`DataMapper` forces child records to be fetched using :php:`setLanguageOverlayMode(true)`.
6) When getRespectSysLanguage is set, :php:`DataMapper` uses aggregate root language to overlay child records to correct language.
7) The `where` clause used for finding translated records in overlay mode (`true`, `hideNonTranslated`) has been fixed.
It filters out the non translated records on db side in case `hideNonTranslated` is set.
It allows for filtering and sorting by translated values. See :php:`Typo3DbQueryParser->getLanguageStatement()`
Most important known issues (this patch doesn't solve)
======================================================
- Persistence session uses the same key for default language record and the translation - https://forge.typo3.org/issues/59992
- Extbase allows to fetch deleted/hidden records - https://forge.typo3.org/issues/86307
For more information about rendering please refer to the TypoScript reference_.
.. _reference: https://docs.typo3.org/typo3cms/TyposcriptReference/Setup/Config/Index.html?highlight=sys_language_mode#sys-language-overlay
.. index:: Database, TCA, TypoScript, ext:extbase
@@ -0,0 +1,20 @@
.. include:: /Includes.rst.txt
.. _important-85560:
==================================================
Important: #85560 - Location of XLF labels changed
==================================================
See :issue:`85560`
Description
===========
Downloaded files for XLF language files are usually stored within :file:`typo3conf/l10n`. When the environment
variable `TYPO3_PATH_ROOT` is set, which is common for all composer-based installations, the XLF language files
are now found outside the document root, available under :file:`var/labels/`.
The Environment API :php:`Environment::getLabelsPath()` resolves the correct full location path prefix.
.. index:: PHP-API
@@ -0,0 +1,27 @@
.. include:: /Includes.rst.txt
.. _important-86173:
=============================================================================
Important: #86173 - Location of supplied .htaccess / web.config files changed
=============================================================================
See :issue:`86173`
Description
===========
The location of the former out-of-the-box supplied `_.htaccess` and `_web.config` have been changed and are created
automatically during the TYPO3 installation process.
New location of file templates
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
During a new installation, the files are created automatically. However, there might be situations, where you need
one of the files (e.g. after switching the webserver or for testing purposes). The files can now be found under the
following paths:
* :file:`typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/root-htaccess` (Apache)
* :file:`typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/root-web-config` (IIS)
.. index:: ext:install
+52
View File
@@ -0,0 +1,52 @@
:template: changelogOverview.html
.. include:: /Includes.rst.txt
.. _changelog-9-5:
9.5 Changes
===========
**Table of contents**
.. contents::
:local:
:depth: 1
Breaking Changes
^^^^^^^^^^^^^^^^
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Breaking-*
Features
^^^^^^^^
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Feature-*
Deprecation
^^^^^^^^^^^
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Deprecation-*
Important
^^^^^^^^^
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Important-*