2015-04-20 15 views
5

Sto scrivendo un'estensione che consente di caricare file nel frontend e nel backend di un'istanza TYPO3. Il caricamento funziona in entrambe le visualizzazioni ma se l'amministratore desidera eliminare un caricamento nel back-end nella visualizzazione elenco, il file "fisico", che si trova sul disco rigido del server Web, non verrà eliminato, ma solo il record sys_file_reference.Elimina file durante l'eliminazione di sys_file_reference

C'è una possibilità di dire al tca che in caso di cancellazione del record di upload il file associato dovrebbe essere cancellato? Ho anche provato a implementare uno slot con il seguente codice, ma non succede nulla:

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' 
); 

Classi/Slot/MyAfterRemoveObjectSlot.php:

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

Qualcuno ha idea di come risolvere questo? Ci saranno molti arrivi e se l'amministratore elimina uno, il file associato dovrebbe anche essere eliminato ...

Grazie in anticipo per il vostro aiuto :)

+0

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

+0

Quindi, ti faccio bene che vuoi eliminare il file sottostante se un riferimento al file viene cancellato? E il riferimento al file è una relazione dal tuo oggetto "upload"? Per favore, chiarisci, quindi posso aiutarti. SignalSlot non funzionerà perché il backend non usa Persistenza di Extbase.Ma ci sono soluzioni che usano ganci in DataHandler. Si prega di specificare anche la versione di TYPO3, se è 6.2 o 7 si prega di aggiungere il rispettivo tag. – lorenz

+0

Sì, è esattamente quello che voglio che faccia. Il riferimento al file è un attributo del mio oggetto upload e la classe estende \ TYPO3 \ CMS \ Extbase \ Domain \ Model \ FileReference. Sto usando TYPO3 6.2. Grazie –

risposta

1

Purtroppo non ho tempo per creare una completa , risposta testata ATM ma sto mettendo insieme i passi necessari e spero che tu possa lavorare a una soluzione e completare la mia risposta allora.

Ogni manipolazione eseguita tramite TCEFORM viene salvata con DataHandler (precedentemente chiamato TCEmain). DataHandler ha numerosi hook. Presumo che il tuo modello "Upload" abbia una proprietà file che sia di tipo (o estesa) \TYPO3\CMS\Extbase\Domain\Model\FileReference.

I riferimenti file in TCEFORM vengono aggiunti come elementi IRRE. Così, quando si rimuove il riferimento al file e salvare l'oggetto Upload, i seguenti dati è (amogst altri) inviate a DataHandler:

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

Ciò significa che il riferimento al file con uid 15011 deve essere eliminato. Suggerisco di implementare il gancio processCmdmap_deleteAction per questo.

Quindi è necessario controllare anche la datamap per scoprire se il comando è stato eseguito tramite una manipolazione di un record "Upload".

ext_localconf.php:

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

EXT: your_extension/Corsi/Hook/DataHandler.php

Questo codice è testato!

<?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     
      } 
     } 
    } 

} 

ho commentato il codice in modo da sapere che sono necessari per quali controlli.

Non dimenticare di cancellare la cache di sistema dopo aver definito il hook in ext_localconf.php.

+0

#lorenz, hai salvato il mio giorno per eliminare il record di riferimento FAL e anche l'immagine/file eliminati dalla rispettiva cartella. ma quello che vedo, è cancellare l'intera riga/record da sys_file_reference not mark as deleted = 1. Nel mio caso sono contento di questo accordo;) di nuovo Grazie Uomo :) –