Deprecation: #99739 - Indexed array keys for TCA items
See forge#99739
Description
Using indexed array keys for the
items configuration of TCA types
select,
radio and
check is now deprecated.
Impact
Using indexed array keys for the
items configuration array items of TCA
types
select,
radio and
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
select,
radio or
check and define at least one entry in
the
items array.
itemsProcFunc
The
items array handed over to custom
items functions
contains the new object type
\TYPO3\
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:
// 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:
<select_single_1>
<label>select_single_1 description</label>
<description>field description</description>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<numIndex index="0">foo1</numIndex>
<numIndex index="1">foo1</numIndex>
</numIndex>
<numIndex index="1">
<numIndex index="0">foo2</numIndex>
<numIndex index="1">foo2</numIndex>
</numIndex>
</items>
</config>
</select_single_1>
After:
<select_single_1>
<label>select_single_1 description</label>
<description>field description</description>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<label>foo1</label>
<value>foo1</value>
</numIndex>
<numIndex index="1">
<label>foo2</label>
<value>foo2</value>
</numIndex>
</items>
</config>
</select_single_1>