我的自定义挂钩有问题。我创建了一个新钩子并在 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();
}
我做了什么:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass']['extensionName'] = 扩展名\Backend\Hooks\MyCustomHook::class;
你好,Chanyss921
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
你的方法似乎缺少一些参数。