2015-04-20 7 views
5

हटाते समय फ़ाइल हटाएं मैं एक एक्सटेंशन लिख रहा हूं जो किसी TYPO3 इंस्टेंस के अग्रभाग और बैकएंड में फ़ाइलों को अपलोड करने की अनुमति देता है। अपलोड दोनों दृश्यों में काम करता है लेकिन यदि व्यवस्थापक सूची दृश्य में बैकएंड में अपलोड को हटाना चाहता है, तो "भौतिक" फ़ाइल, जो वेबसर्वर के हार्डडिस्क पर स्थित है, को हटाया नहीं जाएगा, केवल sys_file_reference रिकॉर्ड।sys_file_reference

क्या टीसीए को बताने की संभावना है कि अपलोड रिकॉर्ड को हटाने के मामले में संबंधित फाइल को भी हटाया जाना चाहिए? मैं भी निम्न कोड के साथ एक स्लॉट को लागू करने की कोशिश की है, लेकिन कुछ नहीं होता:

ext_localconf.php:

\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher')->connect(
    'TYPO3\CMS\Extbase\Persistence\Generic\Backend', 
    'afterRemoveObject', 
    'Kmi\feupload\Slots\MyAfterRemoveObjectSlot', 
    'myAfterRemoveObjectMethod' 
); 

क्लासेस/स्लॉट/MyAfterRemoveObjectSlot.php:

namespace Kmi\feupload\Slots; 
class MyAfterRemoveObjectSlot { 
    public function myAfterRemoveObjectMethod($object) { 
    // do something 
    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($object); 
    } 
} 

किसी को भी एक है विचार कैसे हल करें? वहाँ कई अपलोड हो जाएगा और यदि व्यवस्थापक एक, संबद्ध फ़ाइल भी हटा दिया जाना चाहिए ... हटाता

आपकी मदद :)

+0

https://forge.typo3.org/issues/52631 – Zeeshan

+0

तो, क्या मुझे सही लगता है कि यदि आप फ़ाइल संदर्भ हटा दिए जाते हैं तो आप अंतर्निहित फ़ाइल को हटाना चाहते हैं? और फ़ाइल संदर्भ आपके "अपलोड" ऑब्जेक्ट से एक रिश्ता है? कृपया स्पष्टीकरण दें, फिर मैं आपकी मदद कर सकता हूं। आपका सिग्नल स्लॉट काम नहीं करेगा क्योंकि बैकएंड एक्स्टबेस दृढ़ता का उपयोग नहीं करता है।लेकिन डेटाहैंडलर में हुक का उपयोग कर समाधान हैं। कृपया TYPO3 संस्करण भी निर्दिष्ट करें, यदि यह 6.2 या 7 है तो कृपया संबंधित टैग जोड़ें। – lorenz

+0

हां, यह वही है जो मैं करना चाहता हूं। फ़ाइल संदर्भ मेरी अपलोड ऑब्जेक्ट का एक विशेषता है और कक्षा \ TYPO3 \ CMS \ Extbase \ Domain \ Model \ FileReference फैली हुई है। मैं TYPO3 6.2 का उपयोग कर रहा हूँ। धन्यवाद –

उत्तर

1

दुर्भाग्य से मैं पूरी तरह से बनाने के लिए समय नहीं है के लिए अग्रिम रूप से धन्यवाद , एटीएम का परीक्षण किया गया लेकिन मैं आवश्यक चरणों को एक साथ रख रहा हूं और उम्मीद करता हूं कि आप समाधान कर सकते हैं और मेरा जवाब पूरा कर सकते हैं।

एक टीसीईएफओएम के माध्यम से किए गए प्रत्येक हेरफेर को डेटाहैंडलर (जिसे पहले टीसीएममेन कहा जाता है) से बचाया जाता है। डेटाहैंडलर में कई हुक हैं। मुझे लगता है कि आपके मॉडल "अपलोड" में एक संपत्ति file है जो प्रकार (या विस्तारित) \TYPO3\CMS\Extbase\Domain\Model\FileReference है।

टीसीईओआरएम में फ़ाइल संदर्भ आईआरआरई तत्वों के रूप में जोड़े गए हैं। तो जब आप फ़ाइल संदर्भ निकाल दें और अपलोड वस्तु बचाने के लिए, निम्न डेटा (दूसरों amogst) है DataHandler के लिए भेजा:

cmd[sys_file_reference][15011][delete]=1 

इसका मतलब है कि यूआईडी 15011 के साथ फ़ाइल संदर्भ से हटाना होगा। मैं इसके लिए processCmdmap_deleteAction हुक को लागू करने का सुझाव देता हूं।

तो आपको यह पता लगाने के लिए डेटामैप को भी देखना होगा कि आदेश "अपलोड" रिकॉर्ड में हेरफेर के माध्यम से निष्पादित किया गया था या नहीं।

ext_localconf.php:

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass']['your_extension'] = 'My\\Extension\\Hook\\DataHandler'; 

EXT: your_extension/वर्ग/हुक/DataHandler.php

इस कोड अपरीक्षित है!

<?php 
namespace My\Extension\Hook 

class DataHandler { 

    /** 
    * @param string $table 
    * @param int $id 
    * @param array $recordToDelete 
    * @param $parentObject \TYPO3\CMS\Core\DataHandling\DataHandler 
    */ 
    public function processCmdmap_deleteAction($table, $id, $recordToDelete, $parentObject) { 
     if (array_key_exists('tx_myext_domain_model_upload', $parentObject->datamap)) { 
      // Parent record of record to delete is of type "tx_myext_domain_model_upload" 
      if ($table === 'sys_file_reference' && is_integer($id)) { 
       // A file reference was requested to delete 
       // Get an instance of the ResourceFactory 
       /** @var $resourceFactory \TYPO3\CMS\Core\Resource\ResourceFactory */ 
       $resourceFactory = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Resource\\ResourceFactory'); 
       // We get the FileReference object for the given id 
       $fileReferenceObject = $resourceFactory->getFileReferenceObject($id); 
       // Delete the original file of the file reference 
       $fileWasDeleted = $fileReferenceObject->getOriginalFile()->delete(); 
       // @TODO throw a warning if $fileWasDeleted is false     
      } 
     } 
    } 

} 

मैं कोड टिप्पणी की तो तुम्हें पता जो चेक क्या के लिए आवश्यक हैं।

ext_localconf.php में हुक को परिभाषित करने के बाद सिस्टम कैश को साफ़ करना न भूलें।

+0

#lorenz, आपने FAL संदर्भ रिकॉर्ड को हटाने के लिए अपना दिन सहेजा, और संबंधित फ़ोल्डर से छवि/फ़ाइल भी हटा दी। लेकिन मैं जो देखता हूं, वह sys_file_reference से पूरी पंक्ति/रिकॉर्ड हटा देता है जिसे हटाया गया = 1 के रूप में चिह्नित नहीं किया जाता है। मेरे मामले में मैं इस सौदे से खुश हूं;) फिर से धन्यवाद आदमी :) –