2015-02-24 22 views
7

Ich habe die hypothetische Zoo Erweiterung, in der ich Animal Modell mit photo Feld und FrontEnd (FE) -Plugin mit typischen CRUD-Aktionen habe. photo Feld ist typisch FAL's FileReference und es funktioniert perfekt im Backend (BE) mit gemeinsamen TCA IRRE Config.TYPO3 6.2 - wie erstellt man FileReference im Frontend (FE)?

Ich bin in der Lage zu erfolgreichen Upload die Datei auf die Speicher, dann ist es sichtbar im Liste der Dateien Modul, und ich kann es in BE während meiner Tier Bearbeitung verwenden, trotzdem kann ich nicht erstellen FileReference In meiner FE-Plugin.

Mein aktueller Ansatz sieht wie folgt aus:

/** 
* @param \Zoo\Zoo\Domain\Model\Animal $animal 
*/ 
public function updateAction(\Zoo\Zoo\Domain\Model\Animal $animal) { 

    // It reads proper uploaded `photo` from form's $_FILES 
    $file = $this->getFromFILES('tx_zoo_animal', 'photo'); 

    if ($file && is_array($file) && $file['error'] == 0) { 

     /** @type $storageRepository \TYPO3\CMS\Core\Resource\StorageRepository */ 
     $storageRepository = GeneralUtility::makeInstance('\TYPO3\CMS\Core\Resource\StorageRepository'); 
     $storage = $storageRepository->findByUid(5); // TODO: make target storage configurable 

     // This adds uploaded file to the storage perfectly 
     $fileObject = $storage->addFile($file['tmp_name'], $storage->getRootLevelFolder(), $file['name']); 

     // Here I stuck... below line doesn't work (throws Exception no. 1 :/) 
     // It's 'cause $fileObject is type of FileInterface and FileReference is required 
     $animal->addPhoto($fileObject); 

    } 

    $this->animalRepository->update($animal); 
    $this->redirect('list'); 
} 

ohnehin versuchen Referenz durch diese Linie zu erstellen wirft Ausnahme:

$animal->addPhoto($fileObject); 

Wie kann ich dieses Problem lösen?

Geprüft: DataHandler Ansatz (link) funktioniert auch nicht, da es für FE-Benutzer nicht verfügbar ist.

TL; DR

Wie FileReference-Animal Modell aus bestehenden (gerade erstellt) FAL Datensatz hinzufügen?

+1

Haben Sie http://insight.helhum.io/post/85015526410/file-upload-using-extbase-and-fal-in-typo3-6-2 überprüfen - es ist ein anderer Ansatz als Ihr Code in 'uploadAction', da ein generischer Typconverter verwendet wird, um Ihre hochgeladene Datei (oder Dateien) in ein Objekt zu konvertieren, das direkt beim Erstellen Ihres 'Animal'-Modells verwendet wird. Funktioniert perfekt in FE und BE. – derhansen

+0

@derhansen thx, das ist das erste, was du beim googeln siehst, TBH, ich war der Hoffnung, es gibt eine einfachere Lösung für solch ein ... einfaches Ding, wie auch immer ich sehen kann, muss ich tiefer in Helmuts Arbeit eintauchen. – biesior

Antwort

13

Sie müssen mehrere Dinge tun. Diese issue on forge ist, wo ich die Informationen bekam, und einige Sachen sind aus Helmut Hummels frontend upload example (und accompanying blogpost), die @derhansen bereits kommentiert.

Ich bin mir nicht ganz sicher, ob das alles ist, was Sie brauchen, also zögern Sie nicht, etwas hinzuzufügen. Dies verwendet keinen TypeConverter, was Sie wahrscheinlich tun sollten. Dies würde weitere Möglichkeiten eröffnen, beispielsweise wäre es leicht möglich, das Löschen und Ersetzen von Dateireferenzen zu implementieren.

Sie müssen:

  • eine Objektdatei Referenz FAL erstellen aus dem Datei-Objekt. Dies kann mithilfe der FALs-Ressourcenfactory erfolgen.
  • Wickeln Sie es in einem \TYPO3\CMS\Extbase\Domain\Model\FileReference (Methode ->setOriginalResource)
  • EDIT: Dieser Schritt als von TYPO3 6.2.11 und 7.2 nicht erforderlich ist, können Sie die Klasse \TYPO3\CMS\Extbase\Domain\Model\FileReference direkt verwenden können.

    Da das extbase-Modell ein Feld ($uidLocal) in 6.2.10rc1 verfehlt, funktioniert das nicht. Sie müssen vom extbase-Modell erben, dieses Feld hinzufügen und es ausfüllen. Vergessen Sie nicht, in TypoScript ein Mapping hinzuzufügen, um Ihr eigenes Modell auf sys_file_reference zu mappen.

    config.tx_extbase.persistence.classes.Zoo\Zoo\Domain\Model\FileReference.mapping.tableName = sys_file_reference 
    

    Die Klasse würde wie folgt aussehen (aus der Schmiede Ausgabe genommen):

    class FileReference extends \TYPO3\CMS\Extbase\Domain\Model\FileReference { 
    
        /** 
         * We need this property so that the Extbase persistence can properly persist the object 
         * 
         * @var integer 
         */ 
         protected $uidLocal; 
    
         /** 
         * @param \TYPO3\CMS\Core\Resource\ResourceInterface $originalResource 
         */ 
         public function setOriginalResource(\TYPO3\CMS\Core\Resource\ResourceInterface $originalResource) { 
          $this->originalResource = $originalResource; 
          $this->uidLocal = (int)$originalResource->getUid(); 
         } 
        } 
    
  • das des Bildfeldes auf den TCA hinzufügen, in dem Config-Abschnitt (auf den Tisch anzupassen und Feldnamen natürlich):

    'foreign_match_fields' => array(
        'fieldname' => 'photo', 
        'tablenames' => 'tx_zoo_domain_model_animal', 
        'table_local' => 'sys_file', 
    ), 
    
  • EDIT: Verwenden Sie \TYPO3\CMS\Extbase\Domain\Model\FileReference in diesem Schritt, wenn auf TYPO3 6.2.11 oder 7.2 oder ab Ove.

    So am Ende fügen Sie die erstellt $fileRef statt $fileObject

    $fileRef = GeneralUtility::makeInstance('\Zoo\Zoo\Domain\Model\FileReference'); 
    $fileRef->setOriginalResource($fileObject); 
    
    $animal->addPhoto($fileRef); 
    
  • Sie jemand nicht sagen, was Sie getan haben.

+0

Jost, ok, ich werde es niemandem erzählen;) Endlich habe ich gemerkt, dass ich TypeConverters in der Vergangenheit total vermisst habe. – biesior

+0

#biesior Ihre Frage und #Just Ihre Antwort rettet meinen Tag. Ich habe alle Schritte verfolgt, neue Datei FileRefence.php unter meinem Modell erstellen. Alles funktioniert nach dem Entfernen von typo3temp;) Außerdem muss ich meine Set-Methode im Model ändern. Danke euch beiden Gentleman :) –

+0

Eigentlich hat es gestern wieder meinen Tag gerettet;) – biesior

0

Dies ist die komplette Funktion Datei in TYPO3 mit FAL hochladen und erstellen FileReference-

/** 
* Function to upload file and create file reference 
* 
* @var array $fileData 
* @var mixed $obj foreing model object 
* 
* @return void 
*/ 
private function uploadAndCreateFileReference($fileData, $obj) { 
    $storageUid = 2; 
    $resourceFactory = \TYPO3\CMS\Core\Resource\ResourceFactory::getInstance(); 

    //Adding file to storage 
    $storage = $resourceFactory->getStorageObject($storageUid); 
    if (!is_object($storage)) { 
     $storage = $resourceFactory->getDefaultStorage(); 
    } 

    $file = $storage->addFile(
      $fileData['tmp_name'], 
      $storage->getRootLevelFolder(), 
      $fileData['name'] 
    ); 


    //Creating file reference 
    $newId = uniqid('NEW_'); 
    $data = []; 
    $data['sys_file_reference'][$newId] = [ 
     'table_local' => 'sys_file', 
     'uid_local' => $file->getUid(), 
     'tablenames' => 'tx_imageupload_domain_model_upload', //foreign table name 
     'uid_foreign' => $obj->getUid(), 
     'fieldname' => 'image', //field name of foreign table 
     'pid' => $obj->getPid(), 
    ]; 
    $data['tx_imageupload_domain_model_upload'][$obj->getUid()] = [ 
     'image' => $newId, 
    ]; 

    $dataHandler = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
     'TYPO3\CMS\Core\DataHandling\DataHandler' 
    ); 
    $dataHandler->start($data, []); 
} 

where $filedata = $this->request->getArgument('file_input_field_name');

Und

$obj = //Object of your model for which you are creating file reference

+0

Danke fürs Teilen! Ich bekomme den Fehler 'Fatal error: Aufruf an eine Member-Funktion writelog() auf Null in /var/www/typo3_src-7.6.15/typo3/sysext/core/Classes/DataHandling/DataHandler.php in Zeile 8138' und folgende gefunden Ausgabe auf TYPO3-Schmiede: https://forge.typo3.org/issues/75805. Mache ich etwas falsch oder warum funktioniert das für dich und nicht für mich? :-) – chris

0

Dieses Beispiel es keinen Schönheitspreis verdient aber könnte dir helfen. Es funktioniert in 7.6.x

private function uploadLogo(){ 

    $file['name'] = $_FILES['logo']['name']; 
    $file['type'] = $_FILES['logo']['type']; 
    $file['tmp_name'] = $_FILES['logo']['tmp_name']; 
    $file['size'] = $_FILES['logo']['size']; 

    // Store the image 
    $resourceFactory = \TYPO3\CMS\Core\Resource\ResourceFactory::getInstance(); 
    $storage = $resourceFactory->getDefaultStorage(); 

    $saveFolder = $storage->getFolder('logo-companies/'); 
    $newFile = $storage->addFile(
    $file['tmp_name'], 
    $saveFolder, 
    $file['name'] 
    ); 

    // remove earlier refereces 
    $GLOBALS['TYPO3_DB']->exec_DELETEquery('sys_file_reference', 'uid_foreign = '. $this->getCurrentUserCompanyID()); 

    $addressRecord = $this->getUserCompanyAddressRecord(); 

    // Create new reference 
    $data = array(
    'table_local' => 'sys_file', 
    'uid_local' => $newFile->getUid(), 
    'tablenames' => 'tt_address', 
    'uid_foreign' => $addressRecord['uid'], 
    'fieldname' => 'image', 
    'pid' => $addressRecord['pid'] 
    ); 

    $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_file_reference', $data); 
    $newId = $GLOBALS['TYPO3_DB']->sql_insert_id(); 

    $where = "tt_address.uid = ".$addressRecord['uid']; 
    $GLOBALS['TYPO3_DB']->exec_UPDATEquery('tt_address', $where, array('image' => $newId)); 
}