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,63 @@
.. include:: /Includes.rst.txt
.. _deprecation-88787:
=================================================
Deprecation: #88787 - BackendUtility::editOnClick
=================================================
See :issue:`88787`
Description
===========
The method :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::editOnClick()`
used to generate JavaScript `onclick` targets to
:php:`\TYPO3\CMS\Backend\Controller\EditDocumentController` has been marked as deprecated.
Impact
======
Using this method will trigger PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
All installations with extensions using :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::editOnClick()` are affected.
Migration
=========
Migrate the method to use the :php:`\TYPO3\CMS\Backend\Routing\UriBuilder` API and attach the parameters manually.
Example:
.. code-block:: php
// Previous
$old = BackendUtility::editOnClick($params);
// Migrated
$uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
// Variant 1
$params = '&edit[pages][' . $pid . ']=new&returnNewPageId=1';
$migrated = $uriBuilder->buildUriFromRoute('record_edit') . $params
. '&returnUrl=' . rawurlencode(GeneralUtility::getIndpEnv('REQUEST_URI'));
// Variant 2
$params = [
'edit' => [
'pages' => [
$pid => 'new',
],
],
'returnNewPageId' => 1,
'returnUrl' => GeneralUtility::getIndpEnv('REQUEST_URI'),
];
$migrated = (string)$uriBuilder->buildUriFromRoute('record_edit', params);
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,43 @@
.. include:: /Includes.rst.txt
.. _deprecation-88839:
===================================================
Deprecation: #88839 - CLI lowlevel request handlers
===================================================
See :issue:`88839`
Description
===========
The interface :php:`\TYPO3\CMS\Core\Console\RequestHandlerInterface`
and the class :php:`\TYPO3\CMS\Core\Console\CommandRequestHandler` have been introduced in TYPO3 v7 to streamline
various entry points for CLI-related functionality. Back then, there were Extbase command requests and
`CommandLineController` entry points.
With TYPO3 v10, the only way to handle CLI commands is via the :php:`\TYPO3\CMS\Core\Console\CommandApplication` class which is
a wrapper around Symfony Console. All logic is now located in the Application, and thus, the interface and
the class have been marked as deprecated.
Impact
======
When instantiating the CLI :php:`\TYPO3\CMS\Core\Console\RequestHandler` class,
a PHP :php:`E_USER_DEPRECATED` error will be triggered.
Affected Installations
======================
Any TYPO3 installation having custom CLI request handlers wrapped via the interface or extending the
CLI request handler class.
Migration
=========
Switch to a Symfony Command or provide a custom CLI entry point.
.. index:: CLI, PHP-API, FullyScanned, ext:core
@@ -0,0 +1,46 @@
.. include:: /Includes.rst.txt
.. _deprecation-88850:
============================================================
Deprecation: #88850 - ContentObjectRenderer::sendNotifyEmail
============================================================
See :issue:`88850`
Description
===========
The method :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::sendNotifyEmail()`
which has been used to send mails has been marked as deprecated.
Impact
======
Using this method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
All 3rd party extensions calling
:php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::sendNotifyEmail()` are affected.
Migration
=========
To send a mail, use the :php:`\TYPO3\CMS\Core\Mail\MailMessage`-API
.. code-block:: php
$email = GeneralUtility::makeInstance(MailMessage::class)
->to(new Address('katy@domain.tld'), new Address('john@domain.tld', 'John Doe'))
->subject('This is an example email')
->text('This is the plain-text variant')
->html('<h4>Hello John.</h4><p>Enjoy a HTML-readable email. <marquee>We love TYPO3</marquee>.</p>');
$email->send();
.. index:: PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,35 @@
.. include:: /Includes.rst.txt
.. _deprecation-88854:
=======================================================
Deprecation: #88854 - jumpExt() of RecordListController
=======================================================
See :issue:`88854`
Description
===========
The JavaScript function :js:`jumpExt()` used to modify URLs by attaching `returnUrl` and `anchors`
arguments have been marked as deprecated.
Impact
======
Calling :js:`jumpExt()` will trigger a deprecation warning in the browser console.
Affected Installations
======================
All third party extensions using :js:`jumpExt()` are affected.
Migration
=========
It is only possible to call this function via hooks. To migrate this call, append a `returnUrl` argument to the URL if
required and move the URL to the :html:`href` argument of the button the function was attached to.
.. index:: Backend, JavaScript, PHP-API, NotScanned, ext:backend
@@ -0,0 +1,45 @@
.. include:: /Includes.rst.txt
.. _deprecation-88854-1668719172:
======================================
Deprecation: #88854 - T3_THIS_LOCATION
======================================
See :issue:`88854`
Description
===========
The global JavaScript variable :js:`T3_THIS_LOCATION` containing the URL to the current document (if not modified) has
been marked as deprecated.
Impact
======
Since this is a global JavaScript variable, no proper deprecation layer applies and thus no deprecation notice is rendered.
Some PHP API uses :js:`T3_THIS_LOCATION`
(e.g. :php:`\TYPO3\CMS\Backend\Utility\BackendUtility::getLinkToDataHandlerAction()` with second argument being `-1`)
which has been marked as deprecated as well.
Affected Installations
======================
All third party extensions using :js:`T3_THIS_LOCATION` are affected.
Migration
=========
When generating URLs containing a `returnUrl` (a common use-case for :js:`T3_THIS_LOCATION`),
consider using either :php:`rawurldecode(GeneralUtility::getIndpEnv('REQUEST_URI'))`
or :php:`normalizedParams` in the PSR-7 ServerRequest object:
:php:`$request->getAttribute('normalizedParams')->getRequestUri()`.
In general, :js:`onclick` handlers doing a redirect are considered bad practice.
Use HTML's :html:`href` attribute and attach custom click handlers, if necessary.
.. index:: Backend, JavaScript, PHP-API, NotScanned, ext:backend
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _deprecation-88862:
===================================
Deprecation: #88862 - T3_RETURN_URL
===================================
See :issue:`88862`
Description
===========
The JavaScript variable :js:`T3_RETURN_URL` holding the returnUrl sent with the current request either via `GET` or
`POST` has been marked as deprecated.
Impact
======
Since this is a global JavaScript variable, no proper deprecation layer applies and thus no deprecation notice is
rendered.
Affected Installations
======================
All third party extensions using :js:`T3_RETURN_URL` are affected.
Migration
=========
Get the submitted returnUrl by using PHP:
.. code-block:: php
// Variant 1
$returnUrl = GeneralUtility::sanitizeLocalUrl(GeneralUtility::_GP('returnUrl'));
// Variant 2
$returnUrl = $request->getParsedBody()['returnUrl'] ?? $request->getQueryParams()['returnUrl'] ?? '';
.. index:: Backend, JavaScript, NotScanned, ext:backend
@@ -0,0 +1,57 @@
.. include:: /Includes.rst.txt
.. _deprecation-88995:
=============================================================
Deprecation: #88995 - Calling registerPlugin with vendor name
=============================================================
See :issue:`88995`
Description
===========
The first parameter :php:`$extensionName` of method :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin`
used to contain the vendor name in the past.
.. code-block:: php
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'TYPO3.CMS.Form',
'Formframework',
'Form',
'content-form',
);
As the vendor name does not have any effect at all, it's usage has been marked as deprecated.
Impact
======
Calling :php:`registerPlugin()` with first parameter containing dots (considered to be the full vendor) name will trigger a PHP :php:`E_USER_DEPRECATED` error.
As of TYPO3 v11 using the vendor name along with the extension name will lead to a wrong registration of plugins.
Affected Installations
======================
All installations that add the vendor name to the first parameter :php:`$extensionName`
of method :php:`\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin()` are affected.
Migration
=========
Just use the extension name like in this example.
.. code-block:: php
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Form',
'Formframework',
'Form',
'content-form',
);
.. index:: PHP-API, NotScanned, ext:extbase
@@ -0,0 +1,51 @@
.. include:: /Includes.rst.txt
.. _deprecation-89001:
=====================================================
Deprecation: #89001 - Internal public TSFE properties
=====================================================
See :issue:`89001`
Description
===========
The following properties of the :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController` class have been marked as deprecated:
* :php:`cHash_array`
* :php:`cHash`
* :php:`domainStartPage`
The properties are now built into proper arguments of the PHP objects
:php:`\TYPO3\CMS\Core\Site\Entity\Site`
and :php:`\TYPO3\CMS\Core\Routing\PageArguments`.
This follows the pattern of not accessing these properties through
the global :php:`TSFE` object directly anymore.
Impact
======
Accessing these properties directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom extensions or TypoScript directly
accessing these properties.
Migration
=========
Use the properties of :php:`Site` and :php:`PageArguments` instead:
* :php:`\TYPO3\CMS\Core\Site\Entity\Site->getRootPageId()` (e.g. via :php:`$request->getAttribute('site')`)
* :php:`\TYPO3\CMS\Core\Routing\PageArguments->getArguments()['cHash']` (e.g. via :php:`$request->getAttribute('routing')`)
Please note that accessing these variables should be avoided via the :php:`TSFE` context.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,35 @@
.. include:: /Includes.rst.txt
.. _deprecation-89033:
===============================
Deprecation: #89033 - jumpToUrl
===============================
See :issue:`89033`
Description
===========
The JavaScript function :js:`jumpToUrl()` which is widely used in TYPO3 has been marked as deprecated.
Impact
======
Calling :js:`jumpToUrl()` will cause a deprecation entry in the browser's console.
Affected Installations
======================
Extensions using :js:`jumpToUrl()` implementation are affected.
Migration
=========
Since :js:`jumpToUrl()` triggers a redirect only, it's safe to either use :js:`window.location.href = 'link/to/my/module';`
or use the link in combination with plain HTML as in :html:`<a href="link/to/my/module">my link</a>`.
.. index:: Backend, JavaScript, NotScanned, ext:backend
@@ -0,0 +1,33 @@
.. include:: /Includes.rst.txt
.. _deprecation-89037:
===================================================
Deprecation: #89037 - Deprecated LocallangXmlParser
===================================================
See :issue:`89037`
Description
===========
The :php:`\TYPO3\CMS\Core\Localization\Parser\LocallangXmlParser` has been used to parse localization files based on the custom ll-XML format ("ll" refers to "locallang").
Since TYPO3 version 4.6 XLIFF is being used and therefore the previous support for locallang-XML files has been marked as deprecated.
Impact
======
Calling :php:`\TYPO3\CMS\Core\Localization\Parser\LocallangXmlParser` or using locallang-XML files will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
All installations using extensions using ll-XML localization files.
Migration
=========
Migrate all XML files to the XLIFF standard.
.. index:: Backend, Frontend, FullyScanned, ext:core
@@ -0,0 +1,55 @@
.. include:: /Includes.rst.txt
.. _deprecation-89127:
====================================================
Deprecation: #89127 - Cleanup RecordHistory handling
====================================================
See :issue:`89127`
Description
===========
The following properties of the :php:`\TYPO3\CMS\Backend\History\RecordHistory` class have been marked as deprecated:
* :php:`changeLog`
* :php:`lastHistoryEntry`
The properties are now protected and have a public getter function.
The following public methods of the :php:`\TYPO3\CMS\Backend\History\RecordHistory` class have changed visibility from public to protected:
* :php:`getHistoryEntry()`
* :php:`getHistoryData()`
The following methods of the :php:`\TYPO3\CMS\Backend\History\RecordHistory` class have been marked as deprecated:
* :php:`createChangeLog()`, use :php:`getChangeLog()` instead
* :php:`shouldPerformRollback()`
* :php:`getElementData()`, use :php:`getElementInformation()` instead
* :php:`performRollback()`, use :php:`RecordHistoryRollback::performRollback()` instead
* :php:`createMultipleDiff()`, use :php:`getDiff()` instead
* :php:`setLastHistoryEntry()`, use :php:`setLastHistoryEntryNumber()` instead
Impact
======
Accessing these properties and methods directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom extensions or TypoScript directly
accessing these properties and methods.
Migration
=========
Use the mentioned alternative methods and new classes.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,66 @@
.. include:: /Includes.rst.txt
.. _deprecation-89215:
======================================
Deprecation: #89215 - jQuery.clearable
======================================
See :issue:`89215`
Description
===========
The jQuery plugin :js:`jquery.clearable` that provides a button to clear an input field has been marked as deprecated.
Impact
======
Using :js:`jquery.clearable` will trigger a deprecation warning in the browser's console.
Affected Installations
======================
All 3rd party extensions using :js:`jquery.clearable` are affected.
Migration
=========
Import the module :js:`TYPO3/CMS/Backend/Input/Clearable` and use the method :js:`clearable()` on a native :js:`HTMLInputElement`.
Example code:
.. code-block:: js
require(['TYPO3/CMS/Backend/Input/Clearable'], function() {
const inputField = document.querySelector('#some-input');
if (inputField !== null) {
inputField.clearable();
}
const clearables = Array.from(document.querySelectorAll('.t3js-clearable')).filter(inputElement => {
// Filter input fields being a date time picker and a color picker
return !inputElement.classList.contains('t3js-datetimepicker') && !inputElement.classList.contains('t3js-color-picker');
});
clearables.forEach(clearableField => clearableField.clearable());
});
The method also accepts an :js:`options` object, allowing to set a :js:`onClear` callback. The callback receives the input field as an argument the clearing was applied to.
Example code:
.. code-block:: js
const inputField = document.querySelector('#some-input');
if (inputField !== null) {
inputField.clearable({
onClear: function (input) {
input.closest('form').submit();
}
});
}
.. index:: Backend, JavaScript, NotScanned, ext:backend
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _feature-78488:
========================================================
Feature: #78488 - Add rel="noreferrer" to external links
========================================================
See :issue:`78488`
Description
===========
All links processed by :typoscript:`typolink` with external links opening in a new window have been extended to contain
:html:`rel="noreferrer"`.
Links opening in a new window are defined as those having an attribute :html:`target` which is either not empty,
:html:`_self`, :html:`_top` or :html:`_parent`.
.. note::
Initially this feature added :html:`rel="noopener noreferrer`. However :html:`noreferrer` also
implies the property :html:`noopener`. Therefore, the latter was removed.
Impact
======
This property improves the security of the site:
:html:`noreferrer`
This property prevents the browser, when navigating to another page, to send the page address, or any other value,
as referrer in according HTTP header. :html:`noreferrer` also implies the property :html:`noopener`, which instructs
the browser to open the link without granting the new browsing context access to the document that opened it.
.. index:: Frontend
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _feature-84250:
============================================================================================
Feature: #84250 - Separately enable / disable "Add media by URL" and "Select & upload files"
============================================================================================
See :issue:`84250`
Description
===========
A new appearance property "fileByUrlAllowed" is used to separately enable / disable the buttons "Add media by URL" and "Select & upload files".
* :php:`fileUploadAllowed = false` now only hides the button "Select & upload files".
* :php:`fileByUrlAllowed = false` now hides the button "Add media by URL".
If "elementBrowserType" is set to "file" both values are true by default.
Example
.. code-block:: php
$GLOBALS['TCA']['pages']['columns']['media']['config']['appearance'] = [
'fileUploadAllowed' => false,
'fileByUrlAllowed' => false,
];
This will suppress both buttons and only leave "Create new relation".
Impact
======
Users have to use the new appearance property "fileByUrlAllowed" to hide the button "Add media by URL"
.. index:: Backend, TCA, ext:backend
@@ -0,0 +1,29 @@
.. include:: /Includes.rst.txt
.. _feature-85918:
=============================================================================
Feature: #85918 - Hide in menu / Show in menu entry for pages in context menu
=============================================================================
See :issue:`85918`
Description
===========
A new entry has been added to the context menu. It enables editors to toggle the
`hide in menu` / `show in menu` flag without opening page properties.
Find it as a child entry of `More Actions`.
Removing the entry from the menu is possible via User TSconfig with the following setting:
:typoscript:`options.contextMenu.table.pages.tree.disableItems = hideInMenus,showInMenus`
Impact
======
Editors will save some clicks when arranging menu structures.
.. index:: Backend, ext:backend
@@ -0,0 +1,28 @@
.. include:: /Includes.rst.txt
.. _feature-86670:
================================================================
Feature: #86670 - Make default action in DragUploader adjustable
================================================================
See :issue:`86670`
Description
===========
It is now possible to configure the default action for DragUploader in the file list module using User TSConfig.
.. code-block:: typoscript
# Set default to replace:
options.file_list.uploader.defaultAction = replace
# Set default to rename:
options.file_list.uploader.defaultAction = rename
# Set default to cancel (cancel is also the default and set the option to skip):
options.file_list.uploader.defaultAction = cancel
.. index:: Backend, TSConfig, ext:filelist
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _feature-87525:
===================================================
Feature: #87525 - Add api=1 option in VimeoRenderer
===================================================
See :issue:`87525`
Description
===========
The parameter api=1 in Vimeo video urls allows API interactions with the video player,
for example adding a button to interact with a video on your page.
The configuration now allows setting this parameter when rendering Vimeo videos in TYPO3.
Impact
======
Setting the parameter :typoscript:`api = 1` either in TypoScript or Fluid will append :html:`api=1` to the Vimeo video URL.
Usage
=====
Set the parameter via TypoScript for EXT:fluid_styled_content by using:
.. code-block:: typoscript
lib.contentElement.settings.media.additionalConfig.api = 1
When using Fluid use the Fluid media ViewHelper and :html:`additionalConfig` to set the argument:
.. code-block:: html
<f:media
file="{file}"
alt="{file.properties.alternative}"
title="{file.properties.title}"
additionalConfig="{api: 1}"
/>
.. index:: Fluid, TypoScript, ext:fluid_styled_content
@@ -0,0 +1,23 @@
.. include:: /Includes.rst.txt
.. _feature-88318:
====================================================
Feature: #88318 - Display Application Context in CLI
====================================================
See :issue:`88318`
Description
===========
The current Application Context is now shown next to the TYPO3 version number in CLI requests.
This makes it easier to check if the correct context is provided.
Output example:
.. code-block:: none
TYPO3 CMS 10.1.0-dev (Application Context: Development/Docker)
.. index:: CLI, ext:core
@@ -0,0 +1,17 @@
.. include:: /Includes.rst.txt
.. _feature-88441:
======================================================================
Feature: #88441 - Show configuration of USER_INT objects in adminpanel
======================================================================
See :issue:`88441`
Description
===========
A new panel "USER_INT" is introduced in the info module of the admin panel,
which lists the basic configuration of each :typoscript:`USER_INT` present on the current page.
.. index:: ext:adminpanel
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _feature-88602:
==============================================================
Feature: #88602 - Allow registering additional file processors
==============================================================
See :issue:`88602`
Description
===========
Registering additional file processors has been introduced.
New processors need to implement the interface :php:`\TYPO3\CMS\Core\Resource\Processing\ProcessorInterface`.
To register a new processor, add the following code to :file:`ext_localconf.php`
.. code-block:: php
$GLOBALS['TYPO3_CONF_VARS']['SYS']['fal']['processors']['MyNewImageProcessor'] = [
'className' => \Vendor\ExtensionName\Resource\Processing\MyNewImageProcessor::class,
'before' => ['LocalImageProcessor']
];
To order the processors, use `before` and `after` statements. TYPO3 will process the file
with the first processor that is able to process a given task.
Impact
======
Developers are now able to provide their own file processing. By providing priorities, the processor ending up handling
the file can be determined on a fine granular level including a fallback.
Examples for custom implementations might be:
* add a watermark to each image of type png
* compress uploaded pdf files into zip archives
* store images that should be cropped at a separate position in the target storage
.. index:: Backend, ext:core, FAL
@@ -0,0 +1,52 @@
.. include:: /Includes.rst.txt
.. _feature-88742:
=====================================================================
Feature: #88742 - Import Yaml files relative to the current yaml file
=====================================================================
See :issue:`88742`
Description
===========
The configuration language YAML (Yet Another Markup Language) is used to configure rich-text editor
configuration, Form Framework form definitions, and site handling configuration files.
TYPO3's internal YAML loader has a special handling for cascading and including other YAML files
into the loaded resource via the following syntax:
.. code-block:: yaml
imports:
- { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" }
another:
option: true
However, the reference to the file was usually handled by referencing other resources in
extensions as in :yaml:`EXT:my_extension/Configuration/MyConfig.yaml`.
This is now optimized to allow imported resources to include files relative
to the current YAML file:
.. code-block:: yaml
imports:
- { resource: "misc/my_options.yaml" }
- { resource: "../path/to/something/within/the/project-folder/generic.yaml" }
another:
option: true
Impact
======
Especially when using advanced site handling with multiple sites and similar configuration, it is now
possible to have one base configuration file that is referenced by the specific site configuration files
allowing to keep common config in a single place.
.. index:: PHP-API, RTE
@@ -0,0 +1,31 @@
.. include:: /Includes.rst.txt
.. _feature-88805:
====================================================================================
Feature: #88805 - Add type to \\TYPO3\\CMS\\Core\\Database\\Query\\QueryBuilder::set
====================================================================================
See :issue:`88805`
Description
===========
:php:`TYPO3\CMS\Core\Database\Query\QueryBuilder::set()` accepts as additional fourth parameter
a type the query value should be casted to when third parameter (:php:`createNamedParameter`)
is :php:`true`. Per default string (:php:`\PDO::PARAM_STR`) is used.
Impact
======
Type safe query parameter setting is now also possible via :php:`set()`.
Example:
.. code-block:: php
$queryBuilder->set($fieldName, $fieldValue, true, \PDO::PARAM_INT);
ensures :php:`$fieldValue` is handled as integer type in the resulting database query.
.. index:: Database, ext:core
@@ -0,0 +1,35 @@
.. include:: /Includes.rst.txt
.. _feature-88871:
=============================================================
Feature: #88871 - Handle middleware handler in RequestFactory
=============================================================
See :issue:`88871`
Description
===========
Guzzle offers the possibility to register custom middleware handlers during the client initialization.
With this feature it is now possible to define those custom handlers in :php:`$GLOBALS['TYPO3_CONF_VARS']['HTTP']['handler']` as an array.
The :php:`\TYPO3\CMS\Core\Http\RequestFactory` builds a handler stack based on the
:php:`$GLOBALS['TYPO3_CONF_VARS']['HTTP']['handler']` array and injects it into the created client.
Impact
======
The default handler stack (guzzle defaults) will be extended and not overwritten.
Example:
--------
.. code-block:: php
# Add custom middleware to default Guzzle handler stack
$GLOBALS['TYPO3_CONF_VARS']['HTTP']['handler'][] =
(\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\ACME\Middleware\Guzzle\CustomMiddleware::class))->handler();
$GLOBALS['TYPO3_CONF_VARS']['HTTP']['handler'][] =
(\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\ACME\Middleware\Guzzle\SecondCustomMiddleware::class))->handler();
.. index:: PHP-API, ext:core
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _feature-88907:
=========================================================================
Feature: #88907 - Always enable filter in SelectMultipleSideBySide fields
=========================================================================
See :issue:`88907`
Description
===========
The filter functionality of fields :php:`type = select` with :php:`renderType = selectMultipleSideBySide`
is always enabled now.
Impact
======
Before:
.. code-block:: php
'tsconfig_includes' => [
'label' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.tsconfig_includes',
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'size' => 10,
'items' => [],
'enableMultiSelectFilterTextfield' => true,
'softref' => 'ext_fileref'
]
],
Now just omit the line :php:`'enableMultiSelectFilterTextfield' => true`, the behaviour will stay the same.
A migration wizard is available that removes the option from your TCA and leaves a message where code
adaption has to take place.
.. index:: Backend, TCA, ext:core
@@ -0,0 +1,35 @@
.. include:: /Includes.rst.txt
.. _feature-89010:
========================================================================
Feature: #89010 - Introduce Site Configuration for Distribution Packages
========================================================================
See :issue:`89010`
Description
===========
Distributions or site packages are designed to deliver a full blown TYPO3 instance with all necessary data and assets
to have a functional installation after the package has been activated.
The import of a distribution can now ship the config file (or many, if this is required).
Similar to assets, that are moved to :file:`fileadmin` ready for use, site configurations are moved into the config folder.
Impact
======
Distributions can now ship their own site configuration files.
Example:
--------
Into the distribution package :file:`Initialisation/Site` folder, put a folder with the site identifier as name, containing the
:file:`config.yaml`.
Each folder will be moved into the target position upon extension activation.
If a folder with the same name already exists, the file will *not* be overridden. In this case no change is made to the existing configuration.
.. index:: PHP-API, ext:core
@@ -0,0 +1,83 @@
.. include:: /Includes.rst.txt
.. _feature-89018:
==========================================================================
Feature: #89018 - Provide implementation for PSR-17 HTTP Message Factories
==========================================================================
See :issue:`89018`
Description
===========
Support for PSR-17_ HTTP Message Factories has been added.
PSR-17 HTTP Factories are intended to be used by PSR-15_ request handlers in order to create PSR-7_
compatible message objects.
PSR-17 consists of six factory interfaces:
- :php:`\Psr\Http\Message\RequestFactoryInterface`
- :php:`\Psr\Http\Message\ResponseFactoryInterface`
- :php:`\Psr\Http\Message\ServerRequestFactoryInterface`
- :php:`\Psr\Http\Message\StreamFactoryInterface`
- :php:`\Psr\Http\Message\UploadedFileFactoryInterface`
- :php:`\Psr\Http\Message\UriFactoryInterface`
Request handlers shall use dependency injection to use any of the available PSR-17 HTTP Factory interfaces.
Impact
======
PSR-17 HTTP Factory interfaces are provided by `psr/http-factory` and should be used as
dependencies for PSR-15 request handlers or services that need to create PSR-7 message objects.
It is discouraged to explicitly create PSR-7 instances of classes from the :php:`\TYPO3\CMS\Core\Http`
namespace (they are not public API). Use type declarations against PSR-17 HTTP Message Factory interfaces
and dependency injection instead.
Example usage
-------------
A middleware that needs to send a JSON response when a certain condition is met, uses the
PSR-17 response factory interface (the concrete TYPO3 implementation is injected as constructor
dependency) to create a new PSR-7 response object:
.. code-block:: php
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
class StatusCheckMiddleware implements MiddlewareInterface
{
/** @var ResponseFactoryInterface */
private $responseFactory;
public function __construct(ResponseFactoryInterface $responseFactory)
{
$this->responseFactory = $responseFactory;
}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
if ($request->getRequestTarget() === '/check') {
$data = ['status' => 'ok'];
$response = $this->responseFactory->createResponse()
->withHeader('Content-Type', 'application/json; charset=utf-8');
$response->getBody()->write(json_encode($data));
return $response;
}
return $handler->handle($request);
}
}
.. _PSR-17: https://www.php-fig.org/psr/psr-17/
.. _PSR-15: https://www.php-fig.org/psr/psr-15/
.. _PSR-7: https://www.php-fig.org/psr/psr-7/
.. index:: PHP-API, ext:core
@@ -0,0 +1,89 @@
.. include:: /Includes.rst.txt
.. _feature-89054:
=======================================================================
Feature: #89054 - Provide core cache frontends via dependency injection
=======================================================================
See :issue:`89054`
Description
===========
With TYPO3 v10.0 dependency injection has been introduced. To work with
the cache, currently only the :php:`\TYPO3\CMS\Core\Cache\CacheManager` is available as a service within
the dependency injection container. To foster the „Inversion of Control“ pattern,
the instances of :php:`\TYPO3\CMS\Core\Cache\Frontend\FrontendInterface` should
be injected to the objects rather than using the :php:`\TYPO3\CMS\Core\Cache\CacheManager`.
Classes should be adapted to avoid :php:`\TYPO3\CMS\Core\Cache\CacheManager` whenever possible.
The TYPO3 core provides all core caches as dependency injection services.
The name of the service follows the scheme :php:`cache.[CONFIGURATION NAME]`.
E.g. the core cache frontend will have the service id :php:`cache.core`.
Third party extensions are encouraged to do the same and provide a :php:`cache.my_cache`
service in :file:`Configuration/Services.yaml` for cache configuration they define
in :file:`ext_localconf.php`.
Usage
=====
Given a class needs the "my_cache" cache Frontend, then the code before TYPO3 v10.1
looked like the following example:
.. code-block:: php
class MyClass
{
/**
* @var TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
*/
private $cache;
public function __construct()
{
$cacheManager = GeneralUtility::makeInstance(CacheManager::class);
$this->cache = $cacheManager->getCache('my_cache');
}
}
The instance of :php:`\TYPO3\CMS\Core\Cache\Frontend\FrontendInterface` was retrieved by creating an instance
of :php:`\TYPO3\CMS\Core\Cache\CacheManager` and then by calling the :php:`getCache()` method.
To inject the cache directly, the class needs to be changed as follows. The instance
of :php:`\TYPO3\CMS\Core\Cache\Frontend\FrontendInterface` will be passed as an argument to the constructor.
.. code-block:: php
class MyClass
{
/**
* @var TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
*/
private $cache;
public function __construct(FrontendInterface $cache)
{
$this->cache = $cache;
}
}
Since the auto-wiring feature of the dependency injection container cannot detect,
which cache configuration should be used for the :php:`$cache` argument, the container
service configuration needs to be extended as well:
.. code-block:: yaml
services:
cache.my_cache:
class: TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
factory: ['@TYPO3\CMS\Core\Cache\CacheManager', 'getCache']
arguments: ['my_cache']
MyClass:
arguments:
$cache: '@cache.my_cache'
.. index:: PHP-API, ext:core
@@ -0,0 +1,95 @@
.. include:: /Includes.rst.txt
.. _feature-89061:
================================================
Feature: #89061 - Introduce Notification Actions
================================================
See :issue:`89061`
Description
===========
Notifications rendered by the :js:`TYPO3/CMS/Backend/Notification` module are now able to render action buttons. Each
notification method (:js:`info()`, :js:`success()` etc) accepts an array of actions, each action is described by a
:js:`label` and a pre-defined action type, containing a callback.
However, notifications flagged with a duration will still disappear, unless an action is taken.
.. important::
Such tasks must **never** be mandatory to be executed. This API is meant to suggest certain actions without enforcing
them. If a user is supposed to take immediate actions consider using modals instead.
Example:
.. code-block:: js
require([
'TYPO3/CMS/Backend/ActionButton/ImmediateAction',
'TYPO3/CMS/Backend/ActionButton/DeferredAction',
'TYPO3/CMS/Backend/Notification'
], function(ImmediateAction, DeferredAction, Notification) {
const immediateActionCallback = new ImmediateAction(function () { /* your action code */ });
Notification.info(
'Great! We are almost done here...',
'Common default settings have been applied based on your previous input.',
0,
[
{label: 'Show settings', action: immediateActionCallback}
]
);
});
ImmediateAction
---------------
An action of type :js:`ImmediateAction` (:js:`TYPO3/CMS/Backend/ActionButtons/ImmediateAction`) is executed directly on
click and closes the notification. This action type is suitable for e.g. linking to a backend module.
The class accepts a callback method executing very simple logic.
Example:
.. code-block:: js
const immediateActionCallback = new ImmediateAction(function () {
require(['TYPO3/CMS/Backend/ModuleMenu'], function (ModuleMenu) {
ModuleMenu.App.showModule('web_layout');
});
});
DeferredAction
--------------
An action of type :js:`DeferredAction` (:js:`TYPO3/CMS/Backend/ActionButtons/DeferredAction`) is recommended when a
long-lasting task is executed, e.g. an AJAX request.
This class accepts a callback method which must return either a resolved or rejected promise.
The :js:`DeferredAction` replaces the action button with a spinner icon to indicate a task will take some time. It's
still possible to dismiss a notification, which will **not** stop the execution.
Example:
.. code-block:: js
const deferredActionCallback = new DeferredAction(function () {
const myAction = async function() {
return await 'something';
}
return myAction();
});
const anotherDeferredActionCallback = new DeferredAction(function () {
// do some old-fashioned jQuery stuff
return Promise.resolve($.ajax(/* AJAX configuration */));
});
.. index:: Backend, JavaScript, ext:backend
@@ -0,0 +1,26 @@
.. include:: /Includes.rst.txt
.. _feature-89090:
===================================================
Feature: #89090 - Reports for conflicting redirects
===================================================
See :issue:`89090`
Description
===========
A new Symfony command has been introduced that detects redirects that conflict with pages. The command is marked as
schedulable, thus it can be created as a scheduler task.
Impact
======
If EXT:scheduler and EXT:reports are installed, the redirect status may be checked and presented as an additional report.
The command may be executed via CLI by invoking `./typo3/sysext/core/bin/typo3 redirects:checkintegrity`. The command
accepts the option `--site` which takes a site identifier to take the pages of that site into consideration only.
.. index:: Backend, CLI, ext:redirects
@@ -0,0 +1,55 @@
.. include:: /Includes.rst.txt
.. _feature-89115:
=======================================================================
Feature: #89115 - Auto slug update and redirect creation on slug change
=======================================================================
See :issue:`89115`
Description
===========
If EXT:redirects is installed and a slug is updated by a backend user,
a redirect from the old URL to the new URL will be created.
All sub pages are checked too and the slugs will be updated.
After the creation of the redirects a notification will be shown to the user.
The notification contains two possible actions:
* revert the complete slug update and remove the redirects
* or only remove the redirects
This new behaviour can be configured by site configuration (Example for your :file:`config.yaml`):
.. code-block:: yaml
settings:
redirects:
# Automatically update slugs of all sub pages
# (default: true)
autoUpdateSlugs: true
# Automatically create redirects for pages with a new slug (works only in LIVE workspace)
# (default: true)
autoCreateRedirects: true
# Time To Live in days for redirect records to be created - `0` disables TTL, no expiration
# (default: 0)
redirectTTL: 30
# HTTP status code for the redirect, see
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Redirections#Temporary_redirections
# (default: 307)
httpStatusCode: 307
.. note::
No redirects are generated for workspace versions in the TYPO3 backend.
:yaml:`settings.redirect.autoCreateRedirects` is internally disabled in this case.
.. attention::
This API is considered experimental and may change anytime until declared being stable.
For example there exists plans for moving the settings out of the :file:`config.yaml` file.
.. index:: Backend, ext:redirects
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _feature-89142:
============================================================================
Feature: #89142 - Create site configuration if page is created on root level
============================================================================
See :issue:`89142`
Description
===========
When creating a typical new page on the root level of a TYPO3 installation, a new site configuration is now
automatically created as well. This makes it easier to work with multi-sites and get a basic configuration set up
more quickly than before.
Under the hood, a new :php:`DataHandler` hook checks for new pages being one of the following page types:
* Default pages
* Links
* Shortcuts
The entry point consists of the current domain where the configuration has been created, plus a short identifier using
the page uid and the prefix "site", e.g. `https://example.com/site-42`.
The identifier of the site uses the entry point without the domain, and a MD5 hash of the page id to avoid potential
conflicts for existing site configurations. An identifier may look like `site-42-a1d0c6e83f`.
Impact
======
A new site configuration with a pre-defined identifier, entry point and a default language gets created automatically.
Ideally, there are no scenarios anymore where a site needs to be created after a first page is created, avoiding
any issues related to Slug handling for root pages, which are always set to `/` by default.
.. index:: Backend, ext:core
@@ -0,0 +1,33 @@
.. include:: /Includes.rst.txt
.. _feature-89143:
====================================================================
Feature: #89143 - Allow rollback for a set of record history entries
====================================================================
See :issue:`89143`
Description
===========
To allow rollbacks for a set of record history entries, it is now possible to add a correlationId
while creating the RecordHistory entry. The correlationId should be an UUID but could also be any
string which is useful to identify a set of entries.
To use this feature, an additional parameter :php:`$correlationId` has been added to the following methods of
:php:`\TYPO3\CMS\Core\DataHandling\History\RecordHistoryStore`:
* :php:`addRecord(string $table, int $uid, array $payload, CorrelationId $correlationId = null)`
* :php:`modifyRecord(string $table, int $uid, array $payload, CorrelationId $correlationId = null)`
* :php:`deleteRecord(string $table, int $uid, CorrelationId $correlationId = null)`
* :php:`undeleteRecord(string $table, int $uid, CorrelationId $correlationId = null)`
* :php:`moveRecord(string $table, int $uid, array $payload, CorrelationId $correlationId = null)`
To resolve all entries for a given :php:`$correlationId` a new method has been added to the
:php:`\TYPO3\CMS\Core\DataHandling\History\RecordHistory` class:
* :php:`\TYPO3\CMS\Core\DataHandling\History\RecordHistory::findEventsForCorrelation(string $correlationId): array`
.. index:: Backend, PHP-API, ext:backend
@@ -0,0 +1,30 @@
.. include:: /Includes.rst.txt
.. _feature-89150:
================================================================================
Feature: #89150 - Add events before and after rollback of record history entries
================================================================================
See :issue:`89150`
Description
===========
Two new events have been introduced into record history that will be dispatched before and after a revert action.
* :php:`\TYPO3\CMS\Backend\History\Event\BeforeHistoryRollbackStartEvent` before the rollback starts
* :php:`\TYPO3\CMS\Backend\History\Event\AfterHistoryRollbackFinishedEvent` after the rollback finished
Both events resolve some information about the :php:`RecordHistory` item:
* :php:`getRecordHistoryRollback()` returns the :php:`\TYPO3\CMS\Backend\History\RecordHistoryRollback` object
* :php:`getRollbackFields()` returns a string with the rollback fields
* :php:`getDiff()` returns an array with the differences
* :php:`getBackendUserAuthentication()` returns a :php:`\TYPO3\CMS\Backend\BackendUserAuthentication` object, which is used for this rollback operation
Additionally the :php:`\TYPO3\CMS\Backend\History\Event\AfterHistoryRollbackFinishedEvent` gets the DataHandler input data:
* :php:`getDataHandlerInput()` returns an array with the :php:`DataHandler` instructions.
.. index:: Backend, PHP-API, ext:backend
@@ -0,0 +1,111 @@
.. include:: /Includes.rst.txt
.. _feature-89216:
===================================================
Feature: #89216 - PSR-18 HTTP Client Implementation
===================================================
See :issue:`89216`
Description
===========
Support for PSR-18_ HTTP Client has been added.
PSR-18 HTTP Client is intended to be used by PSR-15_ request handlers in order to perform HTTP
requests based on PSR-7_ message objects without relying on a specific HTTP client implementation.
PSR-18 consists of a client interfaces and three exception interfaces:
- :php:`\Psr\Http\Client\ClientInterface`
- :php:`\Psr\Http\Client\ClientExceptionInterface`
- :php:`\Psr\Http\Client\NetworkExceptionInterface`
- :php:`\Psr\Http\Client\RequestExceptionInterface`
Request handlers shall use dependency injection to retrieve the concrete implementation
of the PSR-18 HTTP client interface :php:`\Psr\Http\Client\ClientInterface`.
Impact
======
The PSR-18 HTTP Client interface is provided by `psr/http-client` and may be used as
dependency for services in order to perform HTTP requests using PSR-7 request objects.
PSR-7 request objects can be created with the PSR-17_ Request Factory interface.
Note: This does not replace the currently available Guzzle wrapper
:php:`\TYPO3\CMS\Core\Http\RequestFactory->request()`, but is available as a framework
agnostic, more generic alternative. The PSR-18 interface does not allow to pass request
specific guzzle options. But global options defined in :php:`$GLOBALS['TYPO3_CONF_VARS']['HTTP']`
are taken into account as GuzzleHTTP is used as backend for this PSR-18 implementation.
The concrete implementations is internal and will be replaced by a native guzzle PSR-18
implementation once it is available.
Example usage
-------------
A middleware might need to request an external service in order to transform the response
into a new response. The PSR-18 HTTP client interface is used to perform the external
HTTP request. The PSR-17 Request Factory Interface is used to create the HTTP request that
the PSR-18 HTTP Client expects. The PSR-7 Response Factory is then used to create a new
response to be returned to the user. All off these interface implementations are injected
as constructor dependencies:
.. code-block:: php
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
class ExampleMiddleware implements MiddlewareInterface
{
/** @var ResponseFactory */
private $responseFactory;
/** @var RequestFactory */
private $requestFactory;
/** @var ClientInterface */
private $client;
public function __construct(
ResponseFactoryInterface $responseFactory,
RequestFactoryInterface $requestFactory,
ClientInterface $client
) {
$this->responseFactory = $responseFactory;
$this->requestFactory = $requestFactory;
$this->client = $client;
}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
if ($request->getRequestTarget() === '/example') {
$req = $this->requestFactory->createRequest('GET', 'https://api.external.app/endpoint.json')
// Perform HTTP request
$res = $this->client->sendRequest($req);
// Process data
$data = [
'content' => json_decode((string)$res->getBody());
];
$response = $this->responseFactory->createResponse()
->withHeader('Content-Type', 'application/json; charset=utf-8');
$response->getBody()->write(json_encode($data));
return $response;
}
return $handler->handle($request);
}
}
.. _PSR-18: https://www.php-fig.org/psr/psr-18/
.. _PSR-17: https://www.php-fig.org/psr/psr-17/
.. _PSR-15: https://www.php-fig.org/psr/psr-15/
.. _PSR-7: https://www.php-fig.org/psr/psr-7/
.. index:: PHP-API, ext:core
@@ -0,0 +1,22 @@
.. include:: /Includes.rst.txt
.. _feature-89227:
==============================================================
Feature: #89227 - Ask for email address while installing TYPO3
==============================================================
See :issue:`89227`
Description
===========
It is now possible to enter an email address for the first admin user while installing TYPO3.
Within the install process, an admin user will be created by entering a username and password.
The user is asked for the email address as well, so this can be used
later on to e.g. notify the admin if somebody logged-in (Warning email address).
This will also work in the install tool Maintenance module "Create Administrative User" card.
.. index:: Backend, ext:install
@@ -0,0 +1,29 @@
.. include:: /Includes.rst.txt
.. _feature-89229:
===============================================================
Feature: #89229 - Cache Preset for Settings in Maintenance Area
===============================================================
See :issue:`89229`
Description
===========
The maintenance area available in TYPO3 Backend under "Admin Tools" => "Settings" now also allows to quickly switch
between Cache Backends for the Caching Framework.
This allows to select different settings without having to manually modify the :file:`LocalConfiguration.php` file.
Impact
======
Depending on a server setup, it might be easier to quickly see differences when running on a distributed Database system
(not localhost) or on a distributed file system to choose between caching options.
In addition, the most common caches are explained in what is stored there. Further configuration can be applied by
manually modifying the :file:`LocalConfiguration.php` settings file.
.. index:: LocalConfiguration, ext:core
@@ -0,0 +1,99 @@
.. include:: /Includes.rst.txt
.. _feature-89244:
==================================================
Feature: #89244 - Broadcast Channels and Messaging
==================================================
See :issue:`89244`
Description
===========
It is now possible to send broadcast messages from anywhere in TYPO3 that are listened to via JavaScript.
.. warning::
This API is considered internal and may change anytime until declared being stable.
Send a message
--------------
Any backend module may send a message using the :js:`TYPO3/CMS/Backend/BroadcastService` module.
The payload of such message is an object that consists at least of the following properties:
* :js:`componentName` - the name of the component that sends the message (e.g. extension name)
* :js:`eventName` - the event name used to identify the message
A message may contain any other property as necessary. The final event name to listen is a composition of "typo3", the
component name and the event name, e.g. `typo3:my_extension:my_event`.
.. attention::
Since a polyfill is in place to add support for Microsoft Edge, the payload must contain JSON-serializable content
only.
To send a message, the :js:`post()` method has to be used.
Example code:
.. code-block:: js
require(['TYPO3/CMS/Backend/BroadcastService'], function (BroadcastService) {
const payload = {
componentName: 'my_extension',
eventName: 'my_event',
hello: 'world',
foo: ['bar', 'baz']
};
BroadcastService.post(payload);
});
Receive a message
-----------------
To receive and thus react on a message, an event handler needs to be registered that listens to the composed event
name (e.g. `typo3:my_component:my_event`) sent to :js:`document`.
The event itself contains a property called `detail` **excluding** the component name and event name.
Example code:
.. code-block:: js
define([], function() {
document.addEventListener('typo3:my_component:my_event', (e) => eventHandler(e.detail));
function eventHandler(detail) {
console.log(detail); // contains 'hello' and 'foo' as sent in the payload
}
});
Hook into :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/backend.php']['constructPostProcess']` to load a custom
:php:`BackendController` hook that loads the event handler, e.g. via RequireJS.
Example code:
.. code-block:: php
// ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/backend.php']['constructPostProcess'][]
= \Vendor\MyExtension\Hooks\BackendControllerHook::class . '->registerClientSideEventHandler';
// Classes/Hooks/BackendControllerHook.php
class BackendControllerHook
{
public function registerClientSideEventHandler(): void
{
$pageRenderer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Page\PageRenderer::class);
$pageRenderer->loadRequireJsModule('TYPO3/CMS/MyExtension/EventHandler');
}
}
.. index:: Backend, JavaScript, ext:backend
@@ -0,0 +1,41 @@
.. include:: /Includes.rst.txt
.. _feature-89292:
==============================================================================
Feature: #89292 - Add support for RecordHistory correlationId's to DataHandler
==============================================================================
See :issue:`89292`
Description
===========
With :issue:`89143` a new feature for correlation ids in :php:`\TYPO3\CMS\Backend\History\RecordHistory` was introduced.
:php:`DataHandler` now also supports this feature by setting the :php:`$correlationId` with its instance.
.. code-block:: php
$correlationId = CorrelationId::forSubject(
md5(StringUtility::getUniqueId('slug_'))
);
$data['pages'][$uid]['slug'] = $newSlug;
// create new DataHandler instance
$dataHandler = GeneralUtility::makeInstance(DataHandler::class);
$dataHandler->start($data, []);
// DataHandler::start assigns internal correlation id scope
// which will be overridden in this example by the next line
$dataHandler->setCorrelationId($correlationId);
// actually process and persist data
$dataHandler->process_datamap();
After this DataHandler operation, the created RecordHistory entry contains the :php:`$correlationId`.
:php:`CorrelationId` model requires mandatory :php:`$subject` and allows optional :php:`$aspects` which
can be serialized into string like e.g. `0400$12ae0b042a5d75e3f2744f4b3faf8068/5d8e6e70/slug`
* `0400$` is a flag prefix containing an internal version number for possible schema validations
* `12ae0b042a5d75e3f2744f4b3faf8068` is a unique subject
* `/5d8e6e70/slug` are aspects, separated by slashes
.. index:: Backend, Database, PHP-API, ext:core
@@ -0,0 +1,30 @@
.. include:: /Includes.rst.txt
.. _feature-9070:
================================================================
Feature: #9070 - Allow translation of index configuration titles
================================================================
See :issue:`9070`
Description
===========
Indexed search plugin allows to select specifically which index configuration to be queried from in the specific form,
where a dropdown shows all possible indexing configurations.
Impact
======
It is now possible to add a label for each configuration via TypoScript in each language.
.. code-block:: typoscript
plugin.tx_indexedsearch.settings._LOCAL_LANG {
de.indexingConfigurations.13 = Mein Titel in Deutsch für Konfiguration 13
de.indexingConfigurationHeader.13 = Alle Ergebnisse für Konfiguration 13
}
.. index:: Backend, ext:indexed_search
@@ -0,0 +1,23 @@
.. include:: /Includes.rst.txt
.. _important-89001:
========================================
Important: #89001 - TSFE->createHashBase
========================================
See :issue:`89001`
Description
===========
The method :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->createHashBase()`
calculates all components that are relevant for a specific cached version of a page.
With TYPO3 v10.1, the keys in :php:`$hashParameters` used for calculating the hash have been modified:
- `gr_list` has been replaced by `groupIds` but contains the same values
- `cHash` has been replaced by `dynamicArguments` but contains the same values
- `domainStartPage` has been replaced by `site` (identifier of the site)
.. index:: Frontend, PHP-API, ext:frontend
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _important-89122:
=========================================================================
Important: #89122 - Unified evaluation of versioned records in workspaces
=========================================================================
See :issue:`89122`
Description
===========
TYPO3 Core handled the result of database queries in a lot of different ways to filter out workspace records.
In previous versions, where versioned records without workspaces (incremental versions) was supported, the main
identifier was always to check for records that are "Offline" - by checking via the "pid" field of database records,
that they are set to "-1".
With workspaces, there are other, better ways to identify versioned via the following fields:
- t3ver_state (what kind of versioned record it is - new version, moved record, deleted version)
- t3ver_oid (if the versioned record points to a live record)
- t3ver_wsid (the workspace ID, a relation to a sys_workspace record)
The "pid" field was kept as misuse, but fine for most of the database queries. With the unified database abstraction
layer based on Doctrine DBAL and enriched via Query Restrictions, TYPO3 Core now checks for t3ver_state, t3ver_wsid
and t3ver_oid to identify versioned records.
This is already achieved with any database query by using the WorkspaceRestrictions in place. Extension authors
should use Doctrine DBAL and apply workspace restrictions by default.
If this is not possible when building custom queries without restrictions, it is recommended to check for:
- t3ver_oid>0 = identifying a versioned record that has a counterpart in the live workspace
- t3ver_wsid=13 - identifying a versioned record or placeholder that resides in a specific workspace (in this case "13")
- t3ver_state IN (0,-1) AND t3ver_wsid IN (0,13) - to fetch records including "new record" placeholders
Checking for "pid = -1" is not recommended anymore - using the restrictions and custom query information can be
used in previous TYPO3 versions already.
.. index:: Database, ext:workspaces
+53
View File
@@ -0,0 +1,53 @@
:template: changelogOverview.html
.. include:: /Includes.rst.txt
.. _changelog-10-1:
10.1 Changes
=============
**Table of contents**
.. contents::
:local:
:depth: 1
Breaking Changes
^^^^^^^^^^^^^^^^
None since TYPO3 v10.0 release.
.. attention::
After TYPO3 v10.0, only new functionality with a solid migration path can be added on top,
with aiming for as little as possible breaking changes after the initial v10.0 release on the way to LTS.
Features
^^^^^^^^
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Feature-*
Deprecation
^^^^^^^^^^^
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Deprecation-*
Important
^^^^^^^^^
.. toctree::
:maxdepth: 1
:titlesonly:
:glob:
Important-*