删除sys_file_reference时删除文件

Van*_*yce 5 typo3 extbase typo3-6.2.x

我正在编写一个扩展,允许在TYPO3实例的前端和后端上传文件.上载在两个视图中都有效,但如果管理员想要在列表视图的后端删除上载,则不会删除位于Web服务器硬盘上的"物理"文件,只会删除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'
);
Run Code Online (Sandbox Code Playgroud)

类/插槽/ MyAfterRemoveObjectSlot.php:

namespace Kmi\feupload\Slots;
class MyAfterRemoveObjectSlot {
    public function myAfterRemoveObjectMethod($object) {
    // do something
    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($object);
    }
}
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个问题?会有很多上传,如果管理员删除了一个,关联的文件也应该删除...

预先感谢您的帮助 :)

lor*_*enz 2

不幸的是,我没有时间创建一个完整的、经过测试的答案 ATM,但我正在整理所需的步骤,并希望您能够找到解决方案并完成我的答案。

通过 TCEFORM 完成的每个操作都使用 DataHandler(以前称为 TCEmain)保存。DataHandler 有许多钩子。我假设您的模型“上传”有一个file类型为(或扩展)的 属性\TYPO3\CMS\Extbase\Domain\Model\FileReference

TCEFORM 中的文件引用作为 IRRE 元素添加。因此,当您删除文件引用并保存 Upload 对象时,以下数据(除其他数据外)将发送到 DataHandler:

cmd[sys_file_reference][15011][delete]=1
Run Code Online (Sandbox Code Playgroud)

这意味着必须删除 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';
Run Code Online (Sandbox Code Playgroud)

EXT:your_extension/Classes/Hook/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                
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我对代码进行了注释,以便您知道哪些检查是必要的。

在 ext_localconf.php 中定义钩子后,不要忘记清除系统缓存。