---
title: "itemsProcessors: Processing of items for select, check and radio type fields"
manual: "TCA Reference"
version: "14.3"
permalink: "https://docs.typo3.org/permalink/t3tca:tca-property-itemsprocessors@14.3"
source: "ColumnsConfig/CommonProperties/ItemsProcessors.rst"
rendered: "2026-10-01T16:42:39+00:00"
---

# itemsProcessors: Processing of items for select, check and radio type fields {#tca-property-itemsprocessors}

The TCA option `itemsProcessors` provides a structured and extensible way
to process items for `select`, `check`, and `radio` type fields. It
supersedes `itemsProcFunc` by allowing multiple processors to be applied
in a defined order using a strictly typed API.

The option is defined as an array of processors. Each processor is executed
sequentially based on its numerical array key, with lower values executed
first. This makes it possible for extensions or integrators to add additional
processing steps without replacing existing logic.

`itemsProcFunc` can still be used, but `itemsProcessors` is the recommended
approach. If both `itemsProcFunc` and `itemsProcessors` are configured,
both are executed. In that case, `itemsProcFunc` is executed first.

## TCA item processor registration {#tca-property-itemsprocessors-registration}

**EXT:my_extension/Configuration/TCA/tx_myextension_mytable.php**

```php
<?php

use MyVendor\MyExtension\Processors\SpecialRelationsProcessor;
use MyVendor\MyExtension\Processors\SpecialRelationsProcessor2;

return [
  'ctrl' => [
    'title' => 'My table',
    'label' => 'relation',
  ],
  'columns' => [
    'relation' => [
      'label' => 'Relational field',
      'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'items' => [
          [
            'value' => 0,
            'label' => '',
          ],
        ],
        'foreign_table' => 'tx_myextension_related',
        'itemsProcessors' => [
          100 => [
            'class' => SpecialRelationsProcessor::class,
            'parameters' => [
              'foo' => 'bar',
            ],
          ],
          50 => [
            'class' => SpecialRelationsProcessor2::class,
          ],
        ],
      ],
    ],
  ],
  'types' => [
    '0' => [
      'showitem' => 'relation',
    ],
  ],
];

```

In this example, `SpecialRelationsProcessor2` is executed before
`SpecialRelationsProcessor`.

## TCA item processor implementation {#tca-property-itemsprocessors-implementation}

All processors must implement the
`\TYPO3\CMS\Core\DataHandling\ItemsProcessorInterface`.

Processors have two parameters:

-   A `\TYPO3\CMS\Core\Schema\Struct\SelectItemCollection` instance
    containing the current items.
-   An `\TYPO3\CMS\Core\DataHandling\ItemsProcessorContext` instance
    providing access to table, field, row data, and configuration.

A processor must return a
`\TYPO3\CMS\Core\Schema\Struct\SelectItemCollection`. Since items
are handled as objects, newly added items can no longer be represented as
untyped arrays.

**EXT:my_extension/Classes/Processors/SpecialRelationsProcessor.php**

```php
<?php

declare(strict_types=1);

namespace MyVendor\MyExtension\Processors;

use TYPO3\CMS\Core\DataHandling\ItemsProcessorContext;
use TYPO3\CMS\Core\DataHandling\ItemsProcessorInterface;
use TYPO3\CMS\Core\Schema\Struct\SelectItem;
use TYPO3\CMS\Core\Schema\Struct\SelectItemCollection;

final class SpecialRelationsProcessor implements ItemsProcessorInterface
{
  public function processItems(
    SelectItemCollection $items,
    ItemsProcessorContext $context,
  ): SelectItemCollection {
    $items->add(
      new SelectItem(
        type: 'select',
        label: sprintf('Extra item: %s', $context->processorParameters['foo'] ?? ''),
        value: 42,
      )
    );

    return $items;
  }
}

```

You can add your own parameters to processors. They are exposed
via the processor context.

Add parameters via TCA or page TSconfig and access them through
`$context->processorParameters`.

For example, the following item processor configuration:

**EXT:my_extension/Configuration/TCA/tx_myextension_mytable.php**

```php
<?php

use MyVendor\MyExtension\Processors\SpecialRelationsProcessor;
use MyVendor\MyExtension\Processors\SpecialRelationsProcessor2;

return [
  'ctrl' => [
    'title' => 'My table',
    'label' => 'relation',
  ],
  'columns' => [
    'relation' => [
      'label' => 'Relational field',
      'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'items' => [
          [
            'value' => 0,
            'label' => '',
          ],
        ],
        'foreign_table' => 'tx_myextension_related',
        'itemsProcessors' => [
          100 => [
            'class' => SpecialRelationsProcessor::class,
            'parameters' => [
              'foo' => 'bar',
            ],
          ],
          50 => [
            'class' => SpecialRelationsProcessor2::class,
          ],
        ],
      ],
    ],
  ],
  'types' => [
    '0' => [
      'showitem' => 'relation',
    ],
  ],
];

```

can access `$context->processorParameters['foo']`. The value can be overridden
or extended, for example via a site setting defined in page TSconfig:

**EXT:my_extension/Configuration/Sets/MySet/page.tsconfig**

```typoscript
TCEFORM.tx_myextension_mytable.relation.itemsProcessors.100.foo = {$myExtension.bar}
```

## Registering item processors in FlexForms {#tca-property-items-processors-registering-item-processors}

Registration of processors is also possible inside FlexForms:

**EXT:my_extension/Configuration/FlexForms/SomeForm.xml**

```xml
<T3DataStructure>
  <sheets>
    <sDEF>
      <ROOT>
        <sheetTitle>General</sheetTitle>
        <type>array</type>
        <el>
          <settings.choice>
            <label>Choice</label>
            <config>
              <type>select</type>
              <renderType>selectSingle</renderType>
              <foreign_table>tx_myextension_related</foreign_table>
              <itemsProcessors>
                <numIndex index="100">
                  <class>MyVendor\MyExtension\Processors\SpecialRelationsProcessor</class>
                </numIndex>
              </itemsProcessors>
            </config>
          </settings.choice>
        </el>
      </ROOT>
    </sDEF>
  </sheets>
</T3DataStructure>

```
