TYPO3 12版本中如何在少量修改代码的前提下恢复cruser_id字段功能以获取文章关联用户ID
我完全懂你现在的头疼——TYPO3 12把cruser_id字段和对应的TCA选项砍掉,确实给依赖这个逻辑的旧代码添了不少麻烦,而且不想大改代码的需求太合理了。你已经手动在ext_tables.sql里加了字段,还差几步就能让它正常工作,而且改动量很小:
1. 给字段补上TCA配置
首先得在你的扩展TCA配置里给cruser_id字段加定义,替代原来被移除的cruserid选项。找到你扩展里的Configuration/TCA/Overrides/[你的文章表名].php,添加这段配置:
$GLOBALS['TCA']['tx_your_extension_domain_model_article']['columns']['cruser_id'] = [ 'label' => 'LLL:EXT:your_extension/Resources/Private/Language/locallang_db.xlf:tx_your_extension_domain_model_article.cruser_id', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'foreign_table' => 'be_users', 'readOnly' => true, // 设为只读,避免手动修改 'default' => (int)$GLOBALS['BE_USER']->user['uid'] ?? 0, ], ];
这里把字段关联到后台用户表,设为只读,默认值取当前登录的后台用户ID,确保新建记录时能自动带上。
2. 用DataHandler Hook确保自动填充(可选但更稳妥)
上面的默认值在大多数新建场景下有效,但为了覆盖所有可能的创建记录的情况(比如通过API或者批量操作),可以加个简单的DataHandler钩子来自动填充用户ID:
先在你的扩展里新建Classes/Hooks/DataHandlerHook.php:
namespace Vendor\YourExtension\Hooks; use TYPO3\CMS\Core\DataHandling\DataHandler; class DataHandlerHook { public function processDatamap_preProcessFieldArray(array &$fieldArray, string $table, string $id, DataHandler $dataHandler) { // 只处理你的文章表,并且是新建记录的情况 if ($table === 'tx_your_extension_domain_model_article' && $id === 'NEW') { // 如果cruser_id没被设置,自动填充当前后台用户ID if (!isset($fieldArray['cruser_id']) || $fieldArray['cruser_id'] === 0) { $fieldArray['cruser_id'] = (int)$GLOBALS['BE_USER']->user['uid'] ?? 0; } } } }
然后在ext_localconf.php里注册这个钩子:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']['your_extension'] = \Vendor\YourExtension\Hooks\DataHandlerHook::class;
3. 确保模型的Getter/Setter存在
你提到已经有了Getter和Setter,但还是确认一下你的Article模型里有这段代码(字段名对应数据库的cruser_id,模型里用驼峰命名cruserId):
// 在 Classes/Domain/Model/Article.php 中 protected ?int $cruserId = 0; public function getCruserId(): ?int { return $this->cruserId; } public function setCruserId(?int $cruserId): void { $this->cruserId = $cruserId; }
4. 更新数据库结构
最后别忘了在后台的「维护」模块里运行「更新数据库结构」,或者用命令行工具执行:
vendor/bin/typo3cms database:updateschema
确保你手动添加的cruser_id字段真的被创建到数据库里。
这样改完之后,原来代码里调用$article->getCruserId()的地方完全不用改,就能正常获取到文章创建者的用户ID了,改动量非常小,完美符合你的需求。
备注:内容来源于stack exchange,提问作者180690

