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>