---
title: "Record types"
manual: "TCA Reference"
version: "14.3"
permalink: "https://docs.typo3.org/permalink/t3tca:types-introduction@14.3"
source: "Types/Index.rst"
rendered: "2026-10-01T16:42:39+00:00"
---

# Record types {#types-introduction}

> [!NOTE]
> **See also**
>
> [Field types (config > type)](https://docs.typo3.org/permalink/t3tca:columns-types@14.3)
> are a different concept to record types.

A `types` section is mandatory in all table definitions.

The `types` section is an array of types `$GLOBALS['TCA'][$table]['types']` each
containing a `showitem` key which determines which fields will be displayed in
the backend form for the record. Most TCA tables will only contain one type.

However, it is possible to have many types in the same table with different fields
being displayed depending on the type. Then a new database field needs to be created
to save the type with the data. This field is set in
[$GLOBALS\['TCA'\]\[$table\]\['ctrl'\]\['type'\]](https://docs.typo3.org/permalink/t3tca:confval-ctrl-type@14.3).

Defining multiple types in one table is similar to
[Single Table Inheritance](https://en.wikipedia.org/wiki/Single_Table_Inheritance)
in Object-orientated programming.

**Table of Contents**

-   [A basic table without distinct types](https://docs.typo3.org/permalink/t3tca:a-basic-table-without-distinct-types@14.3)
-   [Supporting multiple record types in the same table](https://docs.typo3.org/permalink/t3tca:supporting-multiple-record-types-in-the-same-table@14.3)
-   [Properties of types section of TCA](https://docs.typo3.org/permalink/t3tca:properties-of-types-section-of-tca@14.3)
-   [Extended examples for using the types section of TCA](https://docs.typo3.org/permalink/t3tca:extended-examples-for-using-the-types-section-of-tca@14.3)

**Subpages**

-   [tt_content system fields](https://docs.typo3.org/permalink/t3tca:automatically-added-system-fields-to-content-types-tt-content@14.3)

<!-- TODO: no Markdown rendering for "versionchanged" -->

Creating content elements has been simplified by removing the need to
define the system fields for each element again and again. This shrinks
down a content element's showitem to just the element
specific fields. See also the automatically added system fields.

## A basic table without distinct types {#types-examples-required-minimal}

A table record supporting only one type defines
which fields should be displayed in the backend form for the default type.

As an example, a comment on a blog post can be stored in a table as follows:

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

```php
<?php

return [
  'ctrl' => [
    'title' => 'Comment',
    'label' => 'name',
    'enablecolumns' => [
      'disabled' => 'hidden',
    ],
  ],
  'types' => [
    '0' => [
      'showitem' => 'hidden, name, email, content, date',
    ],
  ],
  'columns' => [
    'name' => [
      'label' => 'Name',
      'config' => [
        'type' => 'input',
      ],
    ],
    'email' => [
      'label' => 'Email',
      'config' => [
        'type' => 'email',
      ],
    ],
    'content' => [
      'label' => 'Comment',
      'config' => [
        'type' => 'text',
      ],
    ],
    'date' => [
      'label' => 'Date',
      'config' => [
        'type' => 'datetime',
      ],
    ],
  ],
];

```

The `types` section is mandatory.

## Supporting multiple record types in the same table {#types-optional}

If a table supports multiple record types, the type of the record must be
saved in a dedicated database field, commonly named `record_type` or just `type`.
Usually a select field is used for that purpose.

The name of this field is registered in the `ctrl` section via property
[type](https://docs.typo3.org/permalink/t3tca:confval-ctrl-type@14.3).

As an example, a blog post might have several types where the fields
displayed in the backend differ:

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

```php
<?php

return [
  'ctrl' => [
    'title' => 'LLL:my_extension.db:tx_myextension_domain_model_post',
    'label' => 'title',
    'type' => 'record_type',
    'typeicon_classes' => [
      '0' => 'tx-blog-post',
      'link' => 'tx-blog-post-link',
      'special' => 'tx-blog-post-special',
    ],
    'enablecolumns' => [
      'disabled' => 'hidden',
      'starttime' => 'starttime',
      'endtime' => 'endtime',
      'fe_group' => 'fe_group',
    ],
    'languageField' => 'sys_language_uid',
    'transOrigPointerField' => 'l10n_parent',
  ],
  'types' => [
    '0' => [
      'showitem' => '
        record_type, blog, title, date, author, content,
        --div--;core.form.tabs:access,
          hidden,
          --palette--;;paletteStartStop,
          fe_group,
        --div--;core.form.tabs:language,
          --palette--;;paletteLanguage,
      ',
    ],
    'link' => [
      'title' => 'LLL:my_extension.db:link.title',
      'showitem' => 'record_type, blog, title, date, author, link',
      'creationOptions' => [
        'defaultValues' => [
          'author' => 'External Author',
        ],
      ],
    ],
    'special' => [
      'title' => 'LLL:my_extension.db:special.title',
      'showitem' => 'record_type, blog, title, date, author, content, tags',
      'columnsOverrides' => [
        'author' => [
          'config' => [
            'required' => true,
          ],
        ],
        'content' => [
          'description' => 'You can use Markdown syntax for the content.',
          'config' => [
            'renderType' => 'codeEditor',
          ],
        ],
      ],
    ],
  ],
  'palettes' => [
    'paletteStartStop' => [
      'showitem' => 'starttime, endtime',
    ],
    'paletteLanguage' => [
      'showitem' => 'sys_language_uid, l10n_parent',
    ],
  ],
  'columns' => [
    'record_type' => [
      'label' => 'LLL:my_extension.labels:post_types',
      'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'items' => [
          ['label' => 'Blog Post', 'value' => '0'],
          ['label' => 'Link to External Blog Post', 'value' => 'link'],
          ['label' => 'Special Blog Post', 'value' => 'special'],
        ],
        'default' => '0',
      ],
    ],
    'blog' => [
      'label' => 'Blog',
      'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'foreign_table' => 'tx_myextension_domain_model_blog',
      ],
    ],
    'title' => [
      'label' => 'Title',
      'config' => [
        'type' => 'input',
      ],
    ],
    'date' => [
      'label' => 'Date',
      'config' => [
        'type' => 'datetime',
      ],
    ],
    'author' => [
      'label' => 'Author',
      'config' => [
        'type' => 'input',
      ],
    ],
    'content' => [
      'label' => 'Content',
      'config' => [
        'type' => 'text',
      ],
    ],
    'link' => [
      'label' => 'Link',
      'config' => [
        'type' => 'link',
      ],
    ],
    'tags' => [
      'label' => 'Tags',
      'config' => [
        'type' => 'input',
      ],
    ],
  ],
];

```

For each record type you can define additional
[creationOptions](https://docs.typo3.org/permalink/t3tca:confval-types-creationoptions@14.3)
and change field display definitions via
[columnsOverrides](https://docs.typo3.org/permalink/t3tca:confval-types-columnsoverrides@14.3).

It is also possible to define [previewRenderers](https://docs.typo3.org/permalink/t3tca:confval-types-previewrenderer@14.3).

You can also define icons for each type using the property
[ctrl -> typeicon_classes](https://docs.typo3.org/permalink/t3tca:confval-ctrl-typeicon-classes@14.3).

## Properties of `types` section of TCA {#types-properties}

-   **allowedRecordTypes**

    -   *Type:* array of table names or `['*']`
    -   *Default:* `['pages', 'sys_category', 'sys_file_reference', 'sys_file_collection']`
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$type\]\['allowedRecordTypes'\]

    <!-- TODO: no Markdown rendering for "versionadded" -->

    This property replaces the now deprecated method
    PageDoktypeRegistry->addAllowedRecordTypes().> [!NOTE]
    > This property is only interpreted in the table `pages`.

    The array can contain a list of table names or a single entry with an asterisk
    `*` to allow all types within a page type.

    See [TYPO3 Explained: Create new Page Type](https://docs.typo3.org/m/typo3/reference-coreapi/14.3/en-us/ApiOverview/PageTypes/CreateNewPageType.html#page-types-example)
    for a complete example.

-   **columnsOverrides**

    -   *Type:* array (columns fields overrides)
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$type\]\['columnsOverrides'\]
    -   *Scope:* Display
    -   *Examples:* [Examples for columnsOverrides](https://docs.typo3.org/permalink/t3tca:types-examples-columnsoverrides@14.3)

    Changed or added \['columns'\] field display definitions.

    This allows different field column definitions to be applied when a record of this type is edited. Currently,
    only the display of form fields is affected, not data handling.

    A typical property that can be changed is `renderType`.

    The core uses this property to override the "bodytext" field config of table "tt_content". If a record
    of type "text" is edited, it adds "enableRichtext = 1" to trigger an RTE to the default "bodytext" configuration,
    and if a type "table" is edited, it adds "renderType = textTable" and "wrap = off" to "bodytext".

    The FormEngine basically merges "columnsOverrides" over the default "columns" field after the record type
    has been determined.

    > [!WARNING]
    > **Attention**
    >
    > It is not possible to override any properties in "Proc." scope: The DataHandler does not take "columnsOverrides"
    > into account. Only pure "Display" related properties can be overridden. This especially means that
    > columns config 'type' must **not** be set to a different value.

-   **creationOptions**

    -   *Type:* list of options
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$type\]\['creationOptions'\]

    -   **defaultValues**

        -   *Type:* array
        -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$type\]\['creationOptions'\]\['defaultValues'\]
        -   *Examples:* [the example that creates the blog plugin at once](https://docs.typo3.org/permalink/t3tca:types-example-creation-option@14.3)

        Default values inserted into the fields of the `tt_content` record on
        creation via the "New Content Element" wizard

        Can be overridden with page TSconfig option
        [tt_content_defValues](https://docs.typo3.org/m/typo3/reference-typoscript/14.3/en-us/PageTsconfig/Mod/Wizards.html#confval-mod-wizards-newcontentelement-wizarditems-group-elements-name-tt-content-defvalues).

    -   **enableDirectRecordTypeCreation**

        -   *Type:* bool
        -   *Default:* true
        -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$type\]\['creationOptions'\]\['enableDirectRecordTypeCreation'\]

        <!-- TODO: no Markdown rendering for "versionadded" -->

        Record types registered via TCA are automatically displayed in the
        "Create new record" component in the backend module
        **Content > Records**.

        A record type can be removed from that component via:

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

        ```php
        $GLOBALS['TCA']['tx_myextension_mytable']['types']['my_type']['creationOptions']['enableDirectRecordTypeCreation'] = false;
        ```

        Event `\TYPO3\CMS\Backend\Controller\Event\ModifyNewRecordCreationLinksEvent`
        can be used for more sophisticated modification of the dialogue.

    -   **saveAndClose**

        -   *Type:* bool
        -   *Default:* false
        -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$type\]\['creationOptions'\]\['saveAndClose'\]
        -   *Examples:* [the example that creates the blog plugin at once](https://docs.typo3.org/permalink/t3tca:types-example-creation-option@14.3)

        If true, clicking on the new element wizard will take the user directly
        to the **Content > Layout** module, rather than showing the
        edit form from the form engine.

        Can be overridden with page TSconfig option
        [saveAndClose](https://docs.typo3.org/m/typo3/reference-typoscript/14.3/en-us/PageTsconfig/Mod/Wizards.html#confval-mod-wizards-newcontentelement-wizarditems-group-elements-name-saveandclose).

    -   **title**

        -   *Type:* string | language reference
        -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$type\]\['creationOptions'\]\['title'\]

        <!-- TODO: no Markdown rendering for "versionadded" -->

        With this option it is possible to set an
        individual title for the record type, to be used as label on the
        creation link in the "Create new record" component.

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

        ```php
        $GLOBALS['TCA']['tx_myextension_mytable']['types']['my_type']['creationOptions']['title']
            = 'my_extension.db.myType:title';
        ```

-   **isViewable**

    -   *Type:* boolean
    -   *Default:* true
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$type\]\['isViewable'\]

    <!-- TODO: no Markdown rendering for "versionadded" -->

    > [!NOTE]
    > This property is only interpreted in the table `pages`.

    Defines whether a page of this page type can be viewed in the frontend.
    A page type that is not viewable:

    -   cannot be linked, neither in the link browser nor by a TypoLink in
        the frontend,
    -   answers a direct call in the frontend with a 404 error,
    -   has no preview button in the backend.

    TYPO3 sets this to `false` for the page types spacer (199) and folder
    (254). All other page types are viewable as long as the option is not
    set.

    **EXT:my_extension/Configuration/TCA/Overrides/pages.php**

    ```php
    $GLOBALS['TCA']['pages']['types']['116']['isViewable'] = false;
    ```

    In the backend, the page TSconfig setting
    [TCEMAIN.preview.disableButtonForDokType](https://docs.typo3.org/m/typo3/reference-typoscript/14.3/en-us/PageTsconfig/TceMain.html#confval-tcemain-preview)
    decides instead: as soon as it is set for a page, the preview button and
    the link browser follow that list of page types and `isViewable` is not
    considered for them. The frontend always follows `isViewable`.

-   **label**

    -   *Type:* string, name of a field
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$recordType\]\['label'\]
    -   *Scope:* Display

    <!-- TODO: no Markdown rendering for "versionadded" -->

    Defines the primary field used as a type-specific label for a record type,
    overriding the label defined in
    [$GLOBALS\['TCA'\]\[$table\]\['ctrl'\]\['label'\]](https://docs.typo3.org/permalink/t3tca:confval-ctrl-label@14.3).

    All places in TYPO3 that use `\TYPO3\CMS\Backend\Utility\BackendUtility::getRecordTitle()`
    automatically benefit from this feature without any code changes. This includes
    record lists, page trees, history views, workspaces, and similar backend modules.

    This is especially useful for tables like `tt_content` where different content
    element types may benefit from showing different fields. For example, an "Image"
    content element could display the image caption, while a "Text" element shows the
    header field.

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

    ```php
    <?php

    return [
      'ctrl' => [
        'title' => 'My table',
        'label' => 'header',
        'type' => 'record_type',
      ],
      'types' => [
        'article' => [
          'showitem' => 'record_type, header, teaser',
          'label_alt' => 'teaser',
        ],
        'event' => [
          'showitem' => 'record_type, header, event_date, location',
          'label_alt' => 'event_date,location',
          'label_alt_force' => true,
        ],
      ],
      'columns' => [
        'record_type' => [
          'label' => 'Type',
          'config' => [
            'type' => 'select',
            'renderType' => 'selectSingle',
            'items' => [
              ['label' => 'Article', 'value' => 'article'],
              ['label' => 'Event', 'value' => 'event'],
            ],
          ],
        ],
        'header' => [
          'label' => 'Header',
          'config' => [
            'type' => 'input',
          ],
        ],
        'teaser' => [
          'label' => 'Teaser',
          'config' => [
            'type' => 'text',
          ],
        ],
        'event_date' => [
          'label' => 'Event date',
          'config' => [
            'type' => 'datetime',
          ],
        ],
        'location' => [
          'label' => 'Location',
          'config' => [
            'type' => 'input',
          ],
        ],
      ],
    ];

    ```

    In this example:

    -   All types use `header` as the primary label field (from `ctrl['label']`).
    -   The **article** type displays the `teaser` field if `header` is empty.
    -   The **event** type displays `header` together with `event_date` and `location`
        (since `label_alt_force` is enabled).

-   **label_alt**

    -   *Type:* string, comma separated list of fields
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$recordType\]\['label_alt'\]
    -   *Scope:* Display

    <!-- TODO: no Markdown rendering for "versionadded" -->

    Alternative field(s) used when label is empty (or as additional fields)

-   **label_alt_force**

    -   *Type:* bool
    -   *Default:* false
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$recordType\]\['label_alt_force'\]
    -   *Scope:* Display

    <!-- TODO: no Markdown rendering for "versionadded" -->

    Force display of alternative fields alongside the primary label

-   **previewRenderer**

    -   *Type:* string
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$type\]\['previewRenderer'\]
    -   *Scope:* Display
    -   *Examples:* [PreviewRenderer examples](https://docs.typo3.org/permalink/t3tca:types-example-previewrenderer@14.3)

    To configure a preview renderer for the whole table see
    [previewRenderer](https://docs.typo3.org/permalink/t3tca:confval-ctrl-previewrenderer@14.3).

    Configures a backend preview for a content element.

    Have also a look at [configure a custom backend preview](https://docs.typo3.org/m/typo3/reference-coreapi/14.3/en-us/ApiOverview/ContentElements/CustomBackendPreview.html#configurece-preview) for more details.

    Use [property previewRenderer of section ctrl](https://docs.typo3.org/permalink/t3tca:confval-ctrl-previewrenderer@14.3)
    to configure the preview globally for the whole table.

-   **showitem**

    -   *Type:* string (list of field configuration sets)
    -   *Required:* true
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$type\]\['showitem'\]
    -   *Examples:* [Display all fields on one page of the form](https://docs.typo3.org/permalink/t3tca:types-example-showitem@14.3)

    Configuration of the displayed order of fields in FormEngine and their tab alignment.

    The whole string is a comma `,` separated list of tokens. Each token can have keywords separated by
    semicolon `;`.

    Each comma separated token is one of the following:

    -   **`fieldName;fieldLabel`**

        Name of a field to show. Optionally an alternative label (plain text label or [label reference](https://docs.typo3.org/m/typo3/reference-coreapi/14.3/en-us/ApiOverview/Localization/Labels/Index.html#label-reference)) to override
        the [default label from columns section](https://docs.typo3.org/permalink/t3tca:columns-properties-label@14.3).

    -   **`--palette--;paletteLabel;paletteName`**

        Name of a [palette](https://docs.typo3.org/permalink/t3tca:palettes@14.3) to show. The label (plain text label or [label reference](https://docs.typo3.org/m/typo3/reference-coreapi/14.3/en-us/ApiOverview/Localization/Labels/Index.html#label-reference)) is optional. If set, it is
        shown above the single palette fields. The palette name is required and must reference a palette from
        the palette section.

        ```php
        --palette--;;caching // Show palette "caching" without additional label
        --palette--;Caching;caching // Show palette "caching" with label "Caching"
        ```

    -   **`--div--;tabLabel`**

        Put all fields after this token onto a new tab and name the tab as given in "tabLabel" (plain text label or [label reference](https://docs.typo3.org/m/typo3/reference-coreapi/14.3/en-us/ApiOverview/Localization/Labels/Index.html#label-reference)).

    > [!NOTE]
    > It is good practice to add a comma in excess behind the very last field name
    > as shown in the examples above. The FormEngine code will ignore this, but it
    > helps developers to not forget about a comma when additional fields are
    > added, which can suppress an annoying "Why is my new field not
    > displayed?" bug hunt.

    Extensions can also modify `showitem` values by utilizing
    `ExtensionManagementUtility::addToAllTCAtypes()`.
    See [customization examples](https://docs.typo3.org/m/typo3/reference-coreapi/14.3/en-us/ExtensionArchitecture/HowTo/ExtendingTca/Examples/Index.html#extending-examples) for details.

-   **title**

    -   *Type:* plain text label or [label reference](https://docs.typo3.org/permalink/t3coreapi:label-reference)
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$recordType\]\['title'\]
    -   *Scope:* Display

    <!-- TODO: no Markdown rendering for "versionadded" -->

    It is now possible to define a type-specific title in the TCA types
    section.The `title` in the TCA `types` section defines a type specific title that
    is displayed in the backend when creating or editing a record of that type.

    The value is also available in the **Schema API**
    (`\TYPO3\CMS\Core\Schema\TcaSchemaFactory`),
    making type-specific titles available when using `$schema->getTitle()`
    and in the **FormEngine**
    (`\TYPO3\CMS\Backend\Form\FormDataProvider\TcaTypesCtrlOverrides`
    data provider).

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

    ```php
    <?php

    return [
      'ctrl' => [
        'title' => 'LLL:my_extension.db:tx_myextension_domain_model_post',
        'label' => 'title',
        'type' => 'record_type',
        'typeicon_classes' => [
          '0' => 'tx-blog-post',
          'link' => 'tx-blog-post-link',
          'special' => 'tx-blog-post-special',
        ],
        'enablecolumns' => [
          'disabled' => 'hidden',
          'starttime' => 'starttime',
          'endtime' => 'endtime',
          'fe_group' => 'fe_group',
        ],
        'languageField' => 'sys_language_uid',
        'transOrigPointerField' => 'l10n_parent',
      ],
      'types' => [
        '0' => [
          'showitem' => '
            record_type, blog, title, date, author, content,
            --div--;core.form.tabs:access,
              hidden,
              --palette--;;paletteStartStop,
              fe_group,
            --div--;core.form.tabs:language,
              --palette--;;paletteLanguage,
          ',
        ],
        'link' => [
          'title' => 'LLL:my_extension.db:link.title',
          'showitem' => 'record_type, blog, title, date, author, link',
          'creationOptions' => [
            'defaultValues' => [
              'author' => 'External Author',
            ],
          ],
        ],
        'special' => [
          'title' => 'LLL:my_extension.db:special.title',
          'showitem' => 'record_type, blog, title, date, author, content, tags',
          'columnsOverrides' => [
            'author' => [
              'config' => [
                'required' => true,
              ],
            ],
            'content' => [
              'description' => 'You can use Markdown syntax for the content.',
              'config' => [
                'renderType' => 'codeEditor',
              ],
            ],
          ],
        ],
      ],
      'palettes' => [
        'paletteStartStop' => [
          'showitem' => 'starttime, endtime',
        ],
        'paletteLanguage' => [
          'showitem' => 'sys_language_uid, l10n_parent',
        ],
      ],
      'columns' => [
        'record_type' => [
          'label' => 'LLL:my_extension.labels:post_types',
          'config' => [
            'type' => 'select',
            'renderType' => 'selectSingle',
            'items' => [
              ['label' => 'Blog Post', 'value' => '0'],
              ['label' => 'Link to External Blog Post', 'value' => 'link'],
              ['label' => 'Special Blog Post', 'value' => 'special'],
            ],
            'default' => '0',
          ],
        ],
        'blog' => [
          'label' => 'Blog',
          'config' => [
            'type' => 'select',
            'renderType' => 'selectSingle',
            'foreign_table' => 'tx_myextension_domain_model_blog',
          ],
        ],
        'title' => [
          'label' => 'Title',
          'config' => [
            'type' => 'input',
          ],
        ],
        'date' => [
          'label' => 'Date',
          'config' => [
            'type' => 'datetime',
          ],
        ],
        'author' => [
          'label' => 'Author',
          'config' => [
            'type' => 'input',
          ],
        ],
        'content' => [
          'label' => 'Content',
          'config' => [
            'type' => 'text',
          ],
        ],
        'link' => [
          'label' => 'Link',
          'config' => [
            'type' => 'link',
          ],
        ],
        'tags' => [
          'label' => 'Tags',
          'config' => [
            'type' => 'input',
          ],
        ],
      ],
    ];

    ```

    It is possible to insert plain text values here, however it is recommended
    to keep all labels in a translation file and reference the label with the
    special syntax shown above.

    See also [TYPO3 Explained: Label references / LLL strings](https://docs.typo3.org/m/typo3/reference-coreapi/14.3/en-us/ApiOverview/Localization/Labels/Index.html#label-reference)

-   **wizardSteps**

    -   *Type:* array
    -   *TCA path:* $GLOBALS\['TCA'\]\[$table\]\['types'\]\[$recordType\]\['wizardSteps'\]
    -   *Scope:* Display

    <!-- TODO: no Markdown rendering for "versionadded" -->

    It is possible to configure fields, steps (and their order) in the page
    creation wizard using TCA.Defines the steps shown in the page creation wizard for the `pages` table.

    Each step is identified by a unique key and contains a localized title and a
    list of fields to display in that step. The configured steps are sorted and
    may be positioned relative to other steps by using the `before` or `after`
    options.

    The configuration can be defined per page type, allowing different wizard
    steps and field assignments depending on the selected page type.

    Required fields that are not assigned to any configured wizard step are added
    automatically to a fallback step, which is appended at the end of the wizard.

    **EXT:my_extension/Configuration/TCA/Overrides/pages.php**

    ```php
    <?php

    defined('TYPO3') or die();

    $GLOBALS['TCA']['pages']['types']['123']['wizardSteps'] = [
      'setup' => [
        'title' => 'backend.wizards.page:step.setup',
        'fields' => ['title', 'slug', 'nav_title', 'hidden', 'nav_hide'],
      ],
      'special' => [
        'title' => 'backend.wizards.page:wizard.special_step',
        'fields' => ['my_custom_field'],
        'after' => ['setup'],
      ],
    ];

    ```

    For a complete example see [TYPO3 Explained, Create new page type](https://docs.typo3.org/m/typo3/reference-coreapi/14.3/en-us/ApiOverview/PageTypes/CreateNewPageType.html#page-types-example).

<!-- TODO: no Markdown rendering for "versionchanged" -->

The properties bitmask_excludelist_bits and bitmask_excludelist_bits
have been removed, it is not considered anymore when rendering
records in the backend record editing interface.Extensions still using this setting should switch to casual
$GLOBALS['TCA']['someTable']['ctrl']['type'] fields instead, which
can be powered by columns based on string values.

## Extended examples for using the `types` section of TCA {#types-example}

-   [Display all fields on one page of the form](https://docs.typo3.org/permalink/t3tca:display-all-fields-on-one-page-of-the-form@14.3)
-   [Group fields using tabs and use palettes](https://docs.typo3.org/permalink/t3tca:group-fields-using-tabs-and-use-palettes@14.3)
-   [Examples for columnsOverrides in type section of TCA](https://docs.typo3.org/permalink/t3tca:examples-for-columnsoverrides-in-type-section-of-tca@14.3)
-   [Override default values by type](https://docs.typo3.org/permalink/t3tca:override-default-values-by-type@14.3)
-   [PreviewRenderer examples](https://docs.typo3.org/permalink/t3tca:previewrenderer-examples@14.3)
-   [Example: Create the blog plugin at once](https://docs.typo3.org/permalink/t3tca:example-create-the-blog-plugin-at-once@14.3)

### Display all fields on one page of the form {#display-all-fields-on-one-page-of-the-form}

The table containing the blog comments does not contain many fields. So they can
all be displayed on one page of the backend form without using tabs:

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

```php
<?php

return [
  'ctrl' => [
    'title' => 'Comment',
    'label' => 'name',
    'enablecolumns' => [
      'disabled' => 'hidden',
    ],
  ],
  'types' => [
    '0' => [
      'showitem' => 'hidden, name, email, content, date',
    ],
  ],
  'columns' => [
    'name' => [
      'label' => 'Name',
      'config' => [
        'type' => 'input',
      ],
    ],
    'email' => [
      'label' => 'Email',
      'config' => [
        'type' => 'email',
      ],
    ],
    'content' => [
      'label' => 'Comment',
      'config' => [
        'type' => 'text',
      ],
    ],
    'date' => [
      'label' => 'Date',
      'config' => [
        'type' => 'datetime',
      ],
    ],
  ],
];

```

### Group fields using tabs and use palettes {#group-fields-using-tabs-and-use-palettes}

If a table has a larger number of fields, grouping them into tabs and palettes
can improves the backend user experience. Palettes have the additional value
that they can be reused across different record types.

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

```php
<?php

return [
  'ctrl' => [
    'title' => 'LLL:my_extension.db:tx_myextension_domain_model_post',
    'label' => 'title',
    'type' => 'record_type',
    'typeicon_classes' => [
      '0' => 'tx-blog-post',
      'link' => 'tx-blog-post-link',
      'special' => 'tx-blog-post-special',
    ],
    'enablecolumns' => [
      'disabled' => 'hidden',
      'starttime' => 'starttime',
      'endtime' => 'endtime',
      'fe_group' => 'fe_group',
    ],
    'languageField' => 'sys_language_uid',
    'transOrigPointerField' => 'l10n_parent',
  ],
  'types' => [
    '0' => [
      'showitem' => '
        record_type, blog, title, date, author, content,
        --div--;core.form.tabs:access,
          hidden,
          --palette--;;paletteStartStop,
          fe_group,
        --div--;core.form.tabs:language,
          --palette--;;paletteLanguage,
      ',
    ],
    'link' => [
      'title' => 'LLL:my_extension.db:link.title',
      'showitem' => 'record_type, blog, title, date, author, link',
      'creationOptions' => [
        'defaultValues' => [
          'author' => 'External Author',
        ],
      ],
    ],
    'special' => [
      'title' => 'LLL:my_extension.db:special.title',
      'showitem' => 'record_type, blog, title, date, author, content, tags',
      'columnsOverrides' => [
        'author' => [
          'config' => [
            'required' => true,
          ],
        ],
        'content' => [
          'description' => 'You can use Markdown syntax for the content.',
          'config' => [
            'renderType' => 'codeEditor',
          ],
        ],
      ],
    ],
  ],
  'palettes' => [
    'paletteStartStop' => [
      'showitem' => 'starttime, endtime',
    ],
    'paletteLanguage' => [
      'showitem' => 'sys_language_uid, l10n_parent',
    ],
  ],
  'columns' => [
    'record_type' => [
      'label' => 'LLL:my_extension.labels:post_types',
      'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'items' => [
          ['label' => 'Blog Post', 'value' => '0'],
          ['label' => 'Link to External Blog Post', 'value' => 'link'],
          ['label' => 'Special Blog Post', 'value' => 'special'],
        ],
        'default' => '0',
      ],
    ],
    'blog' => [
      'label' => 'Blog',
      'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'foreign_table' => 'tx_myextension_domain_model_blog',
      ],
    ],
    'title' => [
      'label' => 'Title',
      'config' => [
        'type' => 'input',
      ],
    ],
    'date' => [
      'label' => 'Date',
      'config' => [
        'type' => 'datetime',
      ],
    ],
    'author' => [
      'label' => 'Author',
      'config' => [
        'type' => 'input',
      ],
    ],
    'content' => [
      'label' => 'Content',
      'config' => [
        'type' => 'text',
      ],
    ],
    'link' => [
      'label' => 'Link',
      'config' => [
        'type' => 'link',
      ],
    ],
    'tags' => [
      'label' => 'Tags',
      'config' => [
        'type' => 'input',
      ],
    ],
  ],
];

```

The syntax for tabs is:

`--div--;<label>`

Where label can be plain text label or [label reference](https://docs.typo3.org/m/typo3/reference-coreapi/14.3/en-us/ApiOverview/Localization/Labels/Index.html#label-reference) (preferred).

The syntax to insert a palette is:

`--palette--;<label>;<paletteName>`

The label can be omitted.

> [!NOTE]
> **See also**
>
> [Grouping fields (palettes)](https://docs.typo3.org/permalink/t3tca:palettes@14.3)

### Examples for columnsOverrides in type section of TCA {#examples-for-columnsoverrides-in-type-section-of-tca}

Demonstrates property: [columnsOverrides](https://docs.typo3.org/permalink/t3tca:confval-types-columnsoverrides@14.3).

For example the special blog post type might require the author to be set and
use a different render type and description for the content:

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

```php
<?php

return [
  'ctrl' => [
    'title' => 'LLL:my_extension.db:tx_myextension_domain_model_post',
    'label' => 'title',
    'type' => 'record_type',
    'typeicon_classes' => [
      '0' => 'tx-blog-post',
      'link' => 'tx-blog-post-link',
      'special' => 'tx-blog-post-special',
    ],
    'enablecolumns' => [
      'disabled' => 'hidden',
      'starttime' => 'starttime',
      'endtime' => 'endtime',
      'fe_group' => 'fe_group',
    ],
    'languageField' => 'sys_language_uid',
    'transOrigPointerField' => 'l10n_parent',
  ],
  'types' => [
    '0' => [
      'showitem' => '
        record_type, blog, title, date, author, content,
        --div--;core.form.tabs:access,
          hidden,
          --palette--;;paletteStartStop,
          fe_group,
        --div--;core.form.tabs:language,
          --palette--;;paletteLanguage,
      ',
    ],
    'link' => [
      'title' => 'LLL:my_extension.db:link.title',
      'showitem' => 'record_type, blog, title, date, author, link',
      'creationOptions' => [
        'defaultValues' => [
          'author' => 'External Author',
        ],
      ],
    ],
    'special' => [
      'title' => 'LLL:my_extension.db:special.title',
      'showitem' => 'record_type, blog, title, date, author, content, tags',
      'columnsOverrides' => [
        'author' => [
          'config' => [
            'required' => true,
          ],
        ],
        'content' => [
          'description' => 'You can use Markdown syntax for the content.',
          'config' => [
            'renderType' => 'codeEditor',
          ],
        ],
      ],
    ],
  ],
  'palettes' => [
    'paletteStartStop' => [
      'showitem' => 'starttime, endtime',
    ],
    'paletteLanguage' => [
      'showitem' => 'sys_language_uid, l10n_parent',
    ],
  ],
  'columns' => [
    'record_type' => [
      'label' => 'LLL:my_extension.labels:post_types',
      'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'items' => [
          ['label' => 'Blog Post', 'value' => '0'],
          ['label' => 'Link to External Blog Post', 'value' => 'link'],
          ['label' => 'Special Blog Post', 'value' => 'special'],
        ],
        'default' => '0',
      ],
    ],
    'blog' => [
      'label' => 'Blog',
      'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'foreign_table' => 'tx_myextension_domain_model_blog',
      ],
    ],
    'title' => [
      'label' => 'Title',
      'config' => [
        'type' => 'input',
      ],
    ],
    'date' => [
      'label' => 'Date',
      'config' => [
        'type' => 'datetime',
      ],
    ],
    'author' => [
      'label' => 'Author',
      'config' => [
        'type' => 'input',
      ],
    ],
    'content' => [
      'label' => 'Content',
      'config' => [
        'type' => 'text',
      ],
    ],
    'link' => [
      'label' => 'Link',
      'config' => [
        'type' => 'link',
      ],
    ],
    'tags' => [
      'label' => 'Tags',
      'config' => [
        'type' => 'input',
      ],
    ],
  ],
];

```

While the field type `type` cannot be changed in the `columnsOverrides` the
render type `renderType` can be changed.

### Override default values by type {#override-default-values-by-type}

A blog post of type link should have a different default value for the author
field then other blog post types:

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

```php
<?php

return [
  'ctrl' => [
    'title' => 'LLL:my_extension.db:tx_myextension_domain_model_post',
    'label' => 'title',
    'type' => 'record_type',
    'typeicon_classes' => [
      '0' => 'tx-blog-post',
      'link' => 'tx-blog-post-link',
      'special' => 'tx-blog-post-special',
    ],
    'enablecolumns' => [
      'disabled' => 'hidden',
      'starttime' => 'starttime',
      'endtime' => 'endtime',
      'fe_group' => 'fe_group',
    ],
    'languageField' => 'sys_language_uid',
    'transOrigPointerField' => 'l10n_parent',
  ],
  'types' => [
    '0' => [
      'showitem' => '
        record_type, blog, title, date, author, content,
        --div--;core.form.tabs:access,
          hidden,
          --palette--;;paletteStartStop,
          fe_group,
        --div--;core.form.tabs:language,
          --palette--;;paletteLanguage,
      ',
    ],
    'link' => [
      'title' => 'LLL:my_extension.db:link.title',
      'showitem' => 'record_type, blog, title, date, author, link',
      'creationOptions' => [
        'defaultValues' => [
          'author' => 'External Author',
        ],
      ],
    ],
    'special' => [
      'title' => 'LLL:my_extension.db:special.title',
      'showitem' => 'record_type, blog, title, date, author, content, tags',
      'columnsOverrides' => [
        'author' => [
          'config' => [
            'required' => true,
          ],
        ],
        'content' => [
          'description' => 'You can use Markdown syntax for the content.',
          'config' => [
            'renderType' => 'codeEditor',
          ],
        ],
      ],
    ],
  ],
  'palettes' => [
    'paletteStartStop' => [
      'showitem' => 'starttime, endtime',
    ],
    'paletteLanguage' => [
      'showitem' => 'sys_language_uid, l10n_parent',
    ],
  ],
  'columns' => [
    'record_type' => [
      'label' => 'LLL:my_extension.labels:post_types',
      'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'items' => [
          ['label' => 'Blog Post', 'value' => '0'],
          ['label' => 'Link to External Blog Post', 'value' => 'link'],
          ['label' => 'Special Blog Post', 'value' => 'special'],
        ],
        'default' => '0',
      ],
    ],
    'blog' => [
      'label' => 'Blog',
      'config' => [
        'type' => 'select',
        'renderType' => 'selectSingle',
        'foreign_table' => 'tx_myextension_domain_model_blog',
      ],
    ],
    'title' => [
      'label' => 'Title',
      'config' => [
        'type' => 'input',
      ],
    ],
    'date' => [
      'label' => 'Date',
      'config' => [
        'type' => 'datetime',
      ],
    ],
    'author' => [
      'label' => 'Author',
      'config' => [
        'type' => 'input',
      ],
    ],
    'content' => [
      'label' => 'Content',
      'config' => [
        'type' => 'text',
      ],
    ],
    'link' => [
      'label' => 'Link',
      'config' => [
        'type' => 'link',
      ],
    ],
    'tags' => [
      'label' => 'Tags',
      'config' => [
        'type' => 'input',
      ],
    ],
  ],
];

```

### PreviewRenderer examples {#previewrenderer-examples}

Demonstrates property: [previewRenderer](https://docs.typo3.org/permalink/t3tca:confval-types-previewrenderer@14.3).

This specifies the preview renderer only for records with the record type `myextension_bloglist`
as determined by the field `CType` of the table `tt_content`.

This could be used to preview the blog plugin in the **Content > Layout** module.

```php
$GLOBALS['TCA']['tt_content']['types']['myextension_bloglist']['previewRenderer']
    = \MyVendor\MyExtension\Preview\PreviewRenderer::class;
```

### Example: Create the blog plugin at once {#example-create-the-blog-plugin-at-once}

Demonstrates property: [saveAndClose](https://docs.typo3.org/permalink/t3tca:confval-types-creationoptions-saveandclose@14.3).

When editors create a new blog plugin in the plugin is automatically saved and
the user returned to the **Content > Layout** module:

**EXT:my_extension/Configuration/TCA/Overrides/tt_content.php**

```php
<?php

defined('TYPO3') or die();

$GLOBALS['TCA']['tt_content']['types']['myextension_bloglist']
  ['creationOptions']['saveAndClose'] = true;

```

> [!NOTE]
> This property only takes effect in the table `tt_content`.
