TYPO3 TCA overrideChildTca: Master Inline & IRRE Config

TYPO3 TCA overrideChildTca: Master Inline & IRRE Config

When developing TYPO3 Extension and custom content types, you'll frequently need to customize how inline records behave within parent-child relationships. The overrideChildTca property is your powerful tool for fine-tuning any inline record configuration without modifying core TCA definitions.

With the TCA setting overrideChildTca you configure inline (IRRE) child records from the parent record in the TYPO3 backend. This step-by-step tutorial shows the configuration with practical examples.

Updated 7 November 2026 | T3Planet editorial team

This tutorial uses overrideChildTca and inline (IRRE) records. If TCA is new to you, read this short primer first.

Where TCA files live

  • A new table: Configuration/TCA/<table_name>.php in your extension.
  • A change to an existing table (for example tt_content): Configuration/TCA/Overrides/<table_name>.php.

Each file returns an array. TYPO3 merges all files when it builds the cache.

The four main parts

PartJob
ctrlTable settings: title, label field, sorting, deleted and hidden handling
columnsEvery field and how it behaves
typesWhich fields show in the form
palettesFields grouped on one line

For a full example table and 45+ tips, see the TYPO3 TCA guide.

Understanding TYPO3 overrideChildTca

The overrideChildTca property allows you to override specific TYPO3 TCA configurations of child records when they're opened inline within a parent record. This applies to all TYPO3 inline relationships (IRRE), including file references, custom tables, content elements, and complex relational structures.

TYPO3 Inline Record Types and Use Cases

1. File References (sys_file_reference)

The most common use case for customizing media handling:

$GLOBALS['TCA']['tt_content']['types']['boilerplate_textimagegallery'] = [
    'showitem' => $GLOBALS['TCA']['tt_content']['types']['boilerplate_textimagegallery']['showitem'],
    'columnsOverrides' => [
        'image' => [
            'config' => [
                'maxitems' => 1,
                'overrideChildTca' => [
                    'columns' => [
                        'uid_local' => [
                            'config' => [
                                'appearance' => [
                                    'elementBrowserType' => 'file',
                                    'elementBrowserAllowed' => 'png, jpeg, svg, jpg, youtube, mp4, vimeo'
                                ],
                            ],
                        ],
                    ],
                ],
            ]
        ]
    ]
];

2. Custom Database Tables

Override child record behavior for your custom extension tables:

$GLOBALS['TCA']['tx_myext_parent']['columns']['child_items'] = [
    'config' => [
        'type' => 'inline',
        'foreign_table' => 'tx_myext_child',
        'foreign_field' => 'parent_uid',
        'overrideChildTca' => [
            'columns' => [
                'title' => [
                    'config' => [
                        'required' => true,
                        'max' => 100,
                        'placeholder' => 'Enter item title (max 100 chars)',
                    ],
                ],
                'description' => [
                    'config' => [
                        'type' => 'text',
                        'rows' => 3,
                        'cols' => 40,
                        'default' => 'Default description text',
                    ],
                ],
                'category' => [
                    'config' => [
                        'items' => [
                            ['Premium', 'premium'],
                            ['Standard', 'standard'],
                            ['Basic', 'basic'],
                        ],
                        'default' => 'standard',
                    ],
                ],
            ],
        ],
    ],
];

3. Content Element Relations

Customize inline content elements within your custom types:

$GLOBALS['TCA']['tt_content']['types']['myext_container'] = [
    'showitem' => 'header, content_elements',
    'columnsOverrides' => [
        'content_elements' => [
            'config' => [
                'type' => 'inline',
                'foreign_table' => 'tt_content',
                'foreign_field' => 'tx_myext_parent',
                'overrideChildTca' => [
                    'types' => [
                        'text' => [
                            'showitem' => 'header, bodytext',
                        ],
                        'image' => [
                            'showitem' => 'header, image, imagewidth, imageheight',
                        ],
                    ],
                    'columns' => [
                        'header' => [
                            'config' => [
                                'required' => true,
                                'placeholder' => 'Section header is required',
                            ],
                        ],
                        'bodytext' => [
                            'config' => [
                                'enableRichtext' => true,
                                'richtextConfiguration' => 'minimal',
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ],
];

4. Many-to-Many Relations

Configure intermediate table behavior:

$GLOBALS['TCA']['tx_myext_product']['columns']['categories'] = [
    'config' => [
        'type' => 'inline',
        'foreign_table' => 'tx_myext_product_category_mm',
        'foreign_field' => 'uid_local',
        'foreign_sortby' => 'sorting',
        'foreign_label' => 'uid_foreign',
        'overrideChildTca' => [
            'columns' => [
                'uid_foreign' => [
                    'config' => [
                        'items' => [
                            ['Electronics', 1],
                            ['Clothing', 2],
                            ['Books', 3],
                        ],
                    ],
                ],
                'priority' => [
                    'config' => [
                        'type' => 'select',
                        'items' => [
                            ['High', 1],
                            ['Medium', 2],
                            ['Low', 3],
                        ],
                        'default' => 2,
                    ],
                ],
            ],
        ],
    ],
];

Dynamic Field Visibility

Control field visibility based on parent record state:

'overrideChildTca' => [
    'columns' => [
        'advanced_options' => [
            'config' => [
                'type' => 'check',
                'default' => 0,
            ],
        ],
        'expert_field' => [
            'config' => [
                'type' => 'input',
                'size' => 30,
            ],
            'displayCond' => 'FIELD:advanced_options:=:1',
        ],
    ],
],

Custom Appearance Settings

Modify inline record appearance and behavior:

'overrideChildTca' => [
    'ctrl' => [
        'title' => 'Custom Child Record',
        'iconfile' => 'EXT:my_extension/Resources/Public/Icons/custom_icon.svg',
    ],
    'columns' => [
        'status' => [
            'config' => [
                'type' => 'select',
                'items' => [
                    ['Draft', 'draft'],
                    ['Published', 'published'],
                    ['Archived', 'archived'],
                ],
                'default' => 'draft',
            ],
        ],
    ],
],

Validation and Processing

Add custom validation rules to child records:

'overrideChildTca' => [
    'columns' => [
        'email' => [
            'config' => [
                'type' => 'input',
                'size' => 30,
                'eval' => 'trim,required,email',
                'placeholder' => 'user@example.com',
            ],
        ],
        'price' => [
            'config' => [
                'type' => 'input',
                'size' => 10,
                'eval' => 'double2,required',
                'range' => [
                    'lower' => 0,
                    'upper' => 999999,
                ],
            ],
        ],
        'slug' => [
            'config' => [
                'type' => 'slug',
                'generatorOptions' => [
                    'fields' => ['title'],
                    'prefixParentPageSlug' => false,
                ],
            ],
        ],
    ],
],

1:n Relationships

Most common inline relationship pattern:

// Parent table configuration
$GLOBALS['TCA']['tx_myext_article']['columns']['comments'] = [
    'config' => [
        'type' => 'inline',
        'foreign_table' => 'tx_myext_comment',
        'foreign_field' => 'article_uid',
        'foreign_sortby' => 'sorting',
        'maxitems' => 50,
        'appearance' => [
            'collapseAll' => 1,
            'expandSingle' => 1,
            'levelLinksPosition' => 'top',
        ],
        'overrideChildTca' => [
            'columns' => [
                'comment_text' => [
                    'config' => [
                        'type' => 'text',
                        'rows' => 5,
                        'cols' => 48,
                        'required' => true,
                    ],
                ],
                'author_name' => [
                    'config' => [
                        'type' => 'input',
                        'size' => 30,
                        'required' => true,
                        'eval' => 'trim',
                    ],
                ],
                'moderation_status' => [
                    'config' => [
                        'type' => 'select',
                        'items' => [
                            ['Pending', 'pending'],
                            ['Approved', 'approved'],
                            ['Rejected', 'rejected'],
                        ],
                        'default' => 'pending',
                    ],
                ],
            ],
        ],
    ],
];

m:n Relationships with Custom MM Table

Complex many-to-many relationships:

$GLOBALS['TCA']['tx_myext_event']['columns']['speakers'] = [
    'config' => [
        'type' => 'inline',
        'foreign_table' => 'tx_myext_event_speaker_mm',
        'foreign_field' => 'uid_local',
        'foreign_sortby' => 'sorting',
        'foreign_label' => 'uid_foreign',
        'foreign_selector' => 'uid_foreign',
        'foreign_unique' => 'uid_foreign',
        'maxitems' => 10,
        'overrideChildTca' => [
            'columns' => [
                'uid_foreign' => [
                    'config' => [
                        'type' => 'group',
                        'internal_type' => 'db',
                        'allowed' => 'tx_myext_speaker',
                        'size' => 1,
                        'maxitems' => 1,
                        'minitems' => 1,
                    ],
                ],
                'speaker_role' => [
                    'config' => [
                        'type' => 'select',
                        'items' => [
                            ['Keynote Speaker', 'keynote'],
                            ['Workshop Leader', 'workshop'],
                            ['Panel Member', 'panel'],
                        ],
                        'default' => 'panel',
                    ],
                ],
                'presentation_duration' => [
                    'config' => [
                        'type' => 'input',
                        'size' => 5,
                        'eval' => 'int',
                        'range' => [
                            'lower' => 15,
                            'upper' => 180,
                        ],
                        'default' => 30,
                    ],
                ],
            ],
        ],
    ],
];

TYPO3 Version Compatibility

TYPO3 v12+ Considerations

Modern TYPO3 versions introduce new TCA types and features:

'overrideChildTca' => [
    'columns' => [
        'modern_field' => [
            'config' => [
                'type' => 'datetime',
                'format' => 'datetime',
                'required' => true,
            ],
        ],
        'color_field' => [
            'config' => [
                'type' => 'color',
                'size' => 10,
                'default' => '#000000',
            ],
        ],
    ],
],

Legacy TYPO3 Support

For older TYPO3 versions, use compatible configurations:

'overrideChildTca' => [
    'columns' => [
        'legacy_datetime' => [
            'config' => [
                'type' => 'input',
                'renderType' => 'inputDateTime',
                'eval' => 'datetime',
                'required' => true,
            ],
        ],
    ],
],

What You Can Override

  • Display-related properties (appearance, labels, placeholders)
  • Validation rules (eval, required, range)
  • Field types and render types
  • Default values and items
  • Display conditions

What You Cannot Override

  • Database schema changes
  • Processing-related core functionality
  • Fundamental table relationships
  • Core security mechanisms

Performance Considerations

  • Minimal Overrides: Only override necessary properties
  • Cached Configuration: TYPO3 caches TCA, so changes require cache clearing
  • Nested Complexity: Avoid deeply nested inline relationships

Database Queries: Complex inline setups can impact query performance

Troubleshooting TYPO3 overrideChildTCA

Common Issues

  • Configuration Not Applied: Clear all caches after TCA changes
  • Field Not Visible: Check showitem configuration and access rights
  • Validation Errors: Verify eval rules and field types match
  • Performance Issues: Monitor database queries with complex inline setups

Debugging TCA Configuration

// Debug current TCA configuration
\TYPO3\CMS\Core\Utility\DebugUtility::debug(
    $GLOBALS['TCA']['your_table']['columns']['your_field']
);

// Check effective child TCA
\TYPO3\CMS\Core\Utility\DebugUtility::debug(
    $GLOBALS['TCA']['your_child_table']
);

Real-World Implementation Example

Here's a complete example of a news system with inline comments:

// News article with customized inline comments
$GLOBALS['TCA']['tx_news_domain_model_news']['columns']['custom_comments'] = [
    'exclude' => true,
    'label' => 'Article Comments',
    'config' => [
        'type' => 'inline',
        'foreign_table' => 'tx_news_domain_model_comment',
        'foreign_field' => 'news_uid',
        'foreign_sortby' => 'crdate',
        'maxitems' => 100,
        'appearance' => [
            'collapseAll' => 1,
            'expandSingle' => 1,
            'levelLinksPosition' => 'top',
            'showSynchronizationLink' => 1,
            'showPossibleLocalizationRecords' => 1,
            'showAllLocalizationLink' => 1,
        ],
        'overrideChildTca' => [
            'columns' => [
                'comment' => [
                    'config' => [
                        'type' => 'text',
                        'rows' => 4,
                        'cols' => 48,
                        'required' => true,
                        'max' => 500,
                        'placeholder' => 'Share your thoughts... (max 500 characters)',
                    ],
                ],
                'author_name' => [
                    'config' => [
                        'type' => 'input',
                        'size' => 25,
                        'required' => true,
                        'eval' => 'trim',
                        'placeholder' => 'Your name',
                    ],
                ],
                'author_email' => [
                    'config' => [
                        'type' => 'input',
                        'size' => 30,
                        'required' => true,
                        'eval' => 'trim,email',
                        'placeholder' => 'your@email.com',
                    ],
                ],
                'status' => [
                    'config' => [
                        'type' => 'select',
                        'items' => [
                            ['Pending Review', 0],
                            ['Approved', 1],
                            ['Rejected', 2],
                            ['Spam', 3],
                        ],
                        'default' => 0,
                    ],
                ],
                'rating' => [
                    'config' => [
                        'type' => 'select',
                        'items' => [
                            ['⭐ 1 Star', 1],
                            ['⭐⭐ 2 Stars', 2],
                            ['⭐⭐⭐ 3 Stars', 3],
                            ['⭐⭐⭐⭐ 4 Stars', 4],
                            ['⭐⭐⭐⭐⭐ 5 Stars', 5],
                        ],
                        'default' => 3,
                    ],
                ],
            ],
        ],
    ],
];

The overrideChildTca property is an essential tool for customizing any TYPO3 inline record relationship. Whether you're working with file references, custom database tables, content elements, or complex many-to-many relationships, understanding how to effectively use overrideChildTca will significantly enhance your TYPO3 development capabilities.

By mastering these techniques, you can create sophisticated backend interfaces that provide excellent user experiences while maintaining clean, maintainable code. The key is to understand the scope and limitations of overrideChildTca and apply it strategically within your TYPO3 extension development workflow.

Remember to always test your configurations thoroughly, clear caches after changes, and consider performance implications when designing complex inline relationships. With proper implementation, overrideChildTca becomes a powerful ally in creating flexible, user-friendly TYPO3 applications.

A TCA setting that lets you configure inline child records from the parent record.

Child records that you edit inside their parent record in the TYPO3 backend.

A new table goes into Configuration/TCA, a change to an existing table into Configuration/TCA/Overrides.

The section TCA basics before you start gives a short primer.

Read the TYPO3 TCA guide with 45+ tips on this site.