2015-02-24 12 views
7

Ho la ipotetica Zoo estensione in cui ho Animal modello con photo campo e FrontEnd (FE) plugin con azioni tipiche CRUD. Il campo photo è un tipico FAL FileReference e funziona perfettamente nel backend (BE) con la configurazione TCA IRRE comune.TYPO3 6.2 - come creare FileReference in frontend (FE)?

Sono in grado di caricare il file con successo alla memoria, è visibile nel modulo Filelist , e posso usarlo in essere durante il mio editing degli animali, in ogni caso non posso creare FileReference nel mio plug-FE.

mio approccio attuale si presenta così:

/** 
* @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'); 
} 

comunque tentare di creare di riferimento da questa linea genera un'eccezione:

$animal->addPhoto($fileObject); 

Come posso risolvere questo?

Controllato: l'approccio DataHandler (link) non funziona anche perché non è disponibile per gli utenti di FE.

TL; DR

Come aggiungere FileReference-Animal modello da esistente (appena creato) record di FAL?

+1

Hai controllato http://insight.helhum.io/post/85015526410/file-upload-using-extbase-and-fal-in-typo3-6-2 - è è un approccio diverso rispetto al codice in uploadAction poiché utilizza un typeconverter generico per convertire il file (oi file) caricato in un oggetto che viene direttamente utilizzato durante la creazione del modello 'Animal'. Funziona perfettamente sia in FE che in BE. – derhansen

+0

@derhansen thx, questa è la prima cosa che vedi quando usi google, TBH, speravo che ci fosse una soluzione più semplice per una cosa così ... di base, comunque come posso vedere ho bisogno di scavare più a fondo nel poc di Helmut. – biesior

risposta

13

Hai bisogno di fare diverse cose. Questo issue on forge è dove ho ottenuto le informazioni, e alcune cose viene preso fuori Helmut Hummels frontend upload example (e la accompanying blogpost), che @derhansen già commentato.

io non sono del tutto sicuro se questo è tutto ciò che serve, quindi sentitevi liberi di aggiungere le cose. Questo non usa un TypeConverter, che probabilmente dovresti fare. Ciò aprirebbe ulteriori possibilità, ad esempio sarebbe facilmente possibile implementare la cancellazione e la sostituzione dei riferimenti ai file.

è necessario:

  • Creare un oggetto di riferimento di file FAL dall'oggetto File. Questo può essere fatto usando la fabbrica di risorse FAL.
  • avvolgerla in un \TYPO3\CMS\Extbase\Domain\Model\FileReference (metodo ->setOriginalResource)
  • EDIT: Questo passaggio non è necessario, come di TYPO3 6.2.11 e 7.2, è possibile utilizzare direttamente la classe \TYPO3\CMS\Extbase\Domain\Model\FileReference.

    Tuttavia, poiché il modello extbase manca un campo ($uidLocal) in 6.2.10rc1, non funzionerà. È necessario ereditare dal modello extbase, aggiungere quel campo e riempirlo. Non dimenticare di aggiungere una mappatura in TypoScript per mappare il tuo modello su sys_file_reference.

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

    La classe sarebbe simile a questa (preso dal problema forgia):

    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(); 
         } 
        } 
    
  • Aggiungere questo al TCA del campo dell'immagine, nella config-sezione (adattarsi al vostro tavolo e i nomi dei campi di corso):

    'foreign_match_fields' => array(
        'fieldname' => 'photo', 
        'tablenames' => 'tx_zoo_domain_model_animal', 
        'table_local' => 'sys_file', 
    ), 
    
  • EDIT: Utilizzare \TYPO3\CMS\Extbase\Domain\Model\FileReference in questa fase se su TYPO3 6.2.11 o 7.2 o ab ove.

    Così, alla fine aggiungere il creato $fileRef invece di $fileObject

    $fileRef = GeneralUtility::makeInstance('\Zoo\Zoo\Domain\Model\FileReference'); 
    $fileRef->setOriginalResource($fileObject); 
    
    $animal->addPhoto($fileRef); 
    
  • Non dire a nessuno quello che avete fatto.

+0

Jost, ok, non lo dirò a nessuno;) Finalmente mi sono reso conto di aver perso totalmente TypeConverters in passato. – biesior

+0

#biesior la tua domanda e #Jost la tua risposta salva la mia giornata. Ho seguito tutti i passaggi, creare un nuovo file FileRefence.php sotto il mio modello. Tutto funziona dopo rimuovere typo3temp;) anche io devo cambiare il mio metodo set nel modello. Grazie a entrambi Gentiluomo :) –

+0

In realtà mi ha salvato la giornata di nuovo ieri;) – biesior

0

Ecco la funzione di completare il caricamento di file in TYPO3 utilizza FAL e creare 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');

E

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

+0

Grazie per aver condiviso! Ottengo l'errore 'Errore irreversibile: chiamata a una funzione membro writelog() su null in /var/www/typo3_src-7.6.15/typo3/sysext/core/Classes/DataHandling/DataHandler.php sulla riga 8138' e trovata in seguito Problema su TYPO3 forge: https://forge.typo3.org/issues/75805. Sto facendo qualcosa di sbagliato, o perché questo funziona per te e non per me? :-) – chris

0

Questo esempio non merita un premio di bellezza, ma potrebbe aiutarti. Funziona 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)); 
} 
Problemi correlati