TYPO3 v12+后端:按记录语言设置自定义字段默认值
在TYPO3后端为自定义字段设置随记录语言变化的默认值(TYPO3 v12+)
需求说明
为自定义记录的字段(输入框或RTE字段)设置随记录自身语言(sys_language_uid)变化的默认值:
- 默认语言(
sys_language_uid=0)的disclaimer字段默认值为Please consider our ... - 德语翻译记录(
sys_language_uid=1)的disclaimer字段默认值为Bitte beachten Sie unsere ...
已知局限
- 通过
TCAdefaults.tx_myrecords_domain_model_record.disclaimer可设置全局默认值,但无法区分记录语言;该方式支持RTE字段及HTML格式文本。 - TCA配置中无法直接设置动态语言相关的默认值。
- 标签的语言专属配置(如下方示例)针对的是后端用户的界面语言,而非记录自身的语言,不符合需求:
TCEFORM.pages.title { label = LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:table.column label.default = New Label label.de = Neuer Feldname }
解决方案:使用记录插入前事件(TYPO3 v12+)
通过TYPO3的BeforeRecordInsertEvent事件,在记录插入到数据库前根据其语言设置对应的默认值,支持输入框和RTE字段。
步骤1:创建事件监听器
在你的扩展中创建事件监听器类,路径为Classes/EventListener/SetLanguageDependentDefaultValue.php:
<?php declare(strict_types=1); namespace Vendor\MyExt\EventListener; use TYPO3\CMS\Core\DataHandling\Event\BeforeRecordInsertEvent; class SetLanguageDependentDefaultValue { public function __invoke(BeforeRecordInsertEvent $event): void { // 仅针对目标表和字段处理 $table = $event->getTable(); $field = 'disclaimer'; if ($table !== 'tx_myrecords_domain_model_record') { return; } $recordData = $event->getRecordData(); // 仅当字段为空时设置默认值 if (!empty($recordData[$field])) { return; } // 根据记录语言设置对应默认值 $sysLanguageUid = (int)$recordData['sys_language_uid'] ?? 0; switch ($sysLanguageUid) { case 0: // 默认语言的默认值,支持HTML格式 $defaultValue = '<p>Please consider our ...</p>'; break; case 1: // 德语记录的默认值 $defaultValue = '<p>Bitte beachten Sie unsere ...</p>'; break; default: // 其他语言可设置默认值或留空 $defaultValue = ''; } if (!empty($defaultValue)) { $event->setRecordData(array_merge($recordData, [$field => $defaultValue])); } } }
步骤2:注册事件监听器
在扩展的Configuration/Services.yaml中注册监听器:
services: Vendor\MyExt\EventListener\SetLanguageDependentDefaultValue: tags: - name: event.listener identifier: 'my-ext/set-language-dependent-default-value' event: TYPO3\CMS\Core\DataHandling\Event\BeforeRecordInsertEvent
说明
- 该方案会在用户创建新记录(包括翻译记录)时,自动根据记录的
sys_language_uid填充对应默认值。 - 支持RTE字段的HTML格式内容,直接在
$defaultValue中写入HTML即可。 - 仅当字段为空时才设置默认值,不会覆盖用户手动输入的内容。
内容的提问来源于stack exchange,提问作者Sybille Peters
相关产品推荐
相关产品推荐

