2014-08-31 24 views
3

我想从TYPO3后端的列表视图中删除我的一个Extbase域对象时执行一些单独的代码。TYPO3 Extbase对象的后端删除单个代码

原以为它可以/将通过覆盖在根据库中的remove($o)方法工作像

public function remove($object) { 
    parent::__remove($object); 
    do_something_i_want(); 
} 

,但不会工作,我猜。看起来版本库方法只是由我的扩展的动作调用/使用(例如,如果我在FE或BE插件中有一些删除操作),而不是在后端的列表视图中刚刚删除对象时才使用?我没有使用(到现在为止)任何FE/BE-plugin/-actions - 我的存储文件夹的后端列表视图中只有简单的添加/编辑/删除功能。

背景:我有两个模型与一些1:n关系(比如说singersong),其中一个对象包含一些上传的文件(album_cover>指向/uploads/myext/文件夹中的文件的URL);使用@cascade适用于删除属于singer的每个song,但它不会触及仅上传(仅)song.album_cover的文件 - 这会导致相当多的浪费。所以我喜欢做一些onDeletionOfSinger() { deleteAllFilesForHisSongs(); }东西。 (同样的事情也适用于缺失,让我们说一个song和它的album_cover -file。)

听起来很容易&常见的,但我只是不明白它背后并没有发现任何有用的 - 也许需要一些提示/指向正确的方向:-)。

回答

5

列表视图的操作过程中使用TCEmain挂钩,所以你可以使用其中一个相交删除的行为,即:processCmdmap_deleteAction

  1. 注册您的挂钩类typo3conf/ext/your_ext/ext_tables.php

    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass'][] = 'VENDORNAME\\YourExt\\Hooks\\ProcessCmdmap'; 
    
  2. 创建(根据上一步)
    file: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 
         } 
        } 
    } 
    
  3. 不要忘记注册新的钩子的类

+0

谢谢您的回答和不错的提示 - 工作得很好。只是花了我一段时间才得到Doc-params记录/ recordWasDeleted后面的假设,以便在寻找正确的方式从记录中获得所需的文件名/值以进一步处理(例如删除图像)时不适合实际参数。 - )。但是使用'\ TYPO3 \ CMS \ Backend \ Utility \ BackendUtility :: getRecord('my_table',$ id,'field_or_fields_needed','',false)'似乎工作正常。而且 - 也许你想为其他人编辑:当事情被调用时,记录已经设置为“del”,因此不需要像建议的那样自己删除代码。 – Falcon2014 2014-09-01 16:22:33

+0

只适用于具有类似场景的人:钩子不会“应用”级联删除(在我的示例中,例如删除艺术家时删除歌曲),因此您必须从父视图中记住相关的子节点(删除动作是在'parent_table'上执行的,因为'child_table'检查上的删除仅适用于在后端删除子级时的情况,而不是在级联删除的情况下,如果删除时有任何事情发生, – Falcon2014 2014-09-01 19:47:46

3

除了biesiors回答我想指出后清除系统缓存,有也是这个signalSlot。所以你可以宁可注册那个信号而不是挂在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' 
); 

因此,在你槽你有这样的PHP文件:

namespace Vendor\MxExtension\Slots; 
class MyAfterRemoveObjectSlot { 
    public function myAfterRemoveObjectMethod($object) { 
     // do something 
    } 
} 

注意泰德$object将是刚刚从数据库中删除$对象。

欲了解更多信息,请参阅https://usetypo3.com/signals-and-hooks-in-typo3.html

+0

首先感谢你的声音好 - 但不幸的是我得到了一些令人讨厌的致命错误:在第182行的... \ typo3 \ sysext \ core \ Classes \ Cache \ Backend \ Typo3DatabaseBackend.php中的非对象上调用成员函数exec_SELECTgetSingleRow只需添加'$ signalSlotDispatcher = \ TYPO3 \ CMS \ Core \ Utility \ GeneralUtility :: makeInstance('TYPO3 \ CMS \ Extbase \ Object \ ObjectManager') - > get('TYPO3 \ CMS \ Extbase \ SignalSlot \ Dispatcher');'我的'ext_localconf.php'中的东西,即使其余(con如此一定的信号和自己的类别/方法)被排除在外。 – Falcon2014 2014-09-01 14:26:37

+0

当然,我试图清除缓存,从typo3temp中删除所有内容并停用/重新激活我的插件 - 总是出现相同的错误;看看引用的文件/行,但到现在为止,我不知道出了什么问题:-(任何想法? – Falcon2014 2014-09-01 14:29:49

+0

请参阅https://forum.typo3.org/index.php/t/208041/: 只需使用: $ signalSlotDispatcher = \ TYPO3 \ CMS \核心\公用\ GeneralUtility :: makeInstance( 'TYPO3 \\ \\ CMS \\ Extbase \\ SignalSlot调度'); – 2015-12-10 16:02:36