You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:06:43