TYPO3 Extbase在后端删除对象时的单个代码
当我的一个Extbase域对象从TYPO3后端的列表视图中删除时,我想执行一些单独的代码 认为它可以/将通过覆盖相应存储库中的TYPO3 Extbase在后端删除对象时的单个代码,typo3,extbase,Typo3,Extbase,当我的一个Extbase域对象从TYPO3后端的列表视图中删除时,我想执行一些单独的代码 认为它可以/将通过覆盖相应存储库中的remove($o)方法来工作,如 public function remove( $object ) { parent::__remove( $object ); do_something_i_want(); } ,但我想那是行不通的。看起来存储库方法仅由我的扩展的操作调用/使用(例如,如果我在FE-或BE插件中有一些删除操作),而不是在后端从列表视
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”,因此不需要像建议的那样使用自己的删除代码。仅适用于具有类似场景的情况:钩子不“应用”到级联删除(在我的示例中,例如,当艺术家被删除时删除歌曲)因此,您必须从父视图中记住相关的子项(当对父表
执行删除操作时,因为子表
上的删除检查仅适用于在后端删除该子项时,而不是在级联删除的情况下,如果必须对其进行任何删除。