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.
In short
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
TCA basics before you start
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>.phpin 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
| Part | Job |
|---|---|
ctrl | Table settings: title, label field, sorting, deleted and hidden handling |
columns | Every field and how it behaves |
types | Which fields show in the form |
palettes | Fields 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,
],
],
],
],
],
]; Advanced TYPO3 overrideChildTca Configuration
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,
],
],
],
],
], // 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,
],
],
],
], Best Practices and Limitations
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,
],
],
],
],
],
]; Conclusion
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.
FAQs
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.
Sanjay Chauhan
Sanjay Chauhan A young technology enthusiast and entrepreneur. At 24, he co-founded NITSAN – a TYPO3 Agency in Bhavnagar, India. I love TYPO3, I would like to furnish TYPO3 people with informative content, tutorials, and experiences by composing regular TYPO3 blogs “as to give back to the community”. Today Sanjay is CTO and a TYPO3 innovator at NITSAN.
More From Author