.. include:: /Includes.rst.txt
.. _deprecation-99739-1674869090:
======================================================
Deprecation: #99739 - Indexed array keys for TCA items
======================================================
See :issue:`99739`
Description
===========
Using indexed array keys for the :php:`items` configuration of TCA types
:php:`select`, :php:`radio` and :php:`check` is now deprecated.
Impact
======
Using indexed array keys for the :php:`items` configuration array items of TCA
types :php:`select`, :php:`radio` and :php:`check` will trigger a deprecation
level log entry. A TCA migration is in place.
Affected installations
======================
All installations having custom extensions that make use of TCA types
:php:`select`, :php:`radio` or :php:`check` and define at least one entry in
the :php:`items` array.
itemsProcFunc
_____________
The :php:`items` array handed over to custom :php:`itemsProcFunc` functions
contains the new object type :php:`TYPO3\CMS\Core\Schema\Struct\SelectionItem`
which acts as a compatibility layer for old style indexed keys. Accessing,
writing and reading items still work in the old way. Added items will be
automatically converted. For third-party extensions supporting both TYPO3 v11
(or lower) and v12 it is recommended to keep using indexed keys.
Migration
=========
To migrate your TCA, change all indexed keys according to the following mapping
table:
+--------+-------------+
| Before | After |
+--------+-------------+
| 0 | label |
+--------+-------------+
| 1 | value |
+--------+-------------+
| 2 | icon |
+--------+-------------+
| 3 | group |
+--------+-------------+
| 4 | description |
+--------+-------------+
Examples:
.. code-block:: php
// Before
'select' => [
'label' => 'My select field',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
[
'Selection 1',
'1',
'my-icon-identifier',
'default',
],
[
0 => 'Selection 2',
1 => '2',
],
],
],
],
// After
'select' => [
'label' => 'My select field',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
[
'label' => 'Selection 1',
'value' => '1',
'icon' => 'my-icon-identifier',
'group' => 'default',
],
[
'label' => 'Selection 2',
'value' => '2',
],
],
],
],
// Before
'select_checkbox' => [
'label' => 'My select checkbox field',
'config' => [
'type' => 'select',
'renderType' => 'selectCheckBox',
'items' => [
[
'My select checkbox field',
'1',
'my-icon-identifier',
'default',
'My custom description',
],
[
0 => 'My select checkbox field',
1 => 'value' => '2',
],
],
],
],
// After
'select_checkbox' => [
'label' => 'My select checkbox field',
'config' => [
'type' => 'select',
'renderType' => 'selectCheckBox',
'items' => [
[
'label' => 'My select checkbox field',
'value' => '1',
'icon' => 'my-icon-identifier',
'group' => 'default',
'description' => 'My custom description',
],
[
'label' => 'My select checkbox field',
'value' => '2',
],
],
],
],
// Before
'radio' => [
'label => 'My radio field',
'config' => [
'type' => 'radio',
'items' => [
[
'Radio 1',
'1',
],
[
0 => 'Radio 2',
1 => '2',
],
],
],
],
// After
'radio' => [
'label => 'My radio field',
'config' => [
'type' => 'radio',
'items' => [
[
'label' => 'Radio 1',
'value' => '1',
],
[
'label' => 'Radio 2',
'value' => '2',
],
],
],
],
// Before
'check' => [
'config' => [
'type' => 'check',
'items' => [
['Click on me'],
],
],
],
// After
'check' => [
'config' => [
'type' => 'check',
'items' => [
['label' => 'Click on me'],
],
],
],
// Before
'check' => [
'config' => [
'type' => 'check',
'items' => [
[
'invertStateDisplay' => true,
0 => 'Click on me',
],
],
],
],
// After
'check' => [
'config' => [
'type' => 'check',
'items' => [
[
'invertStateDisplay' => true,
'label' => 'Click on me',
],
],
],
],
Before:
.. code-block:: xml
field description
select
selectSingle
foo1
foo1
foo2
foo2
After:
.. code-block:: xml
field description
select
selectSingle
foo1
foo2
.. index:: TCA, FullyScanned, ext:backend