需要删除子记录时,Typo3 v11/v12 自定义扩展中的挂钩问题

问题描述 投票:0回答:1

我的自定义挂钩有问题。我创建了一个新钩子并在 ext_localconf.php 文件中声明它。当我执行从文件列表中删除文件的操作时,我需要调用我的挂钩方法 processCmdmap_deleteAction()。现在不起作用,因为我的文件已被删除,而没有执行我想删除其他记录的方法。我确定这个问题与 processCmdmap_deleteAction 方法和我的钩子有关(数据库表和结构配置正确)。 你知道为什么当我从 Typo3 实例后端的文件列表页面删除记录时,Typo3 无法运行我的自定义钩子和提到的方法吗?

我的钩子类的主体:

public function processCmdmap_deleteAction(string $table, int $recordId): void
{
    if ('sys_file_metadata' === $table) {
        $this->deleteRelatedChildren($recordId);
    }
}

/**
 * Delete related child records based on parent ID.
 */
public function deleteRelatedChildren(int $parentId): void
{
    $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_extensionName_domain_model_alternative_history');

    $queryBuilder = $connection->createQueryBuilder();
    $queryBuilder
        ->delete('tx_extensionName_domain_model_alternative_history')
        ->where(
            $queryBuilder->expr()->eq('sys_file_metadata', $queryBuilder->createNamedParameter($parentId, \PDO::PARAM_INT))
        );

    $queryBuilder->execute();
}

我做了什么:

  • 检查 ext_localconf.php 配置

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass']['extensionName'] = 扩展名\Backend\Hooks\MyCustomHook::class;

  • 检查Typo3实例的默认钩子中的processCmdmap_deleteAction方法(在我看来,当我删除文件时,我应该使用此方法来删除我的记录)
  • 另一个钩子方法工作正常(例如,我使用 methodprocessDatamap_postProcessFieldArray 来更新数据库中自定义表中的记录)
  • 检查文档和堆栈中的其他线程以获取更多信息如何解决此问题,但没有效果
  • 向ChatGPT询问一些提示,但也没有效果
  • 在网上搜索了一些技巧,但没有找到解决方案

你好,Chanyss921

typo3 typo3-extensions
1个回答
0
投票

ext_localconf.php 中的实现看起来没问题。

请检查您的钩子是否被调用。如果您不使用调试器,即。 XDebug,你可以用一个简单的 die() 来测试它:

public function processCmdmap_deleteAction(string $table, int $recordId): void
{
    die('Is called');
    if ('sys_file_metadata' === $table) {
        $this->deleteRelatedChildren($recordId);
    }
}

如果没有被调用,则尝试在 ext_localconf.php 中按如下方式实现它

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass'][]
    = extensionName\Backend\Hooks\MyCustomHook::class;

只需确保您不会尝试为同一扩展名注册两个自定义 HookClass。

然后请检查deleteAction是如何通过i.e.工作空间实现的: https://github.com/TYPO3-CMS/workspaces/blob/b9c22190e0d3698239048ec08b0b2ab02cb093d4/Classes/Hook/DataHandlerHook.php#L204

你的方法似乎缺少一些参数。

© www.soinside.com 2019 - 2024. All rights reserved.