我正在编写一个扩展程序,允许在TYPO3实例的前端和后端上传文件。上传适用于两个视图,但如果管理员想要在列表视图的后端删除上传,那么" physical"文件位于网络服务器的硬盘上,不会被删除,只会删除sys_file_reference记录。
是否有可能告诉tca,如果删除上传记录,还应删除相关文件?我还尝试使用以下代码实现一个插槽但没有任何反应:
ext_localconf.php:
\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher')->connect(
'TYPO3\CMS\Extbase\Persistence\Generic\Backend',
'afterRemoveObject',
'Kmi\feupload\Slots\MyAfterRemoveObjectSlot',
'myAfterRemoveObjectMethod'
);
类/插槽/ MyAfterRemoveObjectSlot.php:
namespace Kmi\feupload\Slots;
class MyAfterRemoveObjectSlot {
public function myAfterRemoveObjectMethod($object) {
// do something
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($object);
}
}
有谁知道如何解决这个问题?会有很多上传,如果管理员删除了一个,关联的文件也应该被删除...
提前感谢您的帮助:)
答案 0 :(得分:1)
不幸的是,我没有时间创建一个完整的,经过测试的答案ATM,但我正在整理所需的步骤,并希望您可以解决问题并完成我的答案。
通过TCEFORM完成的每个操作都与DataHandler(以前称为TCEmain)一起保存。 DataHandler有很多钩子。我假设您的模型“上传”的属性file
属于(或扩展)\TYPO3\CMS\Extbase\Domain\Model\FileReference
。
TCEFORM中的文件引用被添加为IRRE元素。因此,当您删除文件引用并保存Upload对象时,以下数据是(amogst others)发送到DataHandler:
cmd[sys_file_reference][15011][delete]=1
这意味着必须删除带有uid 15011的文件引用。我建议为此实现processCmdmap_deleteAction
挂钩。
因此,您还必须检查数据图,以确定该命令是否是通过操纵“上传”记录来执行的。
<强> ext_localconf.php 强>:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass']['your_extension'] = 'My\\Extension\\Hook\\DataHandler';
<强> EXT:your_extension /类别/钩/ DataHandler.php 强>
此代码未经测试!
<?php
namespace My\Extension\Hook
class DataHandler {
/**
* @param string $table
* @param int $id
* @param array $recordToDelete
* @param $parentObject \TYPO3\CMS\Core\DataHandling\DataHandler
*/
public function processCmdmap_deleteAction($table, $id, $recordToDelete, $parentObject) {
if (array_key_exists('tx_myext_domain_model_upload', $parentObject->datamap)) {
// Parent record of record to delete is of type "tx_myext_domain_model_upload"
if ($table === 'sys_file_reference' && is_integer($id)) {
// A file reference was requested to delete
// Get an instance of the ResourceFactory
/** @var $resourceFactory \TYPO3\CMS\Core\Resource\ResourceFactory */
$resourceFactory = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Resource\\ResourceFactory');
// We get the FileReference object for the given id
$fileReferenceObject = $resourceFactory->getFileReferenceObject($id);
// Delete the original file of the file reference
$fileWasDeleted = $fileReferenceObject->getOriginalFile()->delete();
// @TODO throw a warning if $fileWasDeleted is false
}
}
}
}
我对代码进行了评论,因此您知道哪些检查是必要的。
在ext_localconf.php中定义挂钩后,不要忘记清除系统缓存。