2014-08-31 50 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