当我从TYPO3后端的列表视图中删除一个Extbase域对象时,我想执行一些单独的代码。
认为它可以/将通过覆盖相应存储库中的remove( $o )
方法(如
public function remove( $object ) {
parent::__remove( $object );
do_something_i_want();
}
,但我认为这不会奏效。看起来存储库方法只被我的扩展操作调用/使用(例如,如果我在FE或BE插件中有一些删除操作),而不是在后端的列表视图中删除对象时?我不使用(截至目前)任何FE / BE-plugin / -actions - 只在我的存储文件夹的后端列表视图中使用简单的添加/编辑/删除功能。
背景:我有例如两个模型具有一些1:n关系(让我们说singer
和song
),其中一个对象包含一些上传文件(album_cover
>指向文件' /uploads/myext/
文件夹中的URL;使用@cascade
可以正常删除属于已删除的song
的{{1}}个singer
,但它不会触及song.album_cover
上传的文件(仅限)随着时间的推移会有一些浪费。所以我很想做某种onDeletionOfSinger() { deleteAllFilesForHisSongs(); }
- 事情。
(同样的事情适用于删除let' s说一个song
及其album_cover
- 文件。)
听起来很简单&很常见,但我不会落后于它并发现没什么用处 - 会喜欢暗示/指向正确的方向: - )。
答案 0 :(得分:5)
列表视图在其操作期间使用TCEmain钩子,因此您可以使用其中一个钩子与删除操作相交,即:processCmdmap_deleteAction
在typo3conf/ext/your_ext/ext_tables.php
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass'][] = 'VENDORNAME\\YourExt\\Hooks\\ProcessCmdmap';
创建一个具有有效命名空间和路径的类(根据前一步骤)
档案:typo3conf/ext/your_ext/Classes/Hooks/ProcessCmdmap.php
<?php
namespace VENDORNAME\YourExt\Hooks;
class ProcessCmdmap {
/**
* hook that is called when an element shall get deleted
*
* @param string $table the table of the record
* @param integer $id the ID of the record
* @param array $record The accordant database record
* @param boolean $recordWasDeleted can be set so that other hooks or
* @param DataHandler $tcemainObj reference to the main tcemain object
* @return void
*/
function processCmdmap_postProcess($command, $table, $id, $value, $dataHandler) {
if ($command == 'delete' && $table == 'tx_yourext_domain_model_something') {
// Perform something before real delete
// You don't need to delete the record here it will be deleted by CMD after the hook
}
}
}
注册新的钩子后,不要忘记清除系统缓存
答案 1 :(得分:3)
除了biesiors的回答,我想指出,还有一个信号插槽。所以你宁愿注册那个信号而不是挂钩到tcemain。
在您的ext_localconf.php
放置:
$signalSlotDispatcher =
\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher');
$signalSlotDispatcher->connect(
'TYPO3\CMS\Extbase\Persistence\Generic\Backend',
'afterRemoveObject',
'Vendor\MxExtension\Slots\MyAfterRemoveObjectSlot',
'myAfterRemoveObjectMethod'
);
所以在你的Slot中你有这个PHP文件:
namespace Vendor\MxExtension\Slots;
class MyAfterRemoveObjectSlot {
public function myAfterRemoveObjectMethod($object) {
// do something
}
}
注意$object
将是刚从数据库中删除的$对象。
有关详细信息,请参阅https://usetypo3.com/signals-and-hooks-in-typo3.html