2015-04-20 26 views
5

Ich schreibe eine Erweiterung, die es ermöglicht, Dateien im Frontend und Backend einer TYPO3-Instanz hochzuladen. Der Upload funktioniert in beiden Ansichten, aber wenn der Administrator einen Upload im Backend in der Listenansicht löschen möchte, wird die "physische" Datei, die sich auf der Festplatte des Webservers befindet, nicht gelöscht, sondern nur der sys_file_reference-Datensatz.Datei beim Löschen löschen sys_file_reference

Gibt es eine Möglichkeit, dem TCA mitzuteilen, dass im Falle eines Löschens des Upload-Datensatzes die zugehörige Datei ebenfalls gelöscht werden sollte? Ich habe auch versucht, einen Schlitz mit dem folgenden Code zu implementieren, aber es passiert nichts:

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

Klassen/Slots/MyAfterRemoveObjectSlot.php:

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

Hat jemand eine Idee, wie man das löst? Es wird viele Uploads sein, und wenn der Administrator ein löscht, die zugehörige Datei ebenfalls gelöscht werden soll ...

Vielen Dank im Voraus für Ihre Hilfe :)

+0

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

+0

Also, bekomme ich Sie richtig, dass Sie die zugrunde liegende Datei löschen möchten, wenn eine Dateiverweis gelöscht wird? Und die Dateireferenz ist eine Beziehung von Ihrem "Upload" -Objekt? Bitte klären Sie, dann kann ich Ihnen helfen. Ihr SignalSlot funktioniert nicht, da das Back-End keine Extbase-Persistenz verwendet.Aber es gibt Lösungen, die Hooks in DataHandler verwenden. Bitte geben Sie auch die TYPO3-Version an, wenn es 6.2 oder 7 ist, fügen Sie bitte das entsprechende Tag hinzu. – lorenz

+0

Ja, genau das möchte ich tun. Die Dateireferenz ist ein Attribut meines Upload-Objekts und die Klasse erweitert \ TYPO3 \ CMS \ Extbase \ Domain \ Model \ FileReference. Ich benutze TYPO3 6.2. Danke –

Antwort

1

Leider habe ich keine Zeit, einen kompletten zu erstellen , testete antwort ATM, aber ich stelle die notwendigen Schritte zusammen und hoffe, dass Sie eine Lösung erarbeiten und meine Antwort dann vervollständigen können.

Jede Manipulation, die über ein TCEFORM durchgeführt wird, wird mit dem DataHandler (früher TCEmain) gespeichert. Der DataHandler hat zahlreiche Hooks. Ich nehme an, dass Ihr Modell "Upload" eine Eigenschaft file hat, die vom Typ (oder erweitert) \TYPO3\CMS\Extbase\Domain\Model\FileReference ist.

Dateiverweise in TCEFORM werden als IRRE-Elemente hinzugefügt. Also, wenn Sie den Dateiverweis entfernen und das Hochladen von Objekt speichern, die folgenden Daten (amogst andere) Datahandler gesendet:

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

Dies bedeutet, dass die Dateireferenz mit uid 15011 muß gelöscht werden. Ich schlage vor, den processCmdmap_deleteAction Haken dafür zu implementieren.

Sie müssen also auch die Datamap überprüfen, um herauszufinden, ob der Befehl durch eine Manipulation eines "Upload" -Datensatzes ausgeführt wurde.

ext_localconf.php:

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

EXT: your_extension/Klassen/Haken/DataHandler.php

Dieser Code ist nicht getestet!

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

} 

bemerkte ich den Code, so dass Sie wissen, welche Kontrollen für das, was notwendig sind.

Vergessen Sie nicht, den Systemcache zu löschen, nachdem Sie den Hook in ext_localconf.php definiert haben.

+0

#lorenz, Sie haben meinen Tag gespeichert, um den FAL-Referenzdatensatz zu löschen, und auch das Bild/die Datei wurde aus dem entsprechenden Ordner gelöscht. aber was ich sehe, ist es gesamte Zeile löschen/Datensatz von sys_file_reference nicht markieren als gelöscht = 1. In meinem Fall bin ich glücklich mit diesem Deal;) nochmal Danke Mann :) –