Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TYPO3 Extbase在后端删除对象时的单个代码_Typo3_Extbase - Fatal编程技术网

TYPO3 Extbase在后端删除对象时的单个代码

TYPO3 Extbase在后端删除对象时的单个代码,typo3,extbase,Typo3,Extbase,当我的一个Extbase域对象从TYPO3后端的列表视图中删除时,我想执行一些单独的代码 认为它可以/将通过覆盖相应存储库中的remove($o)方法来工作,如 public function remove( $object ) { parent::__remove( $object ); do_something_i_want(); } ,但我想那是行不通的。看起来存储库方法仅由我的扩展的操作调用/使用(例如,如果我在FE-或BE插件中有一些删除操作),而不是在后端从列表视

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

认为它可以/将通过覆盖相应存储库中的
remove($o)
方法来工作,如

 public function remove( $object ) {
    parent::__remove( $object );
    do_something_i_want();
}
,但我想那是行不通的。看起来存储库方法仅由我的扩展的操作调用/使用(例如,如果我在FE-或BE插件中有一些删除操作),而不是在后端从列表视图中删除对象时调用/使用?我不使用(到目前为止)任何FE/BE plugin/-actions,只使用存储文件夹后端列表视图中简单的添加/编辑/删除功能

背景:例如,我有两个具有1:n关系的模型(比如说
singer
song
),其中一个对象包括一些上传的文件(
album\u cover
>指向
/uploads/myext/
文件夹中的文件URL);使用
@cascade
可以很好地删除属于被删除的
歌手的每首
歌曲
,但它不会触及(仅)为
歌曲上传的文件。专辑封面
——随着时间的推移会造成相当大的浪费。所以我想做一些类似的
ondelectionofsinger(){deleteAllFilesForHisSongs();}
-的事情。 (同样的事情也适用于删除一首歌和它的专辑封面文件。)


听起来很简单,也很普通,但我只是不了解它,并没有发现任何有用的东西-希望得到一些提示/指向正确的方向:-)。

列表视图在其操作期间使用TCEmain钩子,因此您可以使用其中一个钩子来交叉删除操作,即:

  • typo3conf/ext/your_ext/ext_tables.php中注册您的hooks类

    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass'][] = 'VENDORNAME\\YourExt\\Hooks\\ProcessCmdmap';
    
    <?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
            }
        }
    } 
    
  • 创建具有有效命名空间和路径的类(根据上一步)
    文件:
    typo3conf/ext/your_ext/Classes/Hooks/ProcessCmdmap.php

    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass'][] = 'VENDORNAME\\YourExt\\Hooks\\ProcessCmdmap';
    
    <?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
            }
        }
    } 
    

    除了Biesior的回答,我想指出的是,这也有一个信号槽。因此,您可以注册该信号,而不是挂接到tcemain

    ext\u localconf.php
    put中:

    $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
    将是刚刚从数据库中删除的$object


    有关更多信息,请参见

    首先感谢您,听起来不错-但不幸的是,我遇到了一些严重的
    致命错误:调用成员函数exec_SELECTgetSingleRow()在Typo 6.2第182行的…\typo3\sysext\core\Classes\Cache\Backend\Typo3DatabaseBackend.php中的非对象上,只需添加
    $signalSlotDispatcher=\typo3\CMS\core\Utility\GeneralUtility::makeInstance('typo3\CMS\Extbase\ObjectManager')->get('typo3\CMS\Extbase\SignalSlot\Dispatcher')我的
    ext_localconf.php
    中的东西,即使剩下的部分(连接某个信号和自己的类/方法)被忽略了。当然,我试图清除缓存,删除typo3temp中的所有内容,并停用/重新激活我的插件-总是相同的错误;查看了引用的文件/行,但到目前为止,我还没有了解出了什么问题:-(-有什么想法吗?请参阅:只使用:$signalSlotDispatcher=\TYPO3\CMS\Core\Utility\general实用性::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher');至少在TYPO3 6.2中是“afterRemoveObject”通过“列表”删除时似乎没有发出信号后端。虽然如果您通过存储库的
    remove
    方法删除对象,它会发出声音。感谢您的回答和很好的提示-效果非常好。我花了一段时间才了解Doc params记录/recordwasdelected假设不符合实际参数,同时寻找获得所需文件名/val的正确方法要进一步处理的记录中的ue(删除图像,例如;-)。但是使用
    \TYPO3\CMS\Backend\Utility\BackendUtility::getRecord('my_table',$id','field_或_fields_needed','',false)
    似乎可以正常工作。并且-也许你想为其他人编辑:当这个东西被调用时,记录已经被设置为“del”,因此不需要像建议的那样使用自己的删除代码。仅适用于具有类似场景的情况:钩子不“应用”到级联删除(在我的示例中,例如,当艺术家被删除时删除歌曲)因此,您必须从父视图中记住相关的子项(当对
    父表
    执行删除操作时,因为
    子表
    上的删除检查仅适用于在后端删除该子项时,而不是在级联删除的情况下,如果必须对其进行任何删除。