已安装eventnews扩展时,如何正确修改news扩展的TCA配置?
我完全懂你这糟心的处境——好不容易调好的news TCA配置,每次都被eventnews盖过去,试了依赖配置、调整TypoScript顺序都没用,最后只能动eventnews的源码,确实不太合规。别慌,这有几个不用修改第三方扩展源码的靠谱方案,亲测有效:
1. 确保你的扩展在eventnews之后加载(核心关键)
TYPO3的TCA配置是按扩展加载顺序执行的,后加载的扩展修改会覆盖先加载的。你之前加了对eventnews的依赖但没生效,大概率是配置细节没做好,或者没清缓存。
正确操作是在你的站点扩展的ext_emconf.php里,把eventnews设为必填依赖:
'constraints' => [ 'depends' => [ 'typo3' => '12.4.0-12.4.99', // 替换成你的TYPO3版本 'news' => '12.0.0-12.99.99', // 替换成你的news版本 'eventnews' => '8.0.0-8.99.99', // 替换成你的eventnews版本 ], ],
配置完后必须清除所有TYPO3缓存(包括配置缓存),再重新激活你的扩展。这样TYPO3会强制eventnews先加载,你的扩展后加载,你的TCA修改就会最后执行,自然能覆盖eventnews的设置。
2. 直接重写完整的showitem字段列表
如果依赖设置后还是有问题(比如eventnews用了特殊的TCA追加逻辑),最稳妥的方式就是在你的TCA override文件里,完全定义自己需要的showitem字段清单,而不是用addToAllTCAtypes追加。
比如在Configuration/TCA/Overrides/tx_news_domain_model_news.php里:
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; // 完全重写news默认类型的字段展示 $GLOBALS['TCA']['tx_news_domain_model_news']['types']['1']['showitem'] = ' --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, title,teaser,bodytext, --div--;LLL:EXT:news/Resources/Private/Language/locallang_db.xlf:tab.category, categories, --div--;LLL:EXT:eventnews/Resources/Private/Language/locallang_db.xlf:tab.event, event_start,event_end,event_location, // 按需保留eventnews的字段 --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, --palette--;;language, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, --palette--;;hidden, --palette--;;access, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, rowDescription, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, your_custom_field, // 添加你的自定义字段 '; // 如果需要修改其他news类型(比如external),重复上述配置即可
这种方式会直接替换掉eventnews添加的字段配置,你能完全掌控哪些字段显示、顺序如何,不会被eventnews的追加操作覆盖。
3. 精准移除/修改特定字段
如果你只是想调整eventnews添加的某个字段,不想重写全部,可以用字符串替换的方式精准修改:
// 从默认类型的showitem中移除event_location字段 $showItem = $GLOBALS['TCA']['tx_news_domain_model_news']['types']['1']['showitem']; $showItem = str_replace('event_location,', '', $showItem); $GLOBALS['TCA']['tx_news_domain_model_news']['types']['1']['showitem'] = $showItem;
不过这种方式需要注意字段的逗号分隔格式,不如直接重写showitem可靠。
最后再提个关键:每次修改TCA后一定要清除配置缓存,不然TYPO3还是会用旧的缓存配置,导致你误以为修改没生效。
内容的提问来源于stack exchange,提问作者Stefan Padberg

