TYPO3:删除FE-User或分类记录时自动清理MM关联表条目
TYPO3 9中删除FE-User或分类时自动清理MM关联表的实现方法
方法一:通过TCA双向关联配置(推荐)
TYPO3的DataHandler组件原生支持关联记录删除时自动清理MM表,只需正确配置FE-User和分类的双向关联:
1. 配置FE-User的分类字段
在你的扩展的Configuration/TCA/Overrides/fe_users.php中添加分类字段的MM关联配置:
$GLOBALS['TCA']['fe_users']['columns']['categories'] = [ 'label' => '自定义分类', 'config' => [ 'type' => 'select', 'renderType' => 'selectTree', 'foreign_table' => 'sys_category', 'foreign_table_where' => 'AND sys_category.sys_language_uid IN (-1,0) ORDER BY sys_category.title', 'MM' => 'tx_your_extension_feusers_category_mm', // 替换为你的MM表名称 'size' => 10, 'autoSizeMax' => 30, 'maxitems' => 9999, 'multiple' => true, 'treeConfig' => [ 'parentField' => 'parent', 'appearance' => [ 'expandAll' => true, 'showHeader' => true, ], ], ], ]; // 将字段添加到FE-User的后台显示 \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes( 'fe_users', 'categories', '', 'after:lastlogin' );
2. 配置分类的反向关联字段
在Configuration/TCA/Overrides/sys_category.php中添加指向FE-User的反向关联:
$GLOBALS['TCA']['sys_category']['columns']['fe_users'] = [ 'config' => [ 'type' => 'select', 'foreign_table' => 'fe_users', 'MM' => 'tx_your_extension_feusers_category_mm', // 与上面的MM表一致 'MM_opposite_field' => 'categories', // 对应FE-User中的分类字段名 'size' => 5, 'autoSizeMax' => 20, 'maxitems' => 9999, 'multiple' => true, ], ]; // 可选:将反向关联字段添加到分类的后台显示(方便查看关联的FE-User) \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes( 'sys_category', 'fe_users', '', 'after:description' );
完成上述配置后,后台删除FE-User或分类记录时,TYPO3会自动清理MM表中的对应关联条目。
方法二:通过事件监听手动清理(备用)
如果原生TCA配置未生效,可通过TYPO3的PSR-14事件监听记录删除动作,手动删除MM表条目:
1. 创建事件监听器类
在Classes/EventListener/RecordDeleteListener.php中编写处理逻辑:
<?php namespace Vendor\YourExtension\EventListener; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\DataHandling\Event\BeforeRecordDeletedEvent; class RecordDeleteListener { public function __invoke(BeforeRecordDeletedEvent $event): void { $table = $event->getTable(); $uid = $event->getRecord()['uid']; $mmTable = 'tx_your_extension_feusers_category_mm'; // 替换为你的MM表名称 $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($mmTable); if ($table === 'fe_users') { $connection->delete($mmTable, ['uid_local' => $uid]); } elseif ($table === 'sys_category') { $connection->delete($mmTable, ['uid_foreign' => $uid]); } } }
2. 注册事件监听器
在Configuration/Services.yaml中注册监听器:
services: Vendor\YourExtension\EventListener\RecordDeleteListener: tags: - name: event.listener identifier: 'your-extension/record-delete-listener' event: TYPO3\CMS\Core\DataHandling\Event\BeforeRecordDeletedEvent
这样,当后台删除FE-User或分类时,监听器会触发并清理对应的MM表条目。
内容的提问来源于stack exchange,提问作者Stephan Grass
相关产品推荐
相关产品推荐

