TYPO3后端selectSingle控件如何同时显示be_users的用户名与真实姓名?
可行方案:在selectSingle中同时显示be_users的真实姓名和用户名(TYPO3 9.5/10.4/11.5)
不需要修改全局的be_users.php,可以通过当前字段的TCA配置实现,推荐两种方案:
方案一:使用itemsProcFunc自定义选项列表
通过自定义处理函数直接生成包含真实姓名和用户名的选项,完全独立于全局配置:
在你的页面字段TCA配置中添加:
'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'foreign_table' => 'be_users', // 自定义选项处理函数 'itemsProcFunc' => \YourVendor\YourExtension\Hooks\BeUserItemsProcessor::class . '->addRealNameToOptions', // 保留其他必要配置(如size, maxitems等) ]
然后创建对应的处理器类:
<?php namespace YourVendor\YourExtension\Hooks; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; class BeUserItemsProcessor { public function addRealNameToOptions(&$params) { // 清空默认生成的选项 $params['items'] = []; // 可选:添加空选项 $params['items'][] = ['请选择用户', '']; // 查询活跃的后端用户 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('be_users'); $users = $queryBuilder ->select('uid', 'username', 'realName') ->from('be_users') ->where($queryBuilder->expr()->eq('deleted', 0)) ->orderBy('username') ->executeQuery() ->fetchAllAssociative(); // 拼接标签并生成选项 foreach ($users as $user) { $displayLabel = trim($user['realName']) ? sprintf('%s (%s)', $user['realName'], $user['username']) : $user['username']; $params['items'][] = [$displayLabel, $user['uid']]; } } }
方案二:使用overrideChildTca临时修改be_users的标签规则
通过临时覆盖关联表be_users的TCA配置,让select控件使用拼接后的标签:
在你的字段TCA配置中添加:
'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'foreign_table' => 'be_users', // 临时覆盖be_users的ctrl配置 'overrideChildTca' => [ 'ctrl' => [ 'label' => 'username', 'label_userFunc' => \YourVendor\YourExtension\Hooks\BeUserLabelGenerator::class . '->getCombinedLabel', ], ], // 保留其他必要配置 ]
然后创建标签生成类:
<?php namespace YourVendor\YourExtension\Hooks; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; class BeUserLabelGenerator { public function getCombinedLabel($params) { $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('be_users'); $userData = $queryBuilder ->select('realName', 'username') ->from('be_users') ->where($queryBuilder->expr()->eq('uid', $params['row']['uid'])) ->executeQuery() ->fetchAssociative(); if ($userData && trim($userData['realName'])) { return sprintf('%s (%s)', $userData['realName'], $userData['username']); } return $userData['username'] ?? ''; } }
方案对比
- 方案一灵活性更高,可自定义选项排序、过滤规则,适合需要额外处理的场景;
- 方案二更贴合TYPO3的TCA原生逻辑,代码量相对少,适合仅需修改标签显示的场景。
两种方案均兼容TYPO3 9.5、10.4、11.5版本,且不会影响全局be_users的显示规则。
内容的提问来源于stack exchange,提问作者Starzi
相关产品推荐
相关产品推荐

