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,36 @@
.. include:: /Includes.rst.txt
.. _breaking-85080:
==========================================================================================
Breaking: #85080 - Method "isEnabled()" added to RenderableInterface and FinisherInterface
==========================================================================================
See :issue:`85080`
Description
===========
A new method :php:`isEnabled()` has been added to the :php:`RenderableInterface` as well as the :php:`FinisherInterface`.
Impact
======
Third party code implementing these interfaces and not extending :php:`AbstractRenderable` or :php:`AbstractFinisher` will
cause a fatal error if used in a form.
Affected Installations
======================
Instances with third party code implementing these interfaces and not extending :php:`AbstractRenderable` or :php:`AbstractFinisher`.
Migration
=========
Third party code implementing these interfaces must be updated to implement the :php:`isEnabled()` method, preferably
by extending :php:`AbstractRenderable` (or one of its subclasses) or :php:`AbstractFinisher`.
.. index:: ext:form, NotScanned
@@ -0,0 +1,56 @@
.. include:: /Includes.rst.txt
.. _breaking-85398:
===============================================
Breaking: #85398 - Drop documentation extension
===============================================
See :issue:`85398`
Description
===========
Fetching and rendering extension and core manuals directly within
the backend using the documentation extension has been dropped
from the TYPO3 backend.
The module never found broad acceptance and usage in the community,
had various hard to resolve flaws and has been a maintenance burden
for the documentation team ever since.
Impact
======
The Documentation module does not exist anymore and cannot be used
to display manuals in the TYPO3 backend.
The previously required extension "documentation" is not available anymore.
New installations do not have the `documentation` extension installed by default.
Affected Installations
======================
Every TYPO3 instance.
Migration
=========
Current documentation of core functionality, core extensions and
community extensions can always be found on docs_ directly.
Flush all TYPO3 Core Caches to ensure that :php:`PackageStates.php` is rebuilt
without the documentation extension.
For composer installations, ensure that the dependency to `typo3/cms-documentation` is removed.
Extensions authors need to ensure that dependencies to `EXT:documentation` are removed, if
they existed before.
.. _docs: https://docs.typo3.org
.. index:: ext:documentation, NotScanned
@@ -0,0 +1,73 @@
.. include:: /Includes.rst.txt
.. _breaking-85761:
===============================================
Breaking: #85761 - Authentication chain changes
===============================================
See :issue:`85761`
Description
===========
Most TYPO3 instances can ignore this.
An instance must consider this security relevant documentation if all of the below criteria are met:
* Additional authentication services are active in an instance, for example an LDAP extension,
an openId extension, some single sign on extension, or similar. The reports module with top
module selection "Installed services" shows those extensions. If an instance is only dealing
with core related authentication services like "saltedpasswords", "rsaauth" and "core", it is
not affected.
* One of these not native core services is registered with a priority lower than 70 and higher than 50, see
the configuration module in the backend and verify if some non-core extension registers with
such a priority. Most additional authentication services however register with a priority higher than 70.
* The additional authentication service is registered for type 'authUserBE' or 'authUserFE'.
In the unlikely case such a service type with a priority between 70 and 50 has been registered,
security relevant changes may be needed to be applied when upgrading to TYPO3 v9.
The core service to compare a password against a salted password hash in the database has been
moved from priority 70 to priority 50. The salted passwords service on priority 70 did not continue
to lower prioritized authentication services if the password in the database has been recognized by
salted passwords as a valid hash, but the password did not match. The default core service denied
calling services lower in the chain if the password has been recognized as hash which the
salted passwords hash service could handle, but the password did not validate.
With reducing the priority of the salted password hash check from priority 70 to 50 the following
edge case applies: If a service is registered between 70 and 50, this service is now called before
the salted passwords hash check. It thus may be called more often than before and may need to change
its return value. It can no longer rely on the salted passwords service to deny a successful
authentication if the submitted password is stored in the database as hashed password, but the
database hash does not match the submitted password a user has sent to login.
Impact
======
If an instance provides additional authentication services, and if one of that services does
not return correct authentication values, this may open an authentication bypass security issue
when upgrading to TYPO3 v9.
Affected Installations
======================
See description.
Migration
=========
If an instance is affected, consider the following migration thoughts:
* Ensure the authentication service between priority 70 and 50 on type 'authUserBE' and 'authUserFE'
does not rely on the result auf the salted passwords evaluation.
* Consider this authentication services is called more often than before since the previous service
that denied login on priority 70 is now located at priority 50.
* Check the return values of the authentication services.
* Read the source code of :php:`TYPO3\CMS\Core\Authentication->authUser()` for more details on possible
return values. Consider the priority driven call chain.
.. index:: PHP-API, NotScanned, ext:saltedpasswords
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _deprecation-65578:
=====================================================================
Deprecation: #65578 - config.concatenateJsAndCss and concatenateFiles
=====================================================================
See :issue:`65578`
Description
===========
The TypoScript property `config.concatenateJsAndCss` and the related methods within :php:`PageRenderer` have
been marked as deprecated:
* :php:`PageRenderer->getConcatenateFiles()`
* :php:`PageRenderer->enableConcatenateFiles()`
* :php:`PageRenderer->disableConcatenateFiles()`
Impact
======
Setting the TypoScript property or calling one of the methods above will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations setting the TypoScript property or calling one of the PHP methods directly.
Migration
=========
Use the TypoScript properties :typoscript:`config.concatenateJs` and :typoscript:`config.concatenateCss`
and the corresponding methods in PageRenderer class directly.
.. index:: Frontend, PHP-API, TypoScript, PartiallyScanned
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-81430:
====================================================================
Deprecation: #81430 - TypoScriptTemplateModuleController::renderList
====================================================================
See :issue:`81430`
Description
===========
The PHP method :php:`TypoScriptTemplateModuleController::renderList` has been marked as deprecated and will be removed with TYPO3 v10.
Impact
======
Installations accessing the method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Instances calling the method.
Migration
=========
No migration available. Remove the method call, implement the required functionality in your own code or unload the extension.
.. index:: Backend, PHP-API, FullyScanned
@@ -0,0 +1,68 @@
.. include:: /Includes.rst.txt
.. _deprecation-83750:
============================================================
Deprecation: #83750 - Adapt TCA signature for customControls
============================================================
See :issue:`83750`
Description
===========
According to the TCA documentation since TYPO3 v4.7, the definition of "customControls" for "inline" columns
is as follows:
.. important::
Numerical array containing definitions of custom header controls for IRRE fields. This makes it possible to
create special controls by calling user-defined functions (userFuncs). Each item in the array item must be
an array itself, with at least on key "userFunc" pointing to the user function to call.
The implementation instead relied on the userFunc string being provided as the key of the array.
Impact
======
TCA definition for "inline" fields using custom header controls for IRRE fields will trigger a PHP :php:`E_USER_DEPRECATED` error:
.. code-block:: php
'some-column' => [
'config' => [
'type' => 'inline',
// ...
'customControls' => [
\Vendor\MyExtension\Tca\MyFirstCustomControl::class . '->render',
\Vendor\MyExtension\Tca\MySecondCustomControl::class . '->render'
]
]
]
Migration
=========
Update the TCA definition with a :php:`userFunc` key to specify the method to be called:
.. code-block:: php
'some-column' => [
'config' => [
'type' => 'inline',
// ...
'customControls' => [
[
'userFunc' => \Vendor\MyExtension\Tca\MyFirstCustomControl::class . '->render'
],
[
'userFunc' => \Vendor\MyExtension\Tca\MySecondCustomControl::class . '->render'
]
]
]
]
.. index:: TCA, NotScanned, ext:core
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _deprecation-84133:
===============================================================================
Deprecation: #84133 - Deprecate _isHiddenFormElement and _isReadOnlyFormElement
===============================================================================
See :issue:`84133`
Description
===========
The following properties have been marked as deprecated and should not be used any longer:
* :yaml:`renderingOptions._isHiddenFormElement`
* :yaml:`renderingOptions._isReadOnlyFormElement`
Those properties are available for the following form elements of the form framework:
* ContentElement
* Hidden
* Honeypot
Impact
======
The properties mentioned are still available in TYPO3 v9, but they will be dropped in TYPO3 v10.
Affected Installations
======================
Any form built with the form framework is affected as soon as those properties have been manually
added to the form definition.
Migration
=========
Usages of the above mentioned properties should be switched to the variants feature instead.
.. index:: Frontend, NotScanned, ext:form
@@ -0,0 +1,71 @@
.. include:: /Includes.rst.txt
.. _deprecation-84375:
==============================================================================
Deprecation: #84375 - Protected methods and properties in PageLayoutController
==============================================================================
See :issue:`84375`
Description
===========
Some methods in the :php:`TYPO3\CMS\Backend\Controller\PageLayoutController`
have been marked as deprecated and will be removed in TYPO3 v10:
* [not scanned] :php:`init()`
* [not scanned] :php:`main()`
* [not scanned] :php:`menuConfig()`
* [not scanned] :php:`renderContent()`
* [not scanned] :php:`clearCache()`
* [not scanned] :php:`getModuleTemplate()`
* :php:`getLocalizedPageTitle()`
* :php:`getNumberOfHiddenElements()`
* :php:`local_linkThisScript()`
* :php:`pageIsNotLockedForEditors()`
* :php:`contentIsNotLockedForEditors()`
Likewise some properties have been marked as deprecated:
* [not scanned] :php:`pointer`
* [not scanned] :php:`imagemode`
* [not scanned] :php:`search_field`
* [not scanned] :php:`search_levels`
* [not scanned] :php:`showLimit`
* [not scanned] :php:`returnUrl`
* [not scanned] :php:`clear_cache`
* :php:`popView`
* [not scanned] :php:`perms_clause`
* [not scanned] :php:`modTSconfig`
* :php:`modSharedTSconfig`
* [not scanned] :php:`descrTable`
* :php:`colPosList`
* :php:`EDIT_CONTENT`
* :php:`CALC_PERMS`
* :php:`current_sys_language`
* :php:`MCONF`
* :php:`MOD_MENU`
* [not scanned] :php:`content`
* :php:`activeColPosList`
Impact
======
Accessing the properties or calling the methods will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Third party code which accesses the properties directly or calls the methods.
Migration
=========
In general, extensions should not instantiate and re-use controllers of the core. Existing
usages should be rewritten to be free of calls like these.
.. index:: Backend, PHP-API, PartiallyScanned
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _deprecation-84387:
=================================================================================
Deprecation: #84387 - Deprecated method and property in SchedulerModuleController
=================================================================================
See :issue:`84387`
Description
===========
The property :php:`$CMD` and the method :php:`addMessage()` in the :php:`SchedulerModuleController`
have been marked as deprecated and will be removed in TYPO3 v10.
Impact
======
Accessing the property or calling the method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Third party code which accesses the property directly or calls the method.
Migration
=========
Instead of accessing the property :php:`SchedulerModuleController::$CMD`, the method :php:`getCurrentAction()`
must be used which returns an instance of the :php:`TYPO3\CMS\Scheduler\Task\Enumeration\Action` enumeration.
Instead of calling the method :php:`SchedulerModuleController::addMessage()`, in your additional field providers
you can now extend :php:`TYPO3\CMS\Scheduler\AbstractAdditionalFieldProvider` which provides a method :php:`addMessage()`
with the same API like before.
.. index:: Backend, PHP-API, FullyScanned
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-84414:
====================================================
Deprecation: #84414 - BackendUtility::shortcutExists
====================================================
See :issue:`84414`
Description
===========
The PHP method :php:`TYPO3\CMS\Backend\Utility\BackendUtility::shortcutExists()` has been marked as deprecated and will be removed with TYPO3 v10.
Impact
======
Installations accessing the method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Instances calling the method.
Migration
=========
Use an instance of :php:`TYPO3\CMS\Backend\Backend\Shortcut\ShortcutRepository` and call method :php:`shortcutExists()` to get the same behavior.
.. index:: Backend, PHP-API, FullyScanned, ext:backend
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _deprecation-84584:
=========================================================================================
Deprecation: #84584 - AdminPanelView: isAdminModuleEnabled and ext_makeToolbar deprecated
=========================================================================================
See :issue:`84584`
Description
===========
Due to the complete refactoring of the admin panel, the following methods have been deprecated:
- :php:`\TYPO3\CMS\Adminpanel\View\AdminPanelView::isAdminModuleEnabled()`
- :php:`\TYPO3\CMS\Adminpanel\View\AdminPanelView::ext_makeToolBar()`
Impact
======
Calling either one of the methods results in a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Installations calling either one of the methods mentioned.
Migration
=========
Migrate :php:`\TYPO3\CMS\Adminpanel\View\AdminPanelView::isAdminModuleEnabled()`:
- Refactor your admin panel modules to the new API (using :php:`AbstractModule` / :php:`AdminPanelModuleInterface`) and check via :php:`Module->isEnabled()`.
- When using this with existing admin panel modules call :php:`isEnabled()` on the new module instance instead.
Migrate :php:`\TYPO3\CMS\Adminpanel\View\AdminPanelView::ext_makeToolBar()`:
- When creating custom edit toolbars, build them by yourself matching your templates and styles - you can use :php:`\TYPO3\CMS\Adminpanel\Service\EditToolbarService::createToolbar()` as an inspiration on how to do so.
.. index:: Frontend, PHP-API, FullyScanned, ext:adminpanel
@@ -0,0 +1,48 @@
.. include:: /Includes.rst.txt
.. _deprecation-85004:
============================================================
Deprecation: #85004 - Deprecate methods in ReflectionService
============================================================
See :issue:`85004`
Description
===========
The following methods within :php:`TYPO3\CMS\Extbase\Reflection\ReflectionService` have been marked
as deprecated:
* :php:`getClassTagsValues()`
* :php:`getClassTagValues()`
* :php:`getClassPropertyNames()`
* :php:`hasMethod()`
* :php:`getMethodTagsValues()`
* :php:`getMethodParameters()`
* :php:`getPropertyTagsValues()`
* :php:`getPropertyTagValues()`
* :php:`isClassTaggedWith()`
* :php:`isPropertyTaggedWith()`
Impact
======
Calling any of the deprecated methods above will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with a custom extension trying to gather reflection data via :php:`TYPO3\CMS\Extbase\Reflection\ReflectionService`
Migration
=========
Instead of fetching reflection data via :php:`TYPO3\CMS\Extbase\Reflection\ReflectionService`, the needed data should
directly be fetched from a :php:`TYPO3\CMS\Extbase\Reflection\ClassSchema` instance. An instance can be created by calling
:php:`TYPO3\CMS\Extbase\Reflection\ReflectionService::getClassSchema()`.
.. index:: PHP-API, ext:extbase, FullyScanned
@@ -0,0 +1,50 @@
.. include:: /Includes.rst.txt
.. _deprecation-85164:
==============================================
Deprecation: #85164 - Language related methods
==============================================
See :issue:`85164`
Description
===========
Various methods related to site language handling have been marked as deprecated:
* :php:`TYPO3\CMS\Info\Controller\TranslationStatusController->getSystemLanguages()`
* :php:`TYPO3\CMS\Backend\View\PageLayoutView->languageFlag()`
These properties have been marked as deprecated:
* :php:`TYPO3\CMS\Backend\View\PageLayoutView->languageIconTitles`
* :php:`TYPO3\CMS\Backend\View\PageLayoutView->translateTools`
Impact
======
Calling one of the above methods will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Instances with extensions calling one of the methods mentioned above.
Migration
=========
Above calls can often be substituted using the :php:`Site` object that is always
initialized during core bootstrap. In backend HTTP use cases, the object can be retrieved
using code like this:
.. code-block:: php
$currentSite = $request->getAttribute('site');
$availableLanguages = $currentSite->getAvailableLanguages($this->getBackendUser(), false, $this->id);
.. index:: PHP-API, FullyScanned
@@ -0,0 +1,54 @@
.. include:: /Includes.rst.txt
.. _deprecation-85196:
===================================================
Deprecation: #85196 - Protect SetupModuleController
===================================================
See :issue:`85196`
Description
===========
This file is about third party usage (consumer that call the class as well as
signals or hooks depending on it) of :php:`TYPO3\CMS\Setup\Controller\SetupModuleController`.
A series of class properties changed visibility to protected.
They will trigger PHP :php:`E_USER_DEPRECATED` errors if called from outside:
* :php:`$OLD_BE_USER`
* :php:`$MOD_MENU`
* :php:`$MOD_SETTINGS`
* [not scanned] :php:`$content`
* :php:`$overrideConf`
* :php:`$languageUpdate`
These methods have been marked as deprecated and will be removed with TYPO3 v10:
* :php:`getFormProtection()`
* :php:`simulateUser()`
Impact
======
Calling one of the methods mentioned above or accessing one of the properties on an instance of
:php:`SetupModuleController` will trigger a PHP :php:`E_USER_DEPRECATED` error in TYPO3 v9 and a PHP fatal error in TYPO3 v10.
Affected Installations
======================
The extension scanner will find most usages, but may also find some false positives. The most
common property and method names like :php:`$content` are not registered and will not be found
if an extension uses that on an instance of :php:`SetupModuleController`.
Migration
=========
In general, extensions should not instantiate and re-use controllers of the core. Existing
usages should be rewritten to be free of calls like these.
.. index:: Backend, PHP-API, PartiallyScanned, ext:setup
@@ -0,0 +1,56 @@
.. include:: /Includes.rst.txt
.. _deprecation-85285:
=======================================================
Deprecation: #85285 - Deprecated path related constants
=======================================================
See :issue:`85285`
Description
===========
The following constants have been marked as deprecated and should not be used any longer:
* :php:`PATH_thisScript`
Use :php:`Environment::getCurrentScript()` instead
* :php:`PATH_site`
Use :php:`Environment::getPublicPath() . '/'` instead
* :php:`PATH_typo3`
Use :php:`Environment::getPublicPath() . '/typo3/'` instead
* :php:`PATH_typo3conf`
Use :php:`Environment::getPublicPath() . '/typo3conf'` instead
* :php:`TYPO3_OS`
Use :php:`Environment::isWindows()` and :php:`Environment::isUnix()` instead
Impact
======
The above constants are still defined in TYPO3 v9, but their definition will be
dropped in v10.
Affected Installations
======================
Constants can not be deprecated as such and using them does not trigger a PHP :php:`E_USER_DEPRECATED` error.
Extensions in v9 should not use them any longer but switch to the alternatives already.
The extension scanner will find usages of the above constants and marks them as strong
matches.
Migration
=========
Usages of the above constants should be switched to the Environment class methods instead.
.. index:: PHP-API, FullyScanned
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-85300:
==================================================
Deprecation: #85300 - DataHandler resorting method
==================================================
See :issue:`85300`
Description
===========
The public :php:`DataHandler->resorting` method has been marked as deprecated. It will be removed in v10.0.
Impact
======
Installations using this method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
All installations xclassing DataHandler, or having call the method mentioned.
Migration
=========
Use the newly introduced :php:`DataHandler->increaseSortingOfFollowingRecords` method instead.
.. index:: Backend, FullyScanned, ext:core
@@ -0,0 +1,53 @@
.. include:: /Includes.rst.txt
.. _deprecation-85389:
=======================================================================
Deprecation: #85389 - Various public properties in favor of Context API
=======================================================================
See :issue:`85389`
Description
===========
The following properties have been marked as deprecated in favor of the newly introduced Context API:
* :php:`TypoScriptFrontendController->loginUser`
* :php:`TypoScriptFrontendController->gr_list`
* :php:`TypoScriptFrontendController->beUserLogin`
* :php:`TypoScriptFrontendController->showHiddenPage`
* :php:`TypoScriptFrontendController->showHiddenRecords`
The Context API supersedes the public properties in favor of decoupling the information from global objects.
Impact
======
Reading or writing information on any of the public properties will trigger a PHP :php:`E_USER_DEPRECATED` error,
however the value is still stored and contains the same information as before.
Affected Installations
======================
Any TYPO3 installation using extensions accessing this kind of information.
Migration
=========
Use Context API / Aspects instead to read from this information.
Instantiate the context object and get an aspect:
* :php:`$context = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Context\Context::class);`
* :php:`$context->getPropertyFromAspect('visibility', 'includeHiddenPages')` instead of :php:`$TSFE->showHiddenPage`
* :php:`$context->getPropertyFromAspect('visibility', 'includeHiddenContent')` instead of :php:`$TSFE->showHiddenRecords`
* :php:`$context->getPropertyFromAspect('frontend.user', 'isLoggedIn')` instead of :php:`$TSFE->loginUser`
* :php:`$context->getPropertyFromAspect('backend.user', 'isLoggedIn')` instead of :php:`$TSFE->beUserLogin`
* :php:`$context->getPropertyFromAspect('frontend.user', 'groupIds')` instead of :php:`$TSFE->gr_list`
For more information see :ref:`Context API chapter<t3coreapi:context-api>` in TYPO3 Explained.
.. index:: Frontend, PHP-API, FullyScanned
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _deprecation-85394:
==============================================================
Deprecation: #85394 - Class Core\Database\PdoHelper deprecated
==============================================================
See :issue:`85394`
Description
===========
The PHP class :php:`TYPO3\CMS\Core\Database\PdoHelper` and its static method
:php:`importSql()` have been marked as deprecated.
Impact
======
Using the method triggers a PHP :php:`E_USER_DEPRECATED` error, the class will be removed in TYPO3 v10.
Affected Installations
======================
Instances with extensions calling :php:`TYPO3\CMS\Core\Database\PdoHelper::importSql()`.
The extension scanner will find affected extensions.
Migration
=========
The method has been of limited use from an extension point of view. If needed by an extension,
the method should be copied over into extension code.
.. index:: Database, PHP-API, FullyScanned
@@ -0,0 +1,36 @@
.. include:: /Includes.rst.txt
.. _deprecation-85408:
=======================================================
Deprecation: #85408 - TemplateService init() deprecated
=======================================================
See :issue:`85408`
Description
===========
Method :php:`TYPO3\CMS\Core\TypoScript\TemplateService->init()` has been marked as deprecated
and should not be used any longer.
Impact
======
Calling above method triggers a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Instances with extensions calling the above method. However, the extension scanner
is not configured to find this too generic method name.
Migration
=========
The business code of the method is done within :php:`__construct()`, an explicit call
to :php:`init()` is no longer needed and can be removed.
.. index:: PHP-API, NotScanned
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _deprecation-85445:
==================================================
Deprecation: #85445 - TemplateService->getFileName
==================================================
See :issue:`85445`
Description
===========
The PHP method :php:`TYPO3\CMS\Core\TypoScript\TemplateService->getFileName()` has been marked as deprecated, as
it is technically extracted into separate functionality with modern architecture throwing PHP Exceptions when
a file name is invalid.
Along with the method the public property :php:`$fileCache` has been marked as deprecated, which acted as a simple first-level
in-memory cache.
Impact
======
Calling the method directly or accessing the public property will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation dealing with PHP code in Frontend (e.g. `$TSFE->tmpl->getFileName()`).
Migration
=========
Use :php:`TYPO3\CMS\Frontend\Resource\FilePathSanitizer->sanitize($filePath)` instead.
.. index:: Frontend, PHP-API, FullyScanned
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _deprecation-85451:
========================================================================
Deprecation: #85451 - ContentObjectRenderer->calcIntExplode() deprecated
========================================================================
See :issue:`85451`
Description
===========
Method :php:`TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->calcIntExplode()`
has been marked as deprecated and should not be used any longer.
Impact
======
Using the method will trigger a PHP :php:`E_USER_DEPRECATED` error, the method will
be removed in TYPO3 v10.
Affected Installations
======================
The tiny method has been a helper for GMENU rendering and was
most likely only used internally. The extension scanner will
find possible usages within extensions.
Migration
=========
Copy the method to the extension code if needed.
.. index:: Frontend, PHP-API, FullyScanned
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _deprecation-85462-1668719172:
=====================================================
Deprecation: #85462 - Signal 'hasInstalledExtensions'
=====================================================
See :issue:`85462`
Description
===========
The usage of signal :php:`hasInstalledExtensions` of class
:php:`\TYPO3\CMS\Extensionmanager\Service\ExtensionManagementService`
has been marked as deprecated and will be removed in TYPO3 v10.
The signal is a duplication of :php:`afterExtensionInstall` that is also emitted during
extension installation.
Impact
======
Slots of this signal will get executed in TYPO3 v9 but will be abandoned with TYPO3 v10.
Affected Installations
======================
Extensions that register slots for the signal :php:`hasInstalledExtensions` of class
:php:`\TYPO3\CMS\Extensionmanager\Service\ExtensionManagementService`.
Migration
=========
Extensions should use the signal :php:`afterExtensionInstall` of class
:php:`\TYPO3\CMS\Extensionmanager\Utility\InstallUtility` instead which is emitted after an
extension has been installed.
.. index:: Backend, LocalConfiguration, PHP-API, NotScanned, ext:extensionmanager
@@ -0,0 +1,44 @@
.. include:: /Includes.rst.txt
.. _deprecation-85462:
===========================================================
Deprecation: #85462 - Signal 'tablesDefinitionIsBeingBuilt'
===========================================================
See :issue:`85462`
Description
===========
The usage of signal :php:`tablesDefinitionIsBeingBuilt` of class
:php:`\TYPO3\CMS\Extensionmanager\Utility\InstallUtility`
has been marked as deprecated and will be removed in TYPO3 v10.
The signal is a duplication of :php:`tablesDefinitionIsBeingBuilt` of class
:php:`\TYPO3\CMS\Install\Service\SqlExpectedSchemaService` that is now also emitted during
extension installation.
Impact
======
Slots of this signal will get executed in TYPO3 v9 but will be abandoned with TYPO3 v10. If a slot provides
SQL definitions a PHP :php:`E_USER_DEPRECATED` error is triggered.
Affected Installations
======================
Extensions that register slots for the signal :php:`tablesDefinitionIsBeingBuilt` of class
:php:`\TYPO3\CMS\Extensionmanager\Utility\InstallUtility`.
Migration
=========
Extensions should use the signal :php:`tablesDefinitionIsBeingBuilt` of class
:php:`\TYPO3\CMS\Install\Service\SqlExpectedSchemaService` instead which is now emitted during an
extension installation.
.. index:: Backend, LocalConfiguration, PHP-API, NotScanned, ext:extensionmanager
@@ -0,0 +1,60 @@
.. include:: /Includes.rst.txt
.. _deprecation-85543:
====================================================================================================
Deprecation: #85543 - Language-related properties in TypoScriptFrontendController and PageRepository
====================================================================================================
See :issue:`85543`
Description
===========
With the introduction of a LanguageAspect within the new Context API, the following public properties
have been marked as deprecated:
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->sys_language_uid`
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->sys_language_content`
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->sys_language_contentOL`
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->sys_language_mode`
* :php:`TYPO3\CMS\Frontend\Page\PageRepository->sys_language_uid`
Additionally, in order to create a better abstraction, the third constructor argument of
:php:`TYPO3\CMS\Core\Utility\RootlineUtility` now expects a :php:`Context` object instead of a :php:`PageRepository`.
Impact
======
Accessing or setting one of the properties will trigger a PHP :php:`E_USER_DEPRECATED` error.
Calling RootlineUtility constructor with a PageRepository as a third argument will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any multi-lingual TYPO3 installation with custom non-Extbase-related PHP code.
Migration
=========
Use the new :php:`LanguageAspect` with various superior properties to access the various values.
.. code-block:: php
$languageAspect = GeneralUtility::makeInstance(Context::class)->getAspect('language');
// (previously known as TSFE->sys_language_uid)
$languageAspect->getId();
// (previously known as TSFE->sys_language_content)
$languageAspect->getContentId();
// (previously known as TSFE->sys_language_contentOL)
$languageAspect->getLegacyOverlayType();
// (previously known as TSFE->sys_language_mode)
$languageAspect->getLegacyLanguageMode();
Also, have a detailed look on what other properties the language aspect offers for creating fallback chains,
and more sophisticated overlays.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _deprecation-85553:
=======================================================================================
Deprecation: #85553 - PageRepository language-related methods use null as default value
=======================================================================================
See :issue:`85553`
Description
===========
The second parameter of the following methods now have a different default value (:php:`null`) than
before (:php:`-1`), to detect if the parameter is omitted or passed in explicitly:
* :php:`TYPO3\CMS\Frontend\Page\PageRepository->getPageOverlay()`
* :php:`TYPO3\CMS\Frontend\Page\PageRepository->getPagesOverlay()`
Impact
======
Calling one of these methods with the second argument with :php:`-1` will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom extensions related to language handling.
Migration
=========
In the unlikely case of directly calling these methods with :php:`-1`, it is recommended to remove
the second (optional) parameter completely, which will work in TYPO3 v8, TYPO3 v9 and in TYPO3 v10.
.. index:: Frontend, PHP-API, NotScanned, ext:frontend
@@ -0,0 +1,35 @@
.. include:: /Includes.rst.txt
.. _deprecation-85554:
==========================================================
Deprecation: #85554 - PageRepository->checkWorkspaceAccess
==========================================================
See :issue:`85554`
Description
===========
The unused method :php:`TYPO3\CMS\Frontend\Page\PageRepository->checkWorkspaceAccess()` has been marked as
deprecated.
Impact
======
Calling the method directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom extensions calling this public method directly.
Migration
=========
Implement the check on :php:`BE_USER->checkWorkspace($workspaceId)` directly in the callers code.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,36 @@
.. include:: /Includes.rst.txt
.. _deprecation-85555:
===============================================================
Deprecation: #85555 - TypoScriptFrontendController->getUniqueId
===============================================================
See :issue:`85555`
Description
===========
The unused method :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->getUniqueId()` has been marked as
deprecated.
Impact
======
Calling the method directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom extensions calling this public method directly.
Migration
=========
It is recommended to build a fully unique string functionality in a separate PHP class, if needed, decorated
with a proper singleton pattern, or a runtime cache.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _deprecation-85556:
===========================================================
Deprecation: #85556 - PageRepository->versioningWorkspaceId
===========================================================
See :issue:`85556`
Description
===========
The public property :php:`TYPO3\CMS\Frontend\Page\PageRepository->versioningWorkspaceId` has been marked as
deprecated.
Impact
======
Accessing or setting the property directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom extensions calling this public property directly.
Migration
=========
Use the Context API and its workspace aspect
:php:`GeneralUtility::makeInstance(Context::class)->getPropertyFromAspect('workspace', 'id', 0);`
directly when reading the workspace ID, or instantiate a custom PageRepository with a custom context (see Context
API docs) for custom usages.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,36 @@
.. include:: /Includes.rst.txt
.. _deprecation-85557:
=================================================
Deprecation: #85557 - PageRepository->getRootLine
=================================================
See :issue:`85557`
Description
===========
The public method :php:`TYPO3\CMS\Frontend\Page\PageRepository->getRootLine()` has been marked as
deprecated.
Impact
======
Calling the method directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom extensions calling this method directly.
Migration
=========
As `getRootLine()` acts as a simple wrapper around `RootlineUtility`, it is recommended to instantiate
the RootLineUtility directly and catch any specific exceptions directly.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,36 @@
.. include:: /Includes.rst.txt
.. _deprecation-85558:
=========================================================
Deprecation: #85558 - ContentObjectRenderer->enableFields
=========================================================
See :issue:`85558`
Description
===========
The public method :php:`TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer->enableFields()` has been marked as
deprecated.
Impact
======
Calling the method directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom extensions calling this method directly.
Migration
=========
As :php:`enableFields()` acts as a simple wrapper around :php:`PageRepository->enableFields()`, it is recommended
to instantiate PageRepository directly.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,46 @@
.. include:: /Includes.rst.txt
.. _deprecation-85646:
=========================================================
Deprecation: #85646 - Deprecate eID implemented as script
=========================================================
See :issue:`85646`
Description
===========
Calling a frontend eID as a direct script call has been marked as deprecated.
Setting a PHP eID include like this triggers PHP :php:`E_USER_DEPRECATED` error::
$GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['myEid'] = 'EXT:myExt/Resources/Php/MyAjax.php';
This is not valid anymore. Instead, a class / method combination should be used::
$GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['myEid'] = \MyVendor\MyExt\Controller\MyEidController::class . '::myMethod';
The main difference is that a script call does not execute code if calling :php:`require()` on
it directly anymore, but needs a proper registration including an entry method to be called.
This increases encapsulation and security.
Impact
======
eIDs which are registered with a direct script include trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
3rd party extensions which implement eIDs with a script to a file instead of
a class->method combination.
Migration
=========
Register eID with a class::method syntax like :php:`\TYPO3\CMS\Frontend\MyClass::myMethod` instead.
.. index:: Frontend, NotScanned
@@ -0,0 +1,35 @@
.. include:: /Includes.rst.txt
.. _deprecation-85666:
================================================================
Deprecation: #85666 - TypoScriptFrontendController->initTemplate
================================================================
See :issue:`85666`
Description
===========
The method :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->initTemplate()` has been marked as
deprecated.
Impact
======
Calling the method directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom extensions calling this public method directly.
Migration
=========
The method call can simply get removed, the TemplateService in instantiated by TSFE on demand.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-85678-1668719172:
=============================================
Deprecation: #85678 - config.titleTagFunction
=============================================
See :issue:`85678`
Description
===========
The TypoScript option :typoscript:`config.titleTagFunction` has been marked as deprecated and will be removed with TYPO3 v10.
Impact
======
Installations using the option will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Instances using the option.
Migration
=========
Please use the new PageTitle API to alter the title tag.
.. index:: TypoScript, NotScanned
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-85678:
====================================================
Deprecation: #85678 - $GLOBALS['TSFE']->altPageTitle
====================================================
See :issue:`85678`
Description
===========
The PHP property :php:`$GLOBALS['TSFE']->altPageTitle` has been marked as deprecated and will be removed with TYPO3 v10.
Impact
======
Installations using this property will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Instances using the property.
Migration
=========
Please use the new PageTitle API to alter the title tag.
.. index:: TypoScript, NotScanned
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _deprecation-85687:
==================================================
Deprecation: #85687 - Deprecate RuntimeCacheWriter
==================================================
See :issue:`85687`
Description
===========
The RuntimeCacheWriter was introduced in TYPO3 9.3 and misused the TYPO3 Caching Framework to provide InMemoryLogging
for the AdminPanel. Instead of having a generic LogWriter in the LoggingFramework this belongs
to the admin panel scope wise and implementation wise separated from the CachingFramework.
The RuntimeCacheWriter has therefore been deprecated and the AdminPanel will use custom log writers on demand when
they will become necessary.
Impact
======
Calling RuntimeCacheWriter will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any installation using the RuntimeCacheWriter.
Migration
=========
Write your own CacheWriter (see `\TYPO3\CMS\Core\Log\Writer\WriterInterface`) or - if you need the exact same
functionality - copy the old RuntimeCacheWriter to your own extension scope and use it.
.. index:: PHP-API, FullyScanned, ext:adminpanel
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _deprecation-85699:
=======================================================
Deprecation: #85699 - Various methods in PageRepository
=======================================================
See :issue:`85699`
Description
===========
The methods :php:`PageRepository::getMovePlaceholder()` and :php:`PageRepository::movePlhOL()`
have been marked as internal.
The methods :php:`PageRepository::getRecordsByField` and :php:`PageRepository::getFileReferences()`
have been marked as deprecated and will be removed in TYPO3 v10.
Impact
======
Calling one of the mentioned methods will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Third party code which calls the methods mentioned above.
Migration
=========
No direct migration available.
If you need one of the mentioned methods you can copy them over to your extension.
.. index:: Frontend, FullyScanned
@@ -0,0 +1,36 @@
.. include:: /Includes.rst.txt
.. _deprecation-85701:
=======================================================
Deprecation: #85701 - Various methods in ModuleTemplate
=======================================================
See :issue:`85701`
Description
===========
The methods :php:`ModuleTemplate::icons()` and :php:`ModuleTemplate::loadJavascriptLib()`
have been marked as deprecated and will be removed in TYPO3 v10.
Impact
======
Calling one of the mentioned methods will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Third party code which calls the methods mentioned.
Migration
=========
There is no migration for the method :php:`ModuleTemplate::icons()` available.
The method :php:`ModuleTemplate::loadJavascriptLib()` can be replaced by using :php:`PageRenderer` directly.
.. index:: Backend, FullyScanned
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _deprecation-85707:
=============================================
Deprecation: #85707 - LoginFramesetController
=============================================
See :issue:`85707`
Description
===========
The class :php:`TYPO3\CMS\Backend\Controller\LoginFramesetController` builds a simple HTML frameset
and has been replaced by using the full logic within :php:`LoginController` or a request to
`index.php?loginRefresh=1` directly.
Impact
======
Instantiating the LoginFramesetController class will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with custom logic using the rare functionality of LoginFramesetController.
Migration
=========
Reference `index.php?loginRefresh=1` in the callers code directly, or re-implement the frameset if
necessary.
.. index:: Backend, FullyScanned, ext:backend
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _deprecation-85727:
==================================================================
Deprecation: #85727 - DatabaseIntegrityCheck moved to EXT:lowlevel
==================================================================
See :issue:`85727`
Description
===========
The PHP class :php:`TYPO3\CMS\Core\Integrity\DatabaseIntegrityCheck` has been moved from the system
extension `core` to `lowlevel`. The PHP class has been renamed to
:php:`TYPO3\CMS\Lowlevel\Integrity\DatabaseIntegrityCheck`.
Impact
======
Calling the old class name will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation where this PHP class is in use within a TYPO3 extension.
Migration
=========
Ensure that the system extension `lowlevel` is installed, and the caller code uses the new class name.
For TYPO3 v9, the old class is kept in place and will be removed in TYPO3 v10.
.. index:: ext:lowlevel, FullyScanned
@@ -0,0 +1,40 @@
.. include:: /Includes.rst.txt
.. _deprecation-85735:
=====================================================================
Deprecation: #85735 - Various method and property in DocumentTemplate
=====================================================================
See :issue:`85735`
Description
===========
The method :php:`DocumentTemplate::addStyleSheet()` has been marked as deprecated.
The property :php:`DocumentTemplate::hasDocheader` has been marked as protected as the property is not evaluated anymore in the core.
Impact
======
Calling :php:`DocumentTemplate::addStyleSheet()` will trigger a PHP :php:`E_USER_DEPRECATED` error.
Using the property :php:`DocumentTemplate::hasDocheader` will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Instances with third party code directly accessing the method or the property.
Migration
=========
:php:`DocumentTemplate::addStyleSheet()` can be replaced by using :php:`PageRenderer::addCssFile()`.
The property has no migration available.
.. index:: Backend, FullyScanned, PHP-API
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-85759:
=================================================
Deprecation: #85759 - GeneralUtility::getHostName
=================================================
See :issue:`85759`
Description
===========
The method :php:`GeneralUtility::getHostName()` has been marked as deprecated and will be removed in TYPO3 v10.
Impact
======
Calling the mentioned method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Third party code which accesses the method.
Migration
=========
No migration available.
.. index:: PHP-API, FullyScanned
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-85760:
======================================================
Deprecation: #85760 - GeneralUtility::unQuoteFilenames
======================================================
See :issue:`85760`
Description
===========
The method :php:`GeneralUtility::unQuoteFilenames()` has been marked as deprecated and will be removed in TYPO3 v10.
Impact
======
Calling the mentioned method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Third party code which accesses the method.
Migration
=========
No migration available.
.. index:: PHP-API, FullyScanned
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _deprecation-85761:
===========================================
Deprecation: #85761 - SaltedPasswordService
===========================================
See :issue:`85761`
Description
===========
Class :php:`TYPO3\CMS\Saltedpasswords\SaltedPasswordService` has been deprecated and
should not be used any longer.
Impact
======
Instantiating :php:`SaltedPasswordService` will log a deprecation message.
Affected Installations
======================
This class is usually not called by extensions, it is unlikely instances are affected by this.
Migration
=========
The service has been migrated into the basic core authentication service chain for
frontend and backend. Usually no migration is needed.
.. index:: PHP-API, FullyScanned, ext:saltedpasswords
@@ -0,0 +1,63 @@
.. include:: /Includes.rst.txt
.. _deprecation-85793:
=====================================================================
Deprecation: #85793 - Several constants from SystemEnvironmentBuilder
=====================================================================
See :issue:`85793`
Description
===========
The following constants have been deprecated and should not be used any longer:
* :php:`NUL` (Use :php:`"\0"` instead)
* :php:`TAB` (Use :php:`"\t"` instead)
* :php:`SUB` (Use :php:`chr(26)` instead)
* :php:`TYPO3_URL_MAILINGLISTS`
* :php:`TYPO3_URL_DOCUMENTATION`
* :php:`TYPO3_URL_DOCUMENTATION_TSREF`
* :php:`TYPO3_URL_DOCUMENTATION_TSCONFIG`
* :php:`TYPO3_URL_CONSULTANCY`
* :php:`TYPO3_URL_CONTRIBUTE`
* :php:`TYPO3_URL_SECURITY`
* :php:`TYPO3_URL_DOWNLOAD`
* :php:`TYPO3_URL_SYSTEMREQUIREMENTS`
Impact
======
The above constants are still defined in TYPO3 v9, but their definition will be
dropped in TYPO3 v10.
Affected Installations
======================
Constants can not be deprecated as such and using them does not trigger a PHP :php:`E_USER_DEPRECATED` error.
Extensions in TYPO3 v9 should not use them any longer but switch to the alternatives already.
The extension scanner will find usages of the above constants and marks them as strong
matches.
Migration
=========
Use one of the :php:`chr(*)` variants or replace the constant usage with the URL in your own code.
.. index:: PHP-API, FullyScanned
@@ -0,0 +1,54 @@
.. include:: /Includes.rst.txt
.. _deprecation-85796:
===============================================
Deprecation: #85796 - Salted passwords cleanups
===============================================
See :issue:`85796`
Description
===========
These methods have been marked as deprecated:
:php:`TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance()`
Use :php:`SaltFactory->get()` to retrieve a hash instance of for a given password hash.
Use :php:`SaltFactory->getDefaultHashInstance()` to retrieve an instance of the configured default hash algorithm
for a given context. See the method comments for usage details.
:php:`TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::determineSaltingHashingMethod()`
Use :php:`SaltFactory->getDefaultHashInstance()` instead.
:php:`TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::setPreferredHashingMethod()`
This method was only used for unit testing and has been marked as deprecated without substitution since
object instances of :php:`SaltFactory` can now be properly mocked.
Use :php:`Prophecy` to do that in unit tests that have :php:`SaltFactory` as dependency.
:php:`TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility->getNumberOfBackendUsersWithInsecurePassword()`
This internal method is unused and there is no new implementation to substitute it.
Impact
======
Calling one of the above methods will trigger a PHP :php:`E_USER_DEPRECATED` error and a fatal PHP error in TYPO3 v10.
Affected Installations
======================
Most instances are not affected by this change if they don't have custom authentication
services loaded that add magic with stored local password hashes, and if they don't use
the :php:`SaltFactory` in own extension which is a seldom use case.
The extension scanner will find usages in extensions.
Migration
=========
Use the new factory methods as outlined in the description section.
.. index:: PHP-API, FullyScanned, ext:saltedpasswords
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _deprecation-85801:
============================================================================
Deprecation: #85801 - GeneralUtility::explodeUrl2Array - 2nd method argument
============================================================================
See :issue:`85801`
Description
===========
The second argument in :php:`TYPO3\CMS\Core\Utility\GeneralUtility::explodeUrl2Array()` has been marked as deprecated.
Setting this (optional) argument to :php:`true` calls the native PHP function :php:`parse_str()`, which
should be used instead directly.
Impact
======
Calling the method with an explicitly set second argument will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with a custom extension calling the method above with a second method argument.
Migration
=========
If the second argument was set to :php:`true` before, use the native PHP function :php:`parse_str()`, if the
second parameter was set to :php:`false` before, just remove it from the method call.
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,36 @@
.. include:: /Includes.rst.txt
.. _deprecation-85802:
=======================================================================
Deprecation: #85802 - Move FlexFormService from EXT:extbase to EXT:core
=======================================================================
See :issue:`85802`
Description
===========
Move FlexFormService from EXT:extbase to EXT:core.
Impact
======
The PHP class :php:`TYPO3\CMS\Extbase\Service\FlexFormService` has been moved from the system
extension `extbase` to `core`. The PHP class has been renamed to
:php:`TYPO3\CMS\Core\Service\FlexFormService`.
Affected Installations
======================
Any TYPO3 installation where this PHP class is in use within a TYPO3 extension.
Migration
=========
Use the new namespace to reference the :php:`TYPO3\CMS\Core\Service\FlexFormService`.
.. index:: PHP-API, FullyScanned, ext:extbase
@@ -0,0 +1,139 @@
.. include:: /Includes.rst.txt
.. _deprecation-85804:
=============================================================
Deprecation: #85804 - Salted password hash class deprecations
=============================================================
See :issue:`85804`
Description
===========
Selecting the hash algorithm used to store frontend and backend user hashes is
now a "preset" and can be changed using "Admin tools" -> "Settings" -> "Configuration Presets".
Existing settings are updated automatically when upgrading from an older TYPO3 version to
TYPO3 v9. The detail list below is only interesting for instances that need to
run custom hash mechanisms.
The password hash mechanism used for backend user passwords has been moved from
:php:`$GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['saltedpasswords']['BE']['saltedPWHashingMethod']`
to :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['className']`. Options for a specific
hash algorithms can be defined using :php:`$GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['options']`.
The password hash mechanism used for frontend user passwords has been moved from
:php:`$GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['saltedpasswords']['FE']['saltedPWHashingMethod']`
to :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['passwordHashing']['className']`. Options for a specific
hash algorithms can be defined using :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['passwordHashing']['options']`.
Custom password hash algorithms should now be registered in
:php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['availablePasswordHashAlgorithms']`.
The usage of the former array entry
:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/saltedpasswords']['saltMethods']` has been marked as deprecated.
These interfaces and classes have been marked as deprecated and should not be implemented any longer:
* :php:`TYPO3\CMS\Saltedpasswords\Salt\ComposedSaltInterface`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\AbstractComposedSalt`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Utility\ExtensionManagerConfigurationUtility`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Utility\SaltedPasswordsUtility`
An interface has been changed:
* :php:`TYPO3\CMS\Saltedpasswords\Salt\SaltInterface->getHashedPassword(string $password)` - The
second argument has been dropped. Classes implementing the interface should remove the second argument.
These methods have been marked as deprecated:
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Argon2iSalt->getOptions()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Argon2iSalt->setOptions()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BcryptSalt->getOptions()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BcryptSalt->setOptions()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->getHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->getMaxHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->getMinHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->getSaltLength()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->getSetting()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->setHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->setMaxHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->setMinHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Md5Salt->getSetting()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Md5Salt->getSaltLength()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->getHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->getMaxHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->getMinHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->getSaltLength()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->getSetting()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->setHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->setMaxHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->setMinHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->getHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->getMaxHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->getMinHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->getSaltLength()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->getSetting()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->setHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->setMaxHashCount()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->setMinHashCount()`
These methods changed their signature:
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->getHashedPassword()` - Second argument marked as deprecated
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Md5Salt->getHashedPassword()` - Second argument marked as deprecated
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->getHashedPassword()` - Second argument marked as deprecated
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->getHashedPassword()` - Second argument marked as deprecated
These methods changed their visibility from public to protected:
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->isValidSalt()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt->base64Encode()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Md5Salt->isValidSalt()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Md5Salt->base64Encode()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->isValidSalt()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->base64Encode()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt->base64Decode()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->isValidSalt()`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt->base64Encode()`
These class constants have been marked as deprecated and will be removed in TYPO3 v10:
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt::ITOA64`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt::HASH_COUNT`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt::MAX_HASH_COUNT`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt::MIN_HASH_COUNT`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Md5Salt::ITOA64`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::ITOA64`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::HASH_COUNT`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::MAX_HASH_COUNT`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::MIN_HASH_COUNT`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::ITOA64`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::HASH_COUNT`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::MAX_HASH_COUNT`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::MIN_HASH_COUNT`
Impact
======
Using functionality from the above list will trigger PHP :php:`E_USER_DEPRECATED` errors.
Affected Installations
======================
Almost no TYPO3 instances are directly affected by the changes outlined above. A configuration
upgrade is in place to move from old to new settings when calling the install tool the first time
after upgrade without further user interaction.
If in rare cases an existing TYPO3 instance runs custom salt mechanisms, the extension scanner
will find affected code places that should be adapted.
Migration
=========
If the extension scanner finds affected code, adapt the method calls, class constant usages and interface usages.
.. index:: PHP-API, FullyScanned, ext:saltedpasswords
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _deprecation-85806:
==================================================================================
Deprecation: #85806 - Second argument of PageRenderer::addInlineLanguageLabelArray
==================================================================================
See :issue:`85806`
Description
===========
The second argument in :php:`TYPO3\CMS\Core\Page\PageRenderer::addInlineLanguageLabelArray()` has been marked as deprecated.
Setting this (optional) argument to :php:`true` must be resolved by using the :php:`TYPO3\CMS\Core\Localization\LanguageService` directly.
Impact
======
Calling the method with an explicitly set second argument will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with a custom extension calling the method above with a second method argument.
Migration
=========
If the second argument was set to :php:`true` before, use the :php:`TYPO3\CMS\Core\Localization\LanguageService`. If the
second parameter was set to :php:`false` before, just remove it from the method call.
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-85807:
================================================================
Deprecation: #85807 - EnvironmentService::isEnvironmentInCliMode
================================================================
See :issue:`85807`
Description
===========
The method :php:`TYPO3\CMS\Extbase\Service\EnvironmentService::isEnvironmentInCliMode()` has been marked as deprecated.
Impact
======
Calling the method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with a custom extension calling the method above.
Migration
=========
Use :php:`TYPO3\CMS\Core\Core\Environment::isCli()` as replacement.
.. index:: PHP-API, FullyScanned, ext:extbase
@@ -0,0 +1,55 @@
.. include:: /Includes.rst.txt
.. _deprecation-85821:
=======================================
Deprecation: #85821 - bootstrap methods
=======================================
See :issue:`85821`
Description
===========
The following methods of :php:`TYPO3\CMS\Core\Core\Bootstrap` have been marked as deprecated. Some of
them will just change their visibility from public to protected in TYPO3 v10 and thus should not
be called externally any longer:
* :php:`TYPO3\CMS\Core\Core\Bootstrap::usesComposerClassLoading()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap::getInstance()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap->configure()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap::checkIfEssentialConfigurationExists()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap->setEarlyInstance()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap->getEarlyInstance()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap->getEarlyInstances()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap::loadConfigurationAndInitialize()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap->initializePackageManagement()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap::populateLocalConfiguration()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap::disableCoreCache()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap::initializeCachingFramework()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap->setRequestType()`
* :php:`TYPO3\CMS\Core\Core\Bootstrap::setFinalCachingFrameworkCacheConfiguration()`
Impact
======
This deprecation is only interesting for code that interferes with early core bootstrap.
Those may trigger PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Instances using early bootstrap code may be affected by this. Those should strive for
using the general entry method :php:`Bootstrap::init()` instead.
Migration
=========
See changes on the typo3/testing-framework which formerly used early instance
bootstrap calls for an example on how existing code can be refactored to use
the top level :php:`Bootstrap::init()` instead.
.. index:: PHP-API, FullyScanned
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _deprecation-85822:
============================================================================
Deprecation: #85822 - Static class TYPO3\\CMS\\Frontend\\Page\\PageGenerator
============================================================================
See :issue:`85822`
Description
===========
The PSR-15 RequestHandler is responsible for compiling content. There is no need anymore to directly access and set global objects, which are available already in the RequestHandler.
Therefore this logic is moved into RequestHandler and the PHP class :php:`TYPO3\CMS\Frontend\Page\PageGenerator`
has been marked as deprecated.
Impact
======
Calling any of the methods within the PHP class will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with a custom extension calling the static class.
Migration
=========
Move the render logic to your own extension or use the RequestHandler to compile the functionality.
The unrelated method :php:`PageRenderer::inline2TempFile()` has been moved into proper methods found at
* :php:`GeneralUtility::writeJavaScriptContentToTemporaryFile($content)`
* :php:`GeneralUtility::writeStyleSheetContentToTemporaryFile($content)`
.. index:: Frontend, FullyScanned, ext:frontend
@@ -0,0 +1,64 @@
.. include:: /Includes.rst.txt
.. _deprecation-85833:
==========================================================================
Deprecation: #85833 - Extension saltedpasswords merged into core extension
==========================================================================
See :issue:`85833`
Description
===========
`EXT:saltedpasswords` has been merged into the `core` extension. All
classes have been moved to the PHP namespace :php:`TYPO3\CMS\Core\Crypto\PasswordHashing`.
The documentation has been moved to the Core API document and can be found
`online <https://docs.typo3.org/typo3cms/CoreApiReference/stable/ApiOverview/PasswordHashing/>`_.
Classes that have been marked as deprecated have been moved to the same namespace and will be removed in TYPO3 v10.
The following classes have been renamed:
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Argon2iSalt::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\Argon2iPasswordHash::class`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BcryptSalt::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\BcryptPasswordHash::class`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\BlowfishSalt::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\BlowfishPasswordHash::class`
* :php:`TYPO3\CMS\Saltedpasswords\Exception\InvalidSaltException::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\InvalidPasswordHashException::class`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Md5Salt::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\Md5PasswordHash::class`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashFactory::class`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\SaltInterface::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashInterface::class`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\Pbkdf2PasswordHash::class`
* :php:`TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\PhpassPasswordHash::class`
* (deprecated) :php:`TYPO3\CMS\Saltedpasswords\Salt\AbstractComposedSalt::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\AbstractComposedSalt::class`
* (deprecated) :php:`TYPO3\CMS\Saltedpasswords\Salt\ComposedSaltInterface::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\ComposedPasswordHashInterface::class`
* (deprecated) :php:`TYPO3\CMS\Saltedpasswords\Utility\ExensionManagerConfigurationUtility::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\ExtensionManagerConfigurationUtility::class`
* (deprecated) :php:`TYPO3\CMS\Saltedpasswords\SaltedPasswordService::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\SaltedPasswordService::class`
* (deprecated) :php:`TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::class` to :php:`TYPO3\CMS\Core\Crypto\PasswordHashing\SaltedPasswordsUtility::class`
The following language files have been moved:
* (deprecated) :file:`saltedpasswords/Resources/Private/Language/locallang.xlf` to :file:`core/Resources/Private/Language/locallang_deprecated_saltedpasswords.xlf`
* (deprecated) :file:`saltedpasswords/Resources/Private/Language/locallang_em.xlf` to :file:`core/Resources/Private/Language/locallang_deprecated_saltedpasswords_em.xlf`
Impact
======
This change is usually transparent for TYPO3 instances. The old class names have been defined as
aliases to the new names. They will continue to work in TYPO3 v9 and be dropped in TYPO3 v10.
Affected Installations
======================
Almost no instance is directly affected by this change, most instances need no configuration change.
In rare cases, if extensions directly deal with password hashing, class namespaces may need to be adapted.
The extension scanner will find usages of old class names.
Migration
=========
Use the new class names and drop usages of deprecated classes.
.. index:: Backend, PHP-API, FullyScanned, ext:saltedpasswords
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-85836:
=================================================
Deprecation: #85836 - BackendUtility::getTCAtypes
=================================================
See :issue:`85836`
Description
===========
The method :php:`BackendUtility::getTCAtypes()` has been marked as deprecated and will be removed in TYPO3 v10.
Impact
======
Calling the mentioned method will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Third party code which accesses the method.
Migration
=========
No migration available.
.. index:: Backend, FullyScanned, ext:backend
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _deprecation-85858:
==================================================
Deprecation: #85858 - GeneralUtility::clientInfo()
==================================================
See :issue:`85858`
Description
===========
The helper method :php:`GeneralUtility::clientInfo()` responsible for
parsing the server variable :php:`$_SERVER['HTTP_USER_AGENT']` has been marked
as deprecated.
This method is not up-to-date with current browser headers, and in light of
browser that are able to fake the HTTP_USER_AGENT the detection is not practical
anymore.
Impact
======
Calling the method directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with extensions directly calling this method.
Migration
=========
Depending on the use-case, it is best to use the PSR-7-based request object,
if available in the context, or `$_SERVER['HTTP_USER_AGENT']` to detect a
specific browser/client user agent.
.. index:: PHP-API, FullyScanned, ext:core
@@ -0,0 +1,56 @@
.. include:: /Includes.rst.txt
.. _deprecation-85878:
=========================================================
Deprecation: #85878 - EidUtility and various TSFE methods
=========================================================
See :issue:`85878`
Description
===========
The Utility class :php:`TYPO3\CMS\Frontend\Utility\EidUtility` has been marked as deprecated.
The following methods have been marked as deprecated:
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->initFEuser()`
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->storeSessionData()`
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->previewInfo()`
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->hook_eofe()`
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->addTempContentHttpHeaders()`
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->sendCacheHeaders()`
The following hook has been marked as deprecated:
* `$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['hook_previewInfo']`
Impact
======
Calling any of the methods or registering a hook listener will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with custom functionality in the frontend using any of the methods, or the hook.
Migration
=========
As all functionality has been set up via PSR-15 middlewares, use a PSR-15 middleware instead.
The method :php:`storeSessionData()` should be replaced with :php:`TSFE->fe_user->storeSessionData()`.
The methods :php:`addTempContentHttpHeaders()` and :php:`sendCacheHeaders()` are now incorporated
within :php:`TSFE->processOutput()`. This function should be used, or rather add custom headers
to a PSR-15 Response object if available.
On top, the hook is superseded by the Frontend Hook `hook_eofe` which is executed in the Frontend rendering
flow directly afterwards.
.. index:: Frontend, PHP-API, FullyScanned, ext:frontend
@@ -0,0 +1,46 @@
.. include:: /Includes.rst.txt
.. _deprecation-85892:
====================================================================
Deprecation: #85892 - Various methods regarding sys_domain-resolving
====================================================================
See :issue:`85892`
Description
===========
Various methods specific for handling `sys_domain` records have been marked as deprecated. As the new site handling is in place in favor of using `sys_domain`
records, these methods have been centralized in a :php:`LegacyDomainResolver` class, which is however marked as internal.
Instead, generating URLs should be done via the new PageUriBuilder and Routing API, which covers both the new
site handling and the specific sys_domain record.
The following methods have been marked as deprecated:
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->domainNameMatchesCurrentRequest()`
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->getDomainDataForPid()`
* :php:`TYPO3\CMS\Backend\Utility\BackendUtility::getDomainStartPage()`
* :php:`TYPO3\CMS\Backend\Utility\BackendUtility::firstDomainRecord()`
Impact
======
Calling any of the methods will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any installation with custom functionality regarding `sys_domain` handling where any of the methods mentioned above are used.
Migration
=========
Migrate to either the new Routing API (finalized for 9 LTS) or implement the functionality in your own, or use the :php:`LegacyDomainResolver` class,
but since the concept of sys_domain handling will be removed in TYPO3 v10, consider use of the Site handling functionality instead.
.. index:: Frontend, Backend, FullyScanned
@@ -0,0 +1,152 @@
.. include:: /Includes.rst.txt
.. _deprecation-85902:
===================================
Deprecation: #85902 - IMGMENU/GMENU
===================================
See :issue:`85902`
Description
===========
Rendering a Hierarchical Menu via TypoScript previously allowed various rendering methods, namely textual (`TMENU`),
but also rendering menu items as images (`GMENU`) or as an image map (`IMGMENU`). Both graphical possibilities
have been marked as deprecated, as it is considered bad practice building websites
nowadays - images with a fixed width, and text within images has various drawbacks in terms of accessibility and
responsive renderings.
The following PHP classes have been marked as deprecated:
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\ImageMenuContentObject`
The related TypoScript menu objects `GMENU` and `GMENUITEM` as well as `IMGMENU` and `IMGMENUITEM` have been
marked as deprecated.
On top the following TypoScript options within a MENU item, regarding TMENU have been marked as deprecated:
* imgNamePrefix
* imgNameNotRandom
The following TMENU item properties should not be used anymore.
* RO_chBgColor
* beforeImg
* beforeImgTagParams
* beforeImgLink
* beforeROImg
* RO
* afterImg
* afterImgTagParams
* afterImgLink
* afterROImg
The following item states have been marked as deprecated ("RO" for "rollover" in graphics-related items).
* IFSUBRO
* ACTRO
* ACTIFSUBRO
* CURRO
* CURIFSUBRO
* USRRO
* USERDEF1RO
* USERDEF2RO
The following previously public properties are now marked as internal and trigger a PHP :php:`E_USER_DEPRECATED` error,
partly due to preparations of refactoring the PHP code once GMENU functionality is removed, and partly
due to the highly connected functionality within the PHP classes:
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->menuNumber`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->entryLevel`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->spacerIDList`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->doktypeExcludeList`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->alwaysActivePIDlist`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->imgNamePrefix`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->imgNameNotRandom`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->debug`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->GMENU_fixKey`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->MP_array`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->conf`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->mconf`
* [not scanned] :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->tmpl`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->sys_page`
* [not scanned] :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->id`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->nextActive`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->menuArr`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->hash`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->result`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->rL_uidRegister`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->INPfixMD5`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->I`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->WMresult`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->WMfreezePrefix`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->WMmenuItems`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->WMsubmenuObjSuffixes`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->WMextraScript`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->WMcObj`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->alternativeMenuTempArray`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->nameAttribute`
The following methods have changed visibility:
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->subMenu()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->link()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->procesItemStates()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->changeLinksForAccessRestrictedPages()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->isNext()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->isActive()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->isCurrent()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->isSubMenu()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->isItemState()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->accessKey()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->userProcess()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->setATagParts()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->getPageTitle()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->getMPvar()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->getDoktypeExcludeWhere()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->getBannedUids()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject->menuTypoLink()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject->extProc_RO()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject->extProc_init()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject->extProc_beforeLinking()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject->extProc_afterLinking()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject->extProc_beforeAllWrap()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject->extProc_finish()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuContentObject->getBeforeAfter()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuContentObject->extProc_init()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuContentObject->extProc_beforeLinking()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuContentObject->extProc_afterLinking()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuContentObject->extProc_beforeAllWrap()`
* :php:`TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuContentObject->extProc_finish()`
The following functionality has been marked as deprecated as well:
* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->setJS('mouseOver')`
Impact
======
Instantiating any of the deprecated PHP classes, or calling any of the PHP methods will trigger a
PHP :php:`E_USER_DEPRECATED` error, as well as setting any of the previously public properties.
Using `GMENU` or `IMGMENU` or any of the TypoScript settings will also raise a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations using `GMENU` or `IMGMENU` TypoScript functionality, roll-over functionality within menus
in Frontend, or image-related functionality related to `HMENU`, or extending `HMENU` with their custom menus.
Migration
=========
Migrate to `TMENU` by using "before" and "after" functionality to effectively render images with `GIFBUILDER`.
.. index:: Frontend, TypoScript, PartiallyScanned, ext:frontend
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _deprecation-85960:
================================================================================================================
Deprecation: #85960 - AbstractUserAuthentication::compareUident and AbstractAuthenticationService->compareUident
================================================================================================================
See :issue:`85960`
Description
===========
Two methods related to old plain text or simple md5 related password checking have
been marked as deprecated after those have been unused or overridden for a while already:
* :php:`TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->compareUident()`
* :php:`TYPO3\CMS\Core\Authentication\AbstractAuthenticationService->compareUident()`
Impact
======
Calling the above methods will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Instances using special authentication extensions might be
affected. The extension scanner should find usages.
Migration
=========
Do not use plain text or simple md5 based password comparison in authentication services.
.. index:: PHP-API, FullyScanned
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _deprecation-85971:
=====================================================
Deprecation: #85971 - PageRepository->getFirstWebPage
=====================================================
See :issue:`85971`
Description
===========
The method php:`PageRepository->getFirstWebPage()` is only used when no "?id" parameter is given, and no rootpage was resolved.
As this is the only use-case, a more generic "getMenu" method can be used, which does the
same except for not "limiting" the query to one result, so there is a minimal memory penalty when doing so.
However due to Pseudo-Site functionality this drawback only applies to rare cases.
Impact
======
Calling the method directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with extensions directly calling this method.
Migration
=========
Use php:`PageRepository->getMenu()` instead.
.. index:: Frontend, FullyScanned, ext:frontend
@@ -0,0 +1,58 @@
.. include:: /Includes.rst.txt
.. _deprecation-85977:
========================================================================================
Deprecation: #85977 - Extbase CLI functionality, Command Controllers and @cli Annotation
========================================================================================
See :issue:`85977`
Description
===========
TYPO3 supports Symfony Console commands natively since TYPO3 v8. Since TYPO3 v9.0 it is possible to also register
Symfony Console commands within scheduler, just like Extbase CommandControllers can be handled.
The main advantage of Symfony Console commands over Extbase Command Controllers is that they run very early in a
CLI context, not needing a database connection or other restrictions. On top comes better alias handling, CLI argument
and option handling.
As a trade-off, Extbase's ObjectManager and Configuration Handling and ORM is not available by default.
Since TYPO3 v9.4, it is possible to also register a Symfony Console command as "schedulable", to control the visibility
of a certain Symfony Command in Scheduler, making the PHPDoc annotation :php:`@cli` obsolete.
Impact
======
Using a CommandController via CLI will trigger a PHP :php:`E_USER_DEPRECATED` error. All other PHP classes for Extbase's CLI
functionality have been marked as deprecated, but will not trigger a PHP :php:`E_USER_DEPRECATED` error.
Using :php:`@cli` will also trigger a PHP :php:`E_USER_DEPRECATED` error. After the annotation has been removed from your commands, they will appear in the list of
executable commands in the scheduler module.
Affected Installations
======================
All installations that make use of command controllers or methods tagged with :php:`@cli`.
Migration
=========
Migrate custom commands within CommandControllers as symfony commands as TYPO3 Core does. Use specific argument
definitions on what parameters will be available.
See documentation https://symfony.com/doc/current/console.html and
:ref:`t3coreapi:symfony-console-commands` for detailed
descriptions on how to write Console Commands and how to integrate them into TYPO3.
Think twice whether you need all of Extbase's power of Dependency Injection (ObjectManager / ObjectContainer) and Domain
Model / Repositories and ORM, or if native database queries will suit your task better.
If anything related to DataHandler and Backend permission handling is necessary, you should run
:php:`Bootstrap::initializeBackendAuthentication();`.
.. index:: ext:scheduler, FullyScanned
@@ -0,0 +1,34 @@
.. include:: /Includes.rst.txt
.. _deprecation-85978:
==============================================
Deprecation: #85978 - GraphicalFunctions->init
==============================================
See :issue:`85978`
Description
===========
The init method of :php:`GraphicalFunctions/Gifbuilder` was used as a constructor to set up various internal properties, and is now transferred into a real constructor, making the extra call to :php:`init()` obsolete.
Impact
======
Calling the method directly will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
Any TYPO3 installation with extensions directly calling this method.
Migration
=========
No migration is needed, the constructor of :php:`GraphicalFunctions/Gifbuilder` takes care of the initialization of all settings.
.. index:: PHP-API, NotScanned, ext:core
@@ -0,0 +1,48 @@
.. include:: /Includes.rst.txt
.. _deprecation-85996:
========================================================
Deprecation: #85996 - ExtensionManager CommandController
========================================================
See :issue:`85996`
Description
===========
The following Extension Manager CLI commands have been reimplemented internally with Symfony console
commands:
* :bash:`extensionmanager:extension:install`, now :bash:`extension:activate`
* :bash:`extensionmanager:extension:uninstall`, now :bash:`extension:deactivate`
* :bash:`extensionmanager:extension:dumpclassloadinginformation`, now :bash:`dumpautoload`
The left-over command controller PHP class :php:`TYPO3\CMS\Extensionmanager\Command\ExtensionCommandController`
is not in use anymore, and therefore has been marked as deprecated.
Impact
======
Calling any of the commands within the PHP class will trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations that extend the command controller directly in extensions are affected by this change.
Installations simply using the CLI entrypoint are not affected.
Migration
=========
* use :bash:`extension:activate` instead of :bash:`extensionmanager:extension:install`
* use :bash:`extension:deactivate` instead of :bash:`extensionmanager:extension:uninstall`
* use :bash:`dumpautoload` instead of :bash:`extensionmanager:extension:dumpclassloadinginformation`
In order to achieve the same functionality within custom PHP code, it is recommended to use the
underlying logic within the commands instead of calling or extending the command controller class.
.. index:: CLI, FullyScanned, ext:extensionmanager
@@ -0,0 +1,50 @@
.. include:: /Includes.rst.txt
.. _deprecation-86001:
===================================================================
Deprecation: #86001 - Workspaces tasks migrated to symfony commands
===================================================================
See :issue:`86001`
Description
===========
The custom scheduler tasks for workspace publishing and removing of preview links have been migrated
to custom symfony commands, making the functionality specifically within the scheduler context obsolete.
The following tasks should not be used anymore:
* Workspaces auto-publication
* Workspaces cleanup preview links
The following related classes have been marked as deprecated:
* :php:`TYPO3\CMS\Workspaces\Service\AutoPublishService`
* :php:`TYPO3\CMS\Workspaces\Task\AutoPublishTask`
* :php:`TYPO3\CMS\Workspaces\Task\CleanupPreviewLinkTask`
The scheduler tasks are still available, but marked as obsolete.
Impact
======
Executing one of the tasks above will trigger a PHP :php:`E_USER_DEPRECATED` error. Calling any of the classes from the outside
will also trigger a PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 Installations using workspaces in combination with any of the two scheduler tasks.
Migration
=========
Create a new scheduler task based on the Symfony Command and select one of the symfony-based commands
"cleanup:previewlinks" or "workspace:auto-publish" respectively.
.. index:: CLI, FullyScanned, ext:workspaces
@@ -0,0 +1,38 @@
.. include:: /Includes.rst.txt
.. _deprecation-86002:
=============================================================
Deprecation: #86002 - TSFE constructor with no_cache argument
=============================================================
See :issue:`86002`
Description
===========
The 4th constructor argument of the PHP class :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController`
(a.k.a. "TSFE") was previously used to determine if the GET/POST parameter "no_cache" was set, which is
moved to a PSR-15 middleware now, making the argument obsolete. This argument is now set to "null" by default.
Impact
======
If anything other than the null value is given to the constructor method, a PHP :php:`E_USER_DEPRECATED` error is triggered.
Affected Installations
======================
TYPO3 installations with extensions that instantiate the PHP class manually and setting the 4th
constructor argument.
Migration
=========
Set the constructor argument to "null" when instantiating the class manually, use `$tsfe->set_no_cache()` instead
to manually disable the caching mechanism.
.. index:: Frontend, PHP-API, FullyScanned
@@ -0,0 +1,47 @@
.. include:: /Includes.rst.txt
.. _deprecation-86046:
==========================================================================================
Deprecation: #86046 - Additional arguments in several TypoScriptFrontendController methods
==========================================================================================
See :issue:`86046`
Description
===========
The following public methods within :php:`TypoScriptFrontendController` now expect an argument:
* :php:`calculateLinkVars(array $queryParams)`
* :php:`preparePageContentGeneration(ServerRequestInterface $request)`
This is necessary to avoid usage of the PHP global variables $_GET/$_POST.
In addition, to be backwards-compatible with extensions previously using
:php:`GeneralUtility::_GETset()`, this method now also updates the global PSR-7 request
for the time being, although this method will be removed in the future.
TYPO3 aims to not access global state in the future, in order to do proper "sub requests".
Impact
======
Calling any of the methods mentioned above without a method argument will trigger an according
PHP :php:`E_USER_DEPRECATED` error.
Affected Installations
======================
TYPO3 installations with extensions using these methods.
Migration
=========
Inject either QueryParameters from a given PSR-7 request object or the object itself,
by looking at the according method signature.
.. index:: Frontend, FullyScanned, ext:frontend
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _deprecation-86109:
========================================================
Deprecation: #86109 - Class UserStorageCapabilityService
========================================================
See :issue:`86109`
Description
===========
Class :php:`TYPO3\CMS\Core\Resource\Service\UserStorageCapabilityService` has been
marked as deprecated and should not be used any longer.
Impact
======
This core internal class has been switched from a `TCA` :php:`userFunc` to a
:php:`renderType`.
Affected Installations
======================
Extensions probably never used this internal class, however, the extension
scanner will still find any usages.
Migration
=========
No migration possible.
.. index:: Backend, PHP-API, TCA, FullyScanned
@@ -0,0 +1,23 @@
.. include:: /Includes.rst.txt
.. _feature-13265:
============================================================================
Feature: #13265 - Select first element of PageTree toolbar on initialization
============================================================================
See :issue:`13265`
Description
===========
The first element of the PageTree toolbar is now selected when initialized. The possibility to
close/hide a toolbar option has been removed. Either the page type or the filter/search is displayed.
Impact
======
The user always sees an open element of the PageTree toolbar.
.. index:: Backend, JavaScript, ext:backend
@@ -0,0 +1,27 @@
.. include:: /Includes.rst.txt
.. _feature-44297:
=====================================================================
Feature: #44297 - Interval presets for cron command of scheduler task
=====================================================================
See :issue:`44297`
Description
===========
To support administrators creating scheduler tasks, presets have been added to the frequency field.
The default presets are:
.. code-block:: php
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['frequencyOptions'] = [
'0 9,15 * * 1-5' => 'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:command.example1',
'0 */2 * * *' => 'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:command.example2',
'*/20 * * * *' => 'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:command.example3',
'0 7 * * 2' => 'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:command.example4',
];
.. index:: Backend, ext:scheduler
@@ -0,0 +1,29 @@
.. include:: /Includes.rst.txt
.. _feature-57331:
=====================================================
Feature: #57331 - Support dash in CurrencyViewHelper
=====================================================
See :issue:`57331`
Description
===========
The :php:`useDash` option has been added to the CurrencyViewHelper.
Impact
======
If the option :php:`useDash` is set and a value without decimals (see example) is given, the decimal place is rendered as a dash.
Example:
.. code-block:: html
<!-- Renders "54321.-" -->
<f:format.currency useDash="true">54321.00</f:format.currency>
.. index:: Fluid, ext:fluid
@@ -0,0 +1,20 @@
.. include:: /Includes.rst.txt
.. _feature-75806:
======================================
Feature: #75806 - Add hreflang support
======================================
See :issue:`75806`
Description
===========
"hreflang" tags are now added automatically for multilanguage websites based on the one-tree principle.
The href is relative as long as the domain is the same. If the domain differs the href becomes absolute.
The x-default href is the first supported language.
The value of "hreflang" is the one set in the new sites module.
.. index:: Frontend, ext:seo
@@ -0,0 +1,32 @@
.. include:: /Includes.rst.txt
.. _feature-83476:
===================================================
Feature: #83476 - Load merged JS files asynchronous
===================================================
See :issue:`83476`
Description
===========
The async attribute is now assigned to the script tag of the concatenated JS files if all files have the async attribute enabled in TypoScript.
Example:
--------
.. code-block:: typoscript
config.concatenateJs = 1
page = PAGE
page.includeJSFooter {
test = fileadmin/user_upload/test.js
test.async = 1
test2 = fileadmin/user_upload/test2.js
test2.async = 1
}
.. index:: Frontend, TypoScript, ext:core
@@ -0,0 +1,39 @@
.. include:: /Includes.rst.txt
.. _feature-83749:
==================================================================
Feature: #83749 - Filtering and Pagination in the redirects module
==================================================================
See :issue:`83749`
Description
===========
The backend module "Redirects" received filtering and pagination to improve the overall usability.
The list of redirects can be filtered by:
- The source host
- The source path
- The destination (either the path or the Page ID)
- The target status code
All filters are concatenated by a logical AND.
Pagination is set to 50 records per page.
Some minor usability improvements have been made as well:
- The source path crops after 100 characters to keep the table from expanding too much.
- The destination column also shows the Page ID if the target is a page.
- Redirects are sorted by source host (1st) and source path (2nd).
Impact
======
With these improvements it is now possible to easily manage a big amount of redirect records.
.. index:: Backend, ext:redirects
@@ -0,0 +1,489 @@
.. include:: /Includes.rst.txt
.. _feature-84133:
====================================
Feature: #84133 - Introduce variants
====================================
See :issue:`84133`
Description
===========
Short Description
-----------------
Variants allow you to change properties of a form element and can be activated based on conditions.
This makes it possible to manipulate form element properties, validator options, and finisher options based on conditions.
This allows you among other things:
* translate form element values depending on the frontend language
* set and remove validators of one form element depending on the value of another form element
* hide entire steps (form pages) depending on the value of a form element
* set finisher options depending on the value of a form element
* hiding a form element in certain finishers and on the summary step
This feature implements variants for frontend rendering and the ability to define variants in form definitions.
The implementation to define variants graphically in the form editor is out of scope of this patchset.
Basics
------
Variants allow you to change properties of form elements, validators, and finishers and are activated by conditions.
They are defined on the form element level either statically in form definitions or created programmatically through an API.
The variants defined within a form definition are automatically applied to the form based on their conditions at runtime.
Programmatically, variants can be applied at any time.
Furthermore, the conditions of a variant can be evaluated programmatically at any time. However, some conditions are only
available at runtime, for example a check for a form element value.
Custom conditions and operators can be added easily.
Only the form element properties listed in a variant are applied to the form element, all other properties are retained.
An exception to this rule are finishers and validators. If finishers or validators are **not** defined within a variant, the
original finishers and validators will be used. If at least one finisher or validator is defined in a variant, the
originally defined finishers or validators are overwritten by the list of finishers and validators of the variant.
Variants defined within a form definition are **all** processed and applied in the order of their condition matches. This means
if variant 1 sets the label of a form element to "X" and variant 2 sets the label to "Y", then variant 2 is applied, i.e. the label
will be "Y".
Variants definition
-------------------
Variants are defined on the form element level. Check the following - incomplete - example:
.. code-block:: yaml
type: Text
identifier: text-1
label: ''
variants:
-
identifier: variant-1
condition: 'formValues["checkbox-1"] == 1'
# If the condition matches, the label property of the form element is set to the value 'foo'
label: foo
As usual :yaml:`identifier` must be a unique name of the variant on the form element level.
Each variant has a single :yaml:`condition` which lets the variants' changes get applied if it matches.
If the :yaml:`condition` of a variant matches, the remaining properties are applied to the form element. In the
aforementioned example the label of the form element :yaml:`text-1` is changed to ``foo`` if the checkbox
:yaml:`checkbox-1` is checked.
The following properties can be overwritten by variants within the topmost element (:yaml:`Form`):
* :yaml:`label`
* :yaml:`renderingOptions`
* :yaml:`finishers`
* :yaml:`rendererClassName`
The following properties can be overwritten by variants within all of the other form elements:
* :yaml:`enabled`
* :yaml:`label`
* :yaml:`defaultValue`
* :yaml:`properties`
* :yaml:`renderingOptions`
* :yaml:`validators`
Conditions
----------
The form framework uses the Symfony component `expression language` to match the conditions. (@see https://symfony.com/doc/4.1/components/expression_language.html)
An expression is a one-liner that returns a boolean value like :yaml:`applicationContext matches "#Production/Local#"`.
Please read https://symfony.com/doc/4.1/components/expression_language/syntax.html to learn more about this topic.
The form framework extends the expression language with some variables which can be used to access form values and environment settings.
``formRuntime`` (object)
^^^^^^^^^^^^^^^^^^^^^^^^
You can access every public method from the :php:`\TYPO3\CMS\Form\Domain\Runtime\FormRuntime` (@see https://docs.typo3.org/typo3cms/extensions/form/ApiReference/Index.html#typo3-cms-form-domain-model-formruntime).
Example
'''''''
:yaml:`formRuntime.getIdentifier() == "test"`.
``formValues`` (array)
^^^^^^^^^^^^^^^^^^^^^^
:yaml:`formValues` holds all of the submitted form element values. Each key within this array represents a form element identifier.
Example
'''''''
:yaml:`formValues["text-1"] == "yes"`.
``stepIdentifier`` (string)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
:yaml:`stepIdentifier` is set to the :yaml:`identifier` of the current step.
Example
'''''''
:yaml:`stepIdentifier == "page-1"`.
``stepType`` (string)
^^^^^^^^^^^^^^^^^^^^^
:yaml:`stepType` is set to the :yaml:`type` of the current step.
Example
'''''''
:yaml:`stepType == "SummaryPage"`.
``finisherIdentifier`` (string)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:yaml:`finisherIdentifier` is set to the :yaml:`identifier` of the current finisher or an empty string (while no finishers are executed).
Example
'''''''
:yaml:`finisherIdentifier == "EmailToSender"`.
``siteLanguage`` (object)
^^^^^^^^^^^^^^^^^^^^^^^^^
You can access every public method from :php:`\TYPO3\CMS\Core\Site\Entity\SiteLanguage`.
The most needed ones are probably:
* getLanguageId() / Aka sys_language_uid.
* getLocale() / The language locale. Something like 'en_US.UTF-8'.
* getTypo3Language() / The language key for XLF files. Something like 'de' or 'default'.
* getTwoLetterIsoCode() / Returns the ISO-639-1 language ISO code. Something like 'de'.
Example
'''''''
:yaml:`siteLanguage("locale") == "de_DE"`.
``applicationContext`` (string)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:yaml:`applicationContext` is set to the application context (@see GeneralUtility::getApplicationContext()).
Example
'''''''
:yaml:`applicationContext matches "#Production/Local#"`.
``contentObject`` (array)
^^^^^^^^^^^^^^^^^^^^^^^^^
:yaml:`contentObject` is set to the data of the current content object or to an empty array if no content object is available.
Example
'''''''
:yaml:`contentObject["pid"] in [23, 42]`.
Working with variants programmatically
--------------------------------------
Create a variant with conditions through the PHP API:
.. code-block:: php
/** @var TYPO3\CMS\Form\Domain\Model\Renderable\RenderableVariantInterface $variant */
$variant = $formElement->createVariant([
'identifier' => 'variant-1',
'condition' => 'formValues["checkbox-1"] == 1',
'label' => 'foo',
]);
Get all variants of a form element:
.. code-block:: php
/** @var TYPO3\CMS\Form\Domain\Model\Renderable\RenderableVariantInterface[] $variants */
$variants = $formElement->getVariants();
Apply a variant to a form element regardless of its defined conditions:
.. code-block:: php
$formElement->applyVariant($variant);
Examples
--------
Translate form element values depending on the frontend language:
.. code-block:: yaml
type: Form
identifier: test
prototypeName: standard
label: DE
renderingOptions:
submitButtonLabel: Abschicken
variants:
-
identifier: language-variant-1
condition: 'siteLanguage("locale") == "en_US.UTF-8"'
label: EN
renderingOptions:
submitButtonLabel: Submit
renderables:
-
type: Page
identifier: page-1
label: DE
renderingOptions:
previousButtonLabel: 'zurück'
nextButtonLabel: 'weiter'
variants:
-
identifier: language-variant-1
condition: 'siteLanguage("locale") == "en_US.UTF-8"'
label: EN
renderingOptions:
previousButtonLabel: 'Previous step'
nextButtonLabel: 'Next step'
renderables:
-
type: Text
identifier: text-1
label: DE
properties:
fluidAdditionalAttributes:
placeholder: Platzhalter
variants:
-
identifier: language-variant-1
condition: 'siteLanguage("locale") == "en_US.UTF-8"'
label: EN
properties:
fluidAdditionalAttributes:
placeholder: Placeholder
Set validators of one form element depending on the value of another form element:
.. code-block:: yaml
type: Form
identifier: test
label: test
prototypeName: standard
renderables:
-
type: Page
identifier: page-1
label: Step
renderables:
-
defaultValue: ''
type: Text
identifier: text-1
label: 'Email address'
variants:
-
identifier: variant-1
condition: 'formValues["checkbox-1"] == 1'
properties:
fluidAdditionalAttributes:
required: 'required'
validators:
-
identifier: NotEmpty
-
identifier: EmailAddress
-
type: Checkbox
identifier: checkbox-1
label: 'Subscribe to newsletter'
Hide entire steps depending on the value of a form element:
.. code-block:: yaml
type: Form
identifier: test
prototypeName: standard
label: Test
renderables:
-
type: Page
identifier: page-1
label: 'Page 1'
renderables:
-
type: Text
identifier: text-1
label: 'Text 1'
-
type: Checkbox
identifier: checkbox-1
label: 'Skip page 2'
variants:
-
identifier: hide-1
condition: 'stepType == "SummaryPage"'
renderingOptions:
enabled: false
-
type: Page
identifier: page-2
label: 'Page 2'
variants:
-
identifier: variant-1
condition: 'formValues["checkbox-1"] == 1'
renderingOptions:
enabled: false
renderables:
-
type: Text
identifier: text-2
label: 'Text 2'
-
type: SummaryPage
identifier: summarypage-1
label: 'Summary step'
Set finisher values depending on the application context:
.. code-block:: yaml
type: Form
identifier: test
prototypeName: standard
label: Test
renderingOptions:
submitButtonLabel: Submit
finishers:
-
identifier: Confirmation
options:
message: 'Thank you'
variants:
-
identifier: variant-1
condition: 'applicationContext matches "#Production/Local#"'
finishers:
-
identifier: Confirmation
options:
message: 'ouy knahT'
renderables:
-
type: Page
identifier: page-1
label: 'Page 1'
renderingOptions:
previousButtonLabel: 'Previous step'
nextButtonLabel: 'Next step'
Hide a form element in certain finishers and on the summary step:
.. code-block:: yaml
type: Form
identifier: test
prototypeName: standard
label: Test
finishers:
-
identifier: EmailToReceiver
options:
subject: Testmail
recipientAddress: tritum@example.org
recipientName: 'Test'
senderAddress: tritum@example.org
senderName: tritum@example.org
renderables:
-
type: Page
identifier: page-1
label: 'Page 1'
renderables:
-
type: Text
identifier: text-1
label: 'Text 1'
variants:
-
identifier: hide-1
renderingOptions:
enabled: false
condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]'
-
type: Text
identifier: text-2
label: 'Text 2'
-
type: SummaryPage
identifier: summarypage-1
label: 'Summary step'
Adding own expression language providers
----------------------------------------
If you need to extend the expression language with custom functions you
can extend it. For more information check the official `docs <https://symfony.com/doc/5.4/components/expression_language/extending.html#using-expression-providers>`__
and the appropriate :ref:`TYPO3 implementation details<t3coreapi:symfony-expression-language>`.
Register the expression language provider in the extension file
:file:`Configuration/ExpressionLanguage.php`. Make sure your expression
language provider implements :php:`Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface`.
.. code-block:: php
:caption: EXT:some_extension/Configuration/ExpressionLanguage.php
return [
'form' => [
Vendor\MyExtension\ExpressionLanguage\CustomExpressionLanguageProvider::class,
],
];
Adding own expression language variables
----------------------------------------
If you need to add custom variables to the expression language you can
extend it. Then the variables are ready to be checked in conditions.
Register a custom expression language provider as written above and
provide the expression language variables:
.. code-block:: php
:caption: EXT:some_extension/Classes/ExpressionLanguage/CustomExpressionLanguageProvider.php
class CustomExpressionLanguageProvider extends AbstractProvider
{
public function __construct()
{
$this->expressionLanguageVariables = [
'variableA' => 'valueB',
];
}
}
.. index:: Frontend, ext:form
@@ -0,0 +1,99 @@
.. include:: /Includes.rst.txt
.. _feature-84525:
=============================
Feature: #84525 - XML Sitemap
=============================
See :issue:`84525`
Description
===========
It is now possible to generate XML sitemaps for SEO purposes without using 3rd-party plugins.
When enabled, this new feature will create a sitemap index with one or more sitemaps in it.
Out-of-the-box it will have one sitemap containing all the pages of the current site and
language. Per site and per language you have the possibility to render a different sitemap.
Installation
------------
The XML sitemap is disabled by default. You can easily enable it by installing the system
extension "seo" and including the static TypoScript template "XML Sitemap (seo)". It is also
mandatory to have a site configuration for your rootpage(s).
How to access your XML sitemap
------------------------------
Until it is possible to have a default route with the new URL handling mechanism, you can access
the sitemaps by calling https://yourdomain.com/?type=1533906435 in your browser. You will first see the sitemap
index. By default you will see one sitemap in the index. This is the sitemap for pages.
If you have multiple siteroots or multiple languages with different domains or language prefixes,
you can just go to the domain that handles the siteroot / language. The sitemap will be based on
the settings for that domain.
XmlSitemapDataProviders
-----------------------
The rendering of sitemaps is based on XmlSitemapDataProviders. EXT:seo extension ships with two
XmlSitemapDataProviders. The first one is the :php:`PagesXmlSitemapDataProvider`. This will generate a sitemap
of pages based on the siteroot that is detected. You can configure if you have additional conditions
for the selection of pages. You also have the possibility to exclude certain doktypes.
.. code-block:: typoscript
plugin.tx_seo {
config {
xmlSitemap {
sitemaps {
pages {
config {
excludedDoktypes = 137, 138
additionalWhere = no_index = 0 AND canonical_link = ''
}
}
}
}
}
}
If you also have an extension installed and want a sitemap of those records, you can use the
:php:`RecordsXmlSitemapDataProvider`. You can add for example a sitemap for news records:
.. code-block:: typoscript
plugin.tx_seo {
config {
xmlSitemap {
sitemaps {
<unique key> {
provider = TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider
config {
table = news_table
sortField = sorting
lastModifiedField = tstamp
additionalWhere = no_index = 0 AND canonical_link = ''
pid = <page id('s) containing news records>
url {
pageId = <your detail page id>
fieldToParameterMap {
uid = tx_extension_pi1[news]
}
additionalGetParameters {
tx_extension_pi1.controller = News
tx_extension_pi1.action = detail
}
useCacheHash = 1
}
}
}
}
}
}
}
You can add several sitemaps and those will be added to the sitemap index automatically.
.. index:: Frontend, ext:seo
@@ -0,0 +1,30 @@
.. include:: /Includes.rst.txt
.. _feature-84584:
===========================================
Feature: #84584 - Re-Design the admin panel
===========================================
See :issue:`84584`
Description
===========
The admin panel got a complete overhaul regarding its design as well as the underlying code and extensibility.
UI wise the following changes were done
- Ajax is used to save configuration options, so only a single reload is triggered even if multiple settings changed.
- Settings influencing page rendering are grouped together.
- Most important info is available at a glance with possibilities to show extended information.
Impact
======
The new admin panel provides a better look and feel as well as more convenient access to information and more flexible extensibility.
For backwards compatibility enabling and disabling modules or options for editors is still possible via User TSConfig.
.. index:: Frontend, PHP-API, ext:adminpanel
@@ -0,0 +1,28 @@
.. include:: /Includes.rst.txt
.. _feature-84606:
==============================================
Feature: #84606 - Add Log Module to AdminPanel
==============================================
See :issue:`84606`
Description
===========
A log module has been added to the adminPanel to display log entries generated during the current request.
It displays all log entries generated via the logging framework during the request.
Display options include grouping by log level and component, additionally the log level
which shall be logged has been made configurable.
Impact
======
A new AdminPanel sub module displaying log entries has been added in a new main module "Debug" which may
be extended with further debug information.
.. index:: Frontend, ext:adminpanel
@@ -0,0 +1,28 @@
.. include:: /Includes.rst.txt
.. _feature-84609:
==================================================
Feature: #84609 - Add SQL Log Module to AdminPanel
==================================================
See :issue:`84609`
Description
===========
A new AdminPanel module has been introduced which shows SQL queries done to generate the current page.
The module includes a short trace of the query so developers may locate where it was initiated as well as - in case
it's a prepared statement - the placeholder values to enable checking variations of the query.
Logging of queries is done via the Doctrine SQL Logger capabilities and enabled whenever the AdminPanel is activated /
open in the frontend. Logging is only done for the currently logged in backend user, this way the overall performance
impact is negligible.
Impact
======
The AdminPanel has a new sub module "Query Information" in the "Debug" section.
.. index:: Backend, Database, Frontend, ext:adminpanel
@@ -0,0 +1,26 @@
.. include:: /Includes.rst.txt
.. _feature-84704:
========================================================================
Feature: #84704 - Open specific field when fixing links in Linkvalidator
========================================================================
See :issue:`84704`
Description
===========
When fixing links in Linkvalidator, a click on the edit icon
for the respective broken link opens an edit form.
The whole form opening provided too much information, where just the problematic field would have been enough.
Now only the required field is open for editing, with an additional option to switch to the whole form if necessary.
Impact
======
Only affects Linkvalidator. Editing broken links should be easier now.
.. index:: Backend, ext:linkvalidator
@@ -0,0 +1,67 @@
.. include:: /Includes.rst.txt
.. _feature-84729:
=====================================
Feature: #84729 - New TCA type "slug"
=====================================
See :issue:`84729`
Description
===========
A new TCA field type called `slug` has been added to TYPO3 Core. Its main purpose is to define parts of a URL
path to generate and resolve URLs.
With a URL like `https://www.typo3.org/ch/community/values/core-values/` a URL slug is typically a part like
`/community` or `/community/values/core-values`.
Within TYPO3, a slug is always part of the URL "path" - it does not contain scheme, host, HTTP verb, etc.
A slug is usually added to a TCA-based database table, containing some rules for evaluation and definition.
In contrast to concepts within RealURL of "URL segments", a slug is a segment of a URL, but it is not limited
to be separated by slashes. Therefore, a slug can contain slashes.
In the future, it could be possible to generate slugs for any TCA table, but its's main usage will be for the "pages"
TCA structure.
If a TCA table contains a field called "slug", it needs to be filled for every existing record. It can
be shown and edited via regular Backend Forms, and is also evaluated during persistence via DataHandler.
The default behaviour of a slug is as follows:
* A slug only contains characters which are allowed within URLs. Spaces, commas and other special characters are converted to a fallback character.
* A slug is always lower-cased.
* A slug is unicode-aware.
The following options apply to the new TCA type::
'config' => [
'type' => 'slug',
'generatorOptions' => [
'fields' => ['title', 'nav_title'],
'fieldSeparator' => '/',
'prefixParentPageSlug' => true
],
'fallbackCharacter' => '-',
'eval' => 'uniqueInSite'
]
The new `eval` option `uniqueInSite` has been introduced to evaluate if a record is unique in a page tree (specific to a
language).
The new slug TCA type allows for two `eval` options `uniqueInSite` or `uniqueInPid` (useful for third-party
records), and no other eval setting is checked for. It is possible to set both eval options, however it is
recommended not to do so.
It is possible to build a default value from the rootline (very helpful for pages, or categorized slugs),
but also to just generate a "speaking" segment from e.g. a news title.
Sanitation and Validation configuration options apply when persisting a record via DataHandler.
In the backend forms a validation happens by an AJAX call, which immediately checks any input and receives
a new proposal in case the slug is already used.
.. index:: TCA, ext:core
@@ -0,0 +1,86 @@
.. include:: /Includes.rst.txt
.. _feature-85080:
=====================================================================
Feature: #85080 - Add property to disable form elements and finishers
=====================================================================
See :issue:`85080`
Description
===========
A new rendering option for form elements and finishers has been introduced named :yaml:`enabled`
which takes a boolean value (:yaml:`true` or :yaml:`false`).
Setting :yaml:`enabled: true` for a form element renders it in the frontend and enables processing
of its value including property mapping and validation. Setting :yaml:`enabled: false` instead
disables the form element in the frontend.
Setting :yaml:`enabled: true` for a finisher executes it when submitting forms, setting :yaml:`enabled: false`
skips the finisher instead.
By default :yaml:`enabled` is set to :yaml:`true`.
Usage:
======
All form elements and finishers except the root form element and the first form page can be enabled
or disabled.
An example:
.. code-block:: yaml
type: Form
identifier: test
label: test
prototypeName: standard
renderables:
-
type: Page
identifier: page-1
label: Step
renderables:
-
type: Text
identifier: text-1
label: Text
defaultValue: ''
-
type: Checkbox
identifier: checkbox-1
label: Checkbox
renderingOptions:
enabled: true
-
type: SummaryPage
identifier: summarypage-1
label: 'Summary step'
renderingOptions:
enabled: false
finishers:
-
identifier: Confirmation
options:
message: thx
-
identifier: Confirmation
options:
message: 'thx again'
renderingOptions:
enabled: '{checkbox-1}'
In this example the form element :yaml:`checkbox-1` has been enabled explicitly but it is fine to
leave this out since this is the default state (which can be seen in the element :yaml:`text-1`).
The :yaml:`summarypage-1` has been disabled completely, for example to temporarily remove it from
the form.
The second :yaml:`Confirmation` finisher takes the fact into account that finishers can refer to
form values. It is only enabled if the form element :yaml:`checkbox-1` has been activated by the
user. Otherwise the finisher is skipped.
.. index:: Frontend, ext:form, NotScanned
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _feature-85146:
==========================================================
Feature: #85146 - Read environment variables in TypoScript
==========================================================
See :issue:`85146`
Description
===========
There is a new TypoScript value modifier `getEnv()`. The modifier checks if the variable given as its argument is set
and reads the value if so, overriding any existing value. If the environment variable is not set, the variable given on
the left-hand side of the expression is not changed.
Impact
======
Write a TypoScript statement like this to use environment values in your TypoScript:
.. code-block:: typoscript
# Define default value
myConstant = defaultValue
# Enable overriding by environment variable
myConstant := getEnv(TS_MYCONSTANT)
To have a value actually inserted, your PHP execution environment (webserver, PHP-FPM) needs to have these variables
set, or you need a mechanism like dotenv to set them in your running TYPO3.
As it is a syntax feature you can use it in both constants and setup plus it gets cached, as opposed to the getText
`getenv` feature.
.. index:: TypoScript, ext:core
@@ -0,0 +1,27 @@
.. include:: /Includes.rst.txt
.. _feature-85164-1668719172:
==========================================================================
Feature: #85164 - Available languages respects site configuration settings
==========================================================================
See :issue:`85164`
Description
===========
When the backend shows the list of available languages - for instance in the page module
language selector, when editing records and in the list module - the list of languages
is now restricted to those defined by the site module.
If there are for instance five language records in the system, but a site configures
only three of them for a page tree, only those three are considered when rendering
language drop downs.
In case no site configuration has been created for a tree, all language records are shown. In
this case the Page TSconfig options :typoscript:`mod.SHARED.defaultLanguageFlag`,
:typoscript:`mod.SHARED.defaultLanguageLabel` and :typoscript:`mod.SHARED.disableLanguages` settings
are also considered - those are obsolete if a site configuration exists.
.. index:: Backend, ext:backend
@@ -0,0 +1,24 @@
.. include:: /Includes.rst.txt
.. _feature-85164:
======================================================
Feature: #85164 - Enable Languages on a per-site basis
======================================================
See :issue:`85164`
Description
===========
When configuring a new site with multiple languages, is it now possible to not allow a language to be rendered
in the TYPO3 Frontend. A new checkbox in the Site Handling module allows to add a language but not render it in
Frontend to allow to prepare a new translation of a website before it is going live.
Impact
======
Going live with a new language is now as easy as turning on one checkbox.
.. index:: Frontend
@@ -0,0 +1,37 @@
.. include:: /Includes.rst.txt
.. _feature-85236:
=======================================================================
Feature: #85236 - Infix option to default log file names for FileWriter
=======================================================================
See :issue:`85236`
Description
===========
A new option :php:`logFileInfix` for the :php:`FileWriter` has been introduced.
This allows to set a different name for the log file that is created by the :php:`FileWriter`
without having to define a full path to the file.
The example configuration will use the log file named :file:`typo3\_special\_\<hash>.log`
for any log message stemming from a class from the :php:`Vendor\ExtName` namespace.
.. code-block:: php
$GLOBALS['TYPO3_CONF_VARS']['LOG']['Vendor']['ExtName']['writerConfiguration'] = [
\TYPO3\CMS\Core\Log\LogLevel::INFO => [
\TYPO3\CMS\Core\Log\Writer\FileWriter::class => [
'logFileInfix' => 'special'
]
]
];
Impact
======
The behaviour for existing :php:`FileWriter` configurations is not changed.
.. index:: LocalConfiguration, ext:core
@@ -0,0 +1,31 @@
.. include:: /Includes.rst.txt
.. _feature-85247:
===========================================================
Feature: #85247 - Trait to detect public deprecated methods
===========================================================
See :issue:`85247`
Description
===========
The trait :php:`TYPO3\CMS\Core\Compatibility\PublicMethodDeprecationTrait` has been added
to allow setting public methods to protected in a backwards compatible way.
The core uses this trait to set public methods that should be protected or private but
are accessible code wise for historical reasons, while extensions using the methods do not
break, but a PHP :php:`E_USER_DEPRECATED` error is triggered.
Classes using this trait have a property :php:`$deprecatedPublicMethods` that lists all
methods covered by the trait.
Impact
======
Core classes using this trait trigger PHP :php:`E_USER_DEPRECATED` errors if an extension uses a method that
has been made protected using the trait functionality.
.. index:: PHP-API
@@ -0,0 +1,47 @@
.. include:: /Includes.rst.txt
.. _feature-85256:
=========================================
Feature: #85256 - Install TYPO3 on SQLite
=========================================
See :issue:`85256`
Description
===========
The TYPO3 web installer allows to install the system on `SQLite` DBMS.
This platform can be selected if :php:`pdo_sqlite` is available in PHP, which is
often the case. SQLite can be a nice DBMS for relatively small instances and has
the advantage that no further server side daemon is needed.
Administrators must keep an eye on security if using this platform:
In SQLite, a database is stored in a single file. In TYPO3, its default location
is the var/sqlite path of the instance which is derived from environment variable
:php:`TYPO3_PATH_APP`. If that variable is **not** set which is
often the case in non-composer instances, **the database file will end up in the
web server accessible document root directory :file:`typo3conf/`**!
To prevent guessing the database name and simply downloading it, the installer appends
a random string to the database filename during installation. Additionally, the demo
Apache :file:`_.htaccess` file prevents downloading :file:`.sqlite` files. The demo
MicroSoft IIS web server configuration in file :file:`_web.config` comes with the same
restriction.
Administrators installing TYPO3 using the SQLite platform should thus test if the
database is downloadable from the web and take measures to prevent this by either
configuring the web server to deny this file, or - better - by moving the config folder
out of the web root, which is good practice anyway.
Impact
======
TYPO3 can be installed to run on SQLite. If choosing this option, administrators
must check the file is never delivered by the web server.
.. index:: Database
@@ -0,0 +1,22 @@
.. include:: /Includes.rst.txt
.. _feature-85313:
================================================
Feature: #85313 - Add notes field to pages table
================================================
See :issue:`85313`
Description
===========
A :php:`descriptionColumn` has been added to the pages table.
Impact
======
Users can add notes to each page record to inform other users of important facts or similar.
.. index:: Backend
@@ -0,0 +1,25 @@
.. include:: /Includes.rst.txt
.. _feature-85355:
==========================================================
Feature: #85355 - Support basic HTML5 fields in FormEngine
==========================================================
See :issue:`85355`
Description
===========
The FormEngine renders now HTML5 specific field types and attributes.
Impact
======
Depending on the :php:`eval` configuration, the input types may be :html:`text`, :html:`number`
or :html:`email.`
If :php:`range` is configured, its values are stored in :html:`min` and :html:`max` attributes
for number fields.
.. index:: Backend, ext:backend
@@ -0,0 +1,127 @@
.. include:: /Includes.rst.txt
.. _feature-85389:
==========================================================
Feature: #85389 - Context API for consistent data handling
==========================================================
See :issue:`85389`
Description
===========
A new Context API is introduced, which encapsulates various information for data retrieval (e.g. inside
the database) and analysis of current permissions and caching information.
Previously, various information was distributed inside globally accessible objects (:php:`$TSFE` or :php:`$BE_USER`)
like the current workspace ID or if a frontend or backend user is authenticated. Having a global object
available was also dependent on the current request type (frontend or backend), instead of having
one consistent place where all this data is located.
The context is currently instantiated at the very beginning of each TYPO3 entry point, keeping track
of the current time (formally known as :php:`$GLOBALS['EXEC_TIME']`, if a user is logged in,
and which workspace is currently accessed.
This information is separated in so-called "Aspects", each being responsible for a certain area:
- :php:`VisibilityAspect`, holding information if hidden/deleted records should be fetched from the database
- :php:`DateTimeAspect`, keeping the current date as immutable datetime object
- :php:`UserAspect`, holding frontend/backend user IDs, usernames and usergroups
- :php:`WorkspaceAspect`, holding the currently visible workspace (default to "0"/ live)
- :php:`LanguageAspect`, holding information about the currently used language/overlay/fallback strategy
Extensions can add their own Aspects as well, as they only need to implement the AspectInterface.
The Context object is used as a Singleton, available via :php:`GeneralUtility::makeInstance(Context::class)`.
Adding or replacing an aspect has implications on the whole further request. The recommended way on doing
so is using a PSR-15 middleware. In the future (TYPO3 v10), the global context will have a "frozen" state
after all PSR-15 middlewares are run through, to ensure a consistent object throughout all renderings
within a backend.
However, if, for a certain retrieval part a custom context is needed, the necessary PHP classes, like
:php:`PageRepository` can receive a custom Context object. For this to work, a new Context object can be
created via :php:`new Context()` or cloned from the master context via
:php:`$myContext = clone GeneralUtility::makeInstance(Context::class);` to keep all existing aspects and only to
override a certain aspect locally.
A huge benefit when using the Context API is a strong decoupling of various architectural failures within
TYPO3 Core, which are now "Context aware" and do not depend on a certain global object being available.
This will not only unify the code quality, but also introduce a better standard, where hard intermingling within
Extbase, PageRepository and TypoScriptFrontendController can be found.
Impact
======
The new Context API replaces lots of places known for a very long time:
* :php:`DateTimeAspect` replaces :php:`$GLOBALS['SIM_EXEC_TIME']` and :php:`$GLOBALS['EXEC_TIME']`
* :php:`VisibilityAspect` replaces :php:`$GLOBALS['TSFE']->showHiddenPages` and :php:`$GLOBALS['TSFE']->showHiddenRecords`
* :php:`WorkspaceAspect` replaces :php:`$GLOBALS['BE_USER']->workspace`
* :php:`LanguageAspect` replaces various properties related to language Id, overlay and fallback logic, mostly within Frontend
* :php:`UserAspect` replaces various calls and checks on :php:`$GLOBALS['BE_USER']` and :php:`$GLOBALS['TSFE']->fe_user` options when only some information is needed.
TYPO3 Core comes with the following Aspects within the global context:
* date
* frontend.user
* backend.user
* workspace
* visibility
* language
Usage
=====
As for TYPO3 v9, the old properties can be used the same way as before, but will trigger a PHP :php:`E_USER_DEPRECATED` error.
It is recommended to read data from the current global Context for custom extensions:
.. code-block:: php
$context = GeneralUtility::makeInstance(Context::class);
// Reading the current data instead of $GLOBALS['EXEC_TIME']
$currentTimestamp = $context->getPropertyFromAspect('date', 'timestamp');
// Checking if a user is logged in
$userIsLoggedIn = $context->getPropertyFromAspect('frontend.user', 'isLoggedIn');
If an aspect needs to be added, or a middleware replaces an aspect, the main context object can be altered.
However, if custom DB queries need to be made, it is strongly recommended to clone the context object:
.. code-block:: php
// Current global context
$context = GeneralUtility::makeInstance(Context::class);
$localContextWithoutFrontendUser = clone $context;
$localContextWithoutFrontendUser->setAspect('frontend.user', GeneralUtility::makeInstance(UserAspect::class, null);
// Fetch a page which is publicly available, but not accessible when logged in
$sysPage = GeneralUtility::makeInstance(PageRepository::class, $localContextWithoutFrontendUser);
$pageRow = $sysPage->getPage($pageId);
As a rule of thumb:
- If new code is written that depends on external factors for querying data, ensure that a context object
can be handed in via e.g. the constructor.
- If you are sure, that the consuming class is NOT altering the context object, the main context object can be used
- If the consuming class, e.g. ContentObjectRenderer is altering the context object, it is recommended to hand in a clone
of a context.
Further development
===================
There will be additional aspects that will be introduced in TYPO3 Core. Also see PSR-15 middlewares shipped with TYPO3
Frontend or Backend to see how aspects can be modified and set.
Aspects eventually will become the successor of Database Restrictions, as they contain all information
necessary to restrict a database query.
.. index:: PHP-API, ext:core
@@ -0,0 +1,42 @@
.. include:: /Includes.rst.txt
.. _feature-85410:
================================================
Feature: #85410 - Allow TCA description property
================================================
See :issue:`85410`
Description
===========
The new `TCA` property `description` on column field level has been introduced.
The value data type is a localized string, similar and on the same level as `label`.
The property can be used to display an additional help text between the field label and
the user input when editing records. As an example, the core uses the description property
in the site configuration module when editing a site on some properties like `identifier`.
The property is available on all common `TCA` types like `input` and `select` and so on.
Example::
'columns' => [
'myField' => [
'label' => 'My label',
'description' => 'LLL:EXT:my_ext/Resources/Private/Language/locallang_tca.xlf:field.description',
'config' => [
'type' => 'input',
],
],
],
Impact
======
The change is fully backwards compatible and can be used by integrators or administrators
to hint editors for expected field input.
.. index:: Backend, FlexForm, TCA
@@ -0,0 +1,33 @@
.. include:: /Includes.rst.txt
.. _feature-85550:
========================================================================
Feature: #85550 - Introduce context for TypoScript data getText property
========================================================================
See :issue:`85550`
Description
===========
The new context API can now be accessed via the :typoscript:`getText` property in TypoScript.
Example:
.. code-block:: typoscript
page.10 = TEXT
page.10.data = context:workspace:id
page.10.wrap = You are in workspace: |
Where as `context` is the keyword for accessing an aspect, the second part is the name of the aspect,
and the third part is the property of the aspect.
.. code-block:: typoscript
data = context:[aspectName]:[propertyName]
If a property is an array, it is converted into a comma-separated list.
.. index:: TypoScript, ext:frontend
@@ -0,0 +1,29 @@
.. include:: /Includes.rst.txt
.. _feature-85590:
==============================================================
Feature: #85590 - Add hooks for DatabaseRecordList CSV actions
==============================================================
See :issue:`85590`
Description
===========
It is now possible to customize the csv output in the DatabaseRecordList with hooks.
The following two hooks were implemented:
- customizeCsvHeader for the header
- customizeCsvRow for a single row
Example:
.. code-block:: php
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'][DatabaseRecordList::class]['customizeCsvRow'][] = \Vendor\ExtName\Hooks\CsvExport::class . '->customizeCsvRow';
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'][DatabaseRecordList::class]['customizeCsvHeader'][] = \Vendor\ExtName\Hooks\CsvExport::class . '->customizeCsvHeader';
.. index:: Backend, PHP-API
@@ -0,0 +1,98 @@
.. include:: /Includes.rst.txt
.. _feature-85678:
===================================
Feature: #85678 - Add PageTitle API
===================================
See :issue:`85678`
Description
===========
In order to keep setting the titles in control, a new API to set the page title has been introduced.
The API uses :php:`PageTitleProviders` to define the page title based on page record and the content on the page.
Based on the priority of the providers, the :php:`PageTitleProviderManager` will check the providers if a title
is given by the provider. It will start with the highest priority PageTitleProviders and will end with the lowest
in priority.
By default, the core ships three providers. The provider with the (by default) highest priority will be the
:php:`AltPageTitleProvider`. This provider handles the (since TYPO3 v9 deprecated) property
:php:`$GLOBALS['TSFE']->altPageTitle`. If an extension has set a value to this property, this provider will return
that value.
If you have installed the system extension SEO, the second provider will be the :php:`SeoTitlePageTitleProvider`.
When an editor has set a value for the SEO title in the page properties of the page, this provider will provide
that title to the :php:`PageTitleProviderManager`. If you have not installed the SEO system extension, this fields
and provider are not available.
The fallback provider with the lowest priority is the :php:`RecordPageTitleProvider`. When no other title is set
by a provider, this provider will return the title of the page.
Besides the providers shipped by core, you can add own providers. An integrator can define the priority of the
providers for his project.
Create your own PageTitleProvider
=================================
Extension developers may want to have an own provider for page titles. For example if you have an extension with
records and a detail view, the title of the page record will not be the correct title. To make sure to display
the correct page title, you have to create your own :php:`PageTitleProvider`. It is quite easy to create one.
First of all create a PHP class in your extension that implements the :php:`PageTitleProviderInterface`. This will
force you to have at least the :php:`getTitle()` method in your class. Within this method you can create your
own logic to define the correct title.
Define priority of PageTitleProviders
=====================================
The priority of the providers are set by the TypoScript property :typoscript:`config.pageTitleProviders`. This
way an integrator is able to set the priorities for his project and can even have conditions in place.
By default, the core has the following setup:
.. code-block:: typoscript
config.pageTitleProviders {
altPageTitle {
provider = TYPO3\CMS\Core\PageTitle\AltPageTitleProvider
before = record
}
record {
provider = TYPO3\CMS\Core\PageTitle\RecordPageTitleProvider
}
}
The ordering of the providers is based on the `before` and `after` parameters. If you want a provider to be handled
before a specific other provider, just set that provider in the `before`, do the same with `after`.
If you have installed the system extension SEO, you will also get a third provider. The configuration will be:
.. code-block:: typoscript
config.pageTitleProviders {
altPageTitle {
provider = TYPO3\CMS\Core\PageTitle\AltPageTitleProvider
before = record
}
record {
provider = TYPO3\CMS\Core\PageTitle\RecordPageTitleProvider
}
seo {
provider = TYPO3\CMS\Seo\PageTitle\SeoTitlePageTitleProvider
before = record
after = altPageTitle
}
}
First the :php:`AltPageTitleProvider` will be checked, then the :php:`SeoTitlePageTitleProvider` (because it will be
handled before record and after altPageTitle) and if both providers didn't provide a title, the
:php:`RecordPageTitleProvider` will be checked.
You can override these settings within your own installation. You can add as many providers as you want. Be aware
that if a provider returns a non-empty value, all provider with a lower priority won't be checked.
.. index:: Frontend, ext:core, ext:seo
@@ -0,0 +1,24 @@
.. include:: /Includes.rst.txt
.. _feature-85691:
==============================================================
Feature: #85691 - Show page path for references in record info
==============================================================
See :issue:`85691`
Description
===========
The page path of record references is displayed into the table found in the record info.
This field will display the full path to the record referencing the record in order to
make it easier for an editor to follow to the target.
Impact
======
Record references via the record info are easier to find.
.. index:: Backend, ext:backend
@@ -0,0 +1,33 @@
.. include:: /Includes.rst.txt
.. _feature-85698:
====================================================
Feature: #85698 - New type=input eval saltedPassword
====================================================
See :issue:`85698`
Description
===========
Setting passwords and storing them as salted passwords in the database
is now supported by adding the eval option :php:`saltedPassword` to :php:`TCA` :php:`type=input`
fields.
Fields having this eval set will get their value evaluated to a salted
hash before they are stored by the :php:`DataHandler`.
Note the salt configuration for backend (BE) is considered when using this eval
on tables that is not the :php:`fe_users` table.
Impact
======
The new eval substitutes custom code that has been done within the
salted passwords extension before. It has no impact on instances
being upgraded.
.. index:: Backend, TCA
@@ -0,0 +1,43 @@
.. include:: /Includes.rst.txt
.. _feature-85719:
======================================================
Feature: #85719 - Allow sites without scheme or domain
======================================================
See :issue:`85719`
Description
===========
Since the inception of site handling, the definition of a site base - the URL prefix - was limited to
only allow a full URI with scheme (HTTP/HTTPS) and domain. This didn't allow to run TYPO3 on multiple
domains, basically limiting the URL-resolving ("Site Routing") compared to previous URL handling
solutions in the past.
A new site routing based on symfony/routing component allows to have a flexible routing based on
specific schemes.
Impact
======
It is now possible to set a site base prefix to just "/site1" and "/site2" or "www.mydomain.com" instead
of entering a full URI.
This allows to have a Site base e.g. `www.mydomain.com` to be detected with http and https protocols,
although it is recommended to do a HTTP to HTTPS redirect either on the webserver level, via a
.htaccess rewrite rule, or by adding a redirect in TYPO3.
Please also note that this improved flexibility will introduce side-effects when having multiple sites
with mixed configuration settings as Site base:
- Site 1: `/mysite/`
- Site 2: `www.mydomain.com`
will be unspecific when detecting a URL like `www.mydomain/mysite/` and can lead to side-effects.
In this case, it is necessary by the Site Administrator to define unique Site base prefixes.
.. index:: Frontend
@@ -0,0 +1,126 @@
.. include:: /Includes.rst.txt
.. _feature-85828:
=========================================================================
Feature: #85828 - Move symfony expression language handling into EXT:core
=========================================================================
See :issue:`85828`
Description
===========
The symfony expression language handling has been moved out of EXT:form into EXT:core.
Thus, it is available to be used throughout the core and also for extension developers.
To use the expression language, a provider definition is required which implements the
:php:`\TYPO3\CMS\Core\ExpressionLanguage\ProviderInterface`.
The core comes with a :php:`\TYPO3\CMS\Core\ExpressionLanguage\DefaultProvider` class which can be used directly.
For a custom implementation the :php:`\TYPO3\CMS\Core\ExpressionLanguage\AbstractProvider` class can be extended.
The provider can provide additional variables and expression functions to extend the expression language.
For a custom implementation check out the :php:`\TYPO3\CMS\Form\Domain\Condition\ConditionProvider` class.
An example with the DefaultProvider:
.. code-block:: php
$resolver = GeneralUtility::makeInstance(
Resolver::class,
'default',
[
'foo' => 1,
'bar' => 2,
]
);
$resolver->evaluate('1 < 2'); // result is true
$resolver->evaluate('foo < bar'); // result is true
$resolver->evaluate('bar < foo'); // result is false
An example with a custom Provider:
First you have to configure a provider, create a file in your extension with the path and name :file:`EXT:my_ext/Configuration/ExpressionLanguage.php`:
.. code-block:: php
<?php
return [
'my-context-identifier' => [
\TYPO3\CMS\MyExt\ExpressionLanguage\MyCustomProvider::class,
]
];
Next implement your provider class :php:`\TYPO3\CMS\MyExt\ExpressionLanguage\MyCustomProvider::class`
.. code-block:: php
class MyCustomProvider extends \TYPO3\CMS\Core\ExpressionLanguage\AbstractProvider
{
public function __construct()
{
$this->expressionLanguageVariables = [
'foo' => 1,
'bar' => 2,
];
$this->expressionLanguageProviders = [
// We use the existing Typo3ConditionsFunctions...
Typo3ConditionFunctionsProvider::class,
// ... and our custom function provider
MyCustomFunctionsProvider::class
];
}
}
Next implement your provider class :php:`\TYPO3\CMS\MyExt\ExpressionLanguage\MyCustomFunctionProvider::class`
.. code-block:: php
class MyCustomFunctionProvider implements ExpressionFunctionProviderInterface
{
public function getFunctions()
{
return [
$this->getFooFunction(),
];
}
protected function getFooFunction(): ExpressionFunction
{
return new ExpressionFunction('compatVersion', function ($str) {
// Not implemented, we only use the evaluator
}, function ($arguments, $str) {
return $str === 'foo';
});
}
}
And now we use it:
.. code-block:: php
$resolver = GeneralUtility::makeInstance(
Resolver::class,
'my-context-identifier',
[
'baz' => 3,
]
);
$resolver->evaluate('1 < 2'); // result is true
$resolver->evaluate('foo < bar'); // result is true
$resolver->evaluate('bar < baz'); // result is true
$resolver->evaluate('bar < foo'); // result is false
$resolver->evaluate('foo("foo")'); // result is true
$resolver->evaluate('foo("bar")'); // result is false
Impact
======
The expression language can now be used in other scopes and has no dependency to EXT:form.
.. index:: Backend, Frontend, PHP-API, ext:core
@@ -0,0 +1,256 @@
.. include:: /Includes.rst.txt
.. _feature-85829:
=================================================================================
Feature: #85829 - Implement symfony expression language for TypoScript conditions
=================================================================================
See :issue:`85829`
Description
===========
The `symfony expression language <https://symfony.com/doc/current/components/expression_language.html>`__
has been implemented for TypoScript conditions in both frontend and backend.
The existing conditions are available as variables and/or functions. Please check the following tables in detail.
General Usage
-------------
To learn the full power of the symfony expression language please check the `documentation for the common expression syntax <https://symfony.com/doc/current/components/expression_language/syntax.html>`__.
Here are some examples to understand the power of the expression language:
.. code-block:: typoscript
[page["uid"] in 18..45]
# This condition matches if current page uid is between 18 and 45
[END]
[frontend.user.userId in [1,5,7]]
# This condition matches if current logged in frontend user has the uid 1, 5 or 7
[END]
[not ("foo" matches "/bar/")]
# This condition does match if "foo" **not** matches the regExp: `/bar/`
[END]
[applicationContext == "Production" && userId == 15]
# This condition matches if application context is "Production" AND logged in user has the uid 15
# Note that the old syntax with two blocks combined with && is deprecated
# and will not work in v10:
# [applicationContext == "Production"] && [userId == 15]
[END]
[request.getNormalizedParams().getHttpHost() == 'typo3.org']
# This condition matches if current hostname is typo3.org
[END]
[like(request.getNormalizedParams().getHttpHost(), "*.devbox.local")]
# This condition matches if current hostname is any subdomain of devbox.local
[END]
[request.getNormalizedParams().isHttps() == false]
# This condition matches if current request is **not** https
[END]
[request.getPageArguments().get('foo_id') > 0]
# This condition matches if the GET parameter foo_id is greater than 0.
# getPageArguments() contains resolved route parts from enhancers which
# request.getQueryParams() does not contain.
[END]
[traverse(request.getQueryParams(), 'tx_news_pi1/news') > 0]
# This condition matches if current query parameters have tx_news_pi[news] set to a value greater than zero
[END]
Variables
---------
The following variables are available. The values are context related.
+---------------------+------------+------------------------------------------------------------------------------+
| Variable | Type | Description |
+=====================+============+==============================================================================+
| applicationContext | String | current application context as string |
+---------------------+------------+------------------------------------------------------------------------------+
| page | Array | current page record as array |
+---------------------+------------+------------------------------------------------------------------------------+
| {$foo.bar} | Constant | Any TypoScript constant is available like before. |
| | | Depending on the type of the constant you have to use |
| | | different conditions, see examples below: |
| | | |
| | | * if constant is an integer: `[{$foo.bar} == 4711]` |
| | | * if constant is a string put constant in quotes: `["{$foo.bar}" == "4711"]` |
+---------------------+------------+------------------------------------------------------------------------------+
| tree | Object | object with tree information |
| | | |
| .level | Integer | current tree level |
| | | |
| .rootLine | Array | array of arrays with uid and pid |
| | | |
| .rootLineIds | Array | an array with UIDs of the root line |
| | | |
| .rootLineParentIds | Array | an array with parent UIDs of the root line |
+---------------------+------------+------------------------------------------------------------------------------+
| backend | Object | object with backend information (available in BE only) |
| | | |
| .user | Object | object with current backend user information |
| | | |
| .user.isAdmin | Boolean | true if current user is admin |
| | | |
| .user.isLoggedIn | Boolean | true if current user is logged in |
| | | |
| .user.userId | Integer | UID of current user |
| | | |
| .user.userGroupList | String | comma list of group UIDs |
+---------------------+------------+------------------------------------------------------------------------------+
| frontend | Object | object with frontend information (available in FE only) |
| | | |
| .user | Object | object with current frontend user information |
| | | |
| .user.isLoggedIn | Boolean | true if current user is logged in |
| | | |
| .user.userId | Integer | UID of current user |
| | | |
| .user.userGroupList | String | comma list of group UIDs |
+---------------------+------------+------------------------------------------------------------------------------+
| workspace | Object | object with workspace information |
| | | |
| .workspaceId | Integer | id of current workspace |
| | | |
| .isLive | Boolean | true if current workspace is live |
| | | |
| .isOffline | Boolean | true if current workspace is offline |
+---------------------+------------+------------------------------------------------------------------------------+
| typo3 | Object | object with TYPO3 related information |
| | | |
| .version | String | TYPO3_version (e.g. 9.4.0-dev) |
| | | |
| .branch | String | TYPO3_branch (e.g. 9.4) |
| | | |
| .devIpMask | String | :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask']` |
+---------------------+------------+------------------------------------------------------------------------------+
Functions
---------
Functions take over the logic of the old conditions which do more than a simple comparison check.
The following functions are available in **any** context:
+------------------------+-----------------------+-------------------------------------------------------------------------+
| Function | Parameter | Description |
+========================+=======================+=========================================================================+
| request | Custom Object | This object provides 6 methods |
| | | |
| .getQueryParams() | | `[request.getQueryParams()['foo'] == 1]` |
| | | |
| .getParsedBody() | | `[request.getParsedBody()['foo'] == 1]` |
| | | |
| .getHeaders() | | `[request.getHeaders()['Accept'] == 'json']` |
| | | |
| .getCookieParams() | | `[request.getCookieParams()['foo'] == 1]` |
| | | |
| .getNormalizedParams() | | `[request.getNormalizedParams().isHttps()]` |
| | | |
| .getPageArguments() | | `[request.getPageArguments().get('foo_id') > 0]` |
+------------------------+-----------------------+-------------------------------------------------------------------------+
| date | String | Get current date in given format. |
| | | Examples: |
| | | |
| | | * true if day of current month is 7: `[date("j") == 7]` |
| | | * true if day of current week is 7: `[date("w") == 7]` |
| | | * true if day of current year is 7: `[date("z") == 7]` |
| | | * true if current hour is 7: `[date("G") == 7]` |
+------------------------+-----------------------+-------------------------------------------------------------------------+
| like | String | This function has two parameters: |
| | | the first parameter is the string to search in |
| | | the second parameter is the search string |
| | | Example: `[like("foobarbaz", "*bar*")]` |
+------------------------+-----------------------+-------------------------------------------------------------------------+
| traverse | Array and String | This function has two parameters: |
| | | - first parameter is the array to traverse |
| | | - second parameter is the path to traverse |
| | | Syntax: <array-key>[/<array-key>]* |
| | | Example: `[traverse(request.getQueryParams(), 'tx_news_pi1/news') > 0]` |
+------------------------+-----------------------+-------------------------------------------------------------------------+
| ip | String | Value or Constraint, Wildcard or RegExp possible |
| | | special value: devIP (match the devIPMask) |
+------------------------+-----------------------+-------------------------------------------------------------------------+
| compatVersion | String | version constraint, e.g. `9.4` or `9.4.0` |
+------------------------+-----------------------+-------------------------------------------------------------------------+
| loginUser | String | value or constraint, wildcard or RegExp possible |
| | | Examples: |
| | | |
| | | * `[loginUser('*')]` // any logged in user |
| | | * `[loginUser(1)]` // user with uid 1 |
| | | * `[loginUser('1,3,5')]` // user 1, 3 or 5 |
| | | * `[loginUser('*') == false]` // not logged in |
+------------------------+-----------------------+-------------------------------------------------------------------------+
| getTSFE | Object | TypoScriptFrontendController (:php:`$GLOBALS['TSFE']`) |
| | | |
| | | Conditions based on `getTSFE()` used in a context where |
| | | TSFE is not available will always evaluate to false. |
+------------------------+-----------------------+-------------------------------------------------------------------------+
| getenv | String | PHP function: :php:`getenv()` |
+------------------------+-----------------------+-------------------------------------------------------------------------+
| usergroup | String | value or constraint, wildcard or RegExp possible |
+------------------------+-----------------------+-------------------------------------------------------------------------+
The following functions are only available in **frontend** context:
+--------------------+------------+-----------------------------------------------------------------+
| Function | Parameter | Description |
+====================+============+=================================================================+
| session | String | Get value from session |
| | | |
| | | Example, matches if session value = 1234567 |
| | | `[session("session:foo|bar") == 1234567]` |
+--------------------+------------+-----------------------------------------------------------------+
| site | String | get value from site configuration, or null if |
| | | no site was found or property does not exist |
| | | |
| | | Example, matches if site identifier = foo |
| | | `[site("identifier") == "foo"]` |
| | | |
| | | Example, matches if site `base = http://localhost` |
| | | `[site("base") == "http://localhost"]` |
+--------------------+------------+-----------------------------------------------------------------+
| siteLanguage | String | get value from siteLanguage configuration, or |
| | | null if no site was found or property does not exist |
| | | |
| | | Example, match if siteLanguage locale = foo |
| | | `[siteLanguage("locale") == "de_CH"]` |
| | | |
| | | Example, match if siteLanguage title = Italy |
| | | `[siteLanguage("title") == "Italy"]` |
+--------------------+------------+-----------------------------------------------------------------+
Extending the expression language with own functions (like old userFunc)
------------------------------------------------------------------------
It is possible to extend the expression language with own functions like before userFunc in the old conditions.
An example could be :php:`TYPO3\CMS\Core\ExpressionLanguage\FunctionsProvider\TypoScriptConditionFunctionsProvider` which implements
the most core functions.
Please read .. _the introduction: https://docs.typo3.org/typo3cms/extensions/core/Changelog/9.4/Feature-85828-MoveSymfonyExpressionLanguageHandlingIntoEXTcore.html first.
Add new methods by implementing own providers which implement the :php:`ExpressionFunctionProviderInterface` and
register the provider for the key `typoscript` in your own :file:`Configuration/ExpressionLanguage.php` file:
.. code-block:: php
return [
'typoscript' => [
\TYPO3\CMS\MyExt\ExpressionLanguage\MyCustomProvider::class,
]
];
The code above will extend the TypoScript condition configuration with your own provider, which provide your own functions.
.. index:: Backend, Frontend, TypoScript, ext:core
@@ -0,0 +1,24 @@
.. include:: /Includes.rst.txt
.. _feature-85894:
=========================================================
Feature: #85894 - Feature toggles in Admin Tools Settings
=========================================================
See :issue:`85894`
Description
===========
Feature toggles registered in :file:`DefaultConfiguration.php` and documented
in :file:`DefaultConfigurationDescription.yaml` can now be toggled using
the interface Admin Tools -> Settings -> Feature toggles.
Impact
======
Toggling core features is possible using the backend.
.. index:: Backend, LocalConfiguration, ext:install

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