2015-02-24 16 views
7

Mam hipotetyczne rozszerzenie Zoo, w którym mam model Animal z polem photo i wtyczką FrontEnd (FE) z typowymi działaniami CRUD. Pole photo jest typowe dla FAL FileReference i działa idealnie w backend (BE) ze wspólną konfiguracją TCA IRRE.TYPO3 6.2 - jak utworzyć FileReference w interfejsie użytkownika (FE)?

jestem zdolny do pomyślnego przesłania pliku do pamięci, to jest widoczne w module FileList, i można go używać w BE podczas mojego edycji Zwierząt, w każdym razie nie mogę tworzyć FileReference w moim plugin FE.

Moje obecne podejście wygląda następująco:

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

każdym razie próbować utworzyć odwołanie od tej linii rzuca wyjątek:

$animal->addPhoto($fileObject); 

Jak mogę rozwiązać ten problem?

Sprawdzone: podejście DataHandler (link) również nie działa, ponieważ jest niedostępne dla użytkowników FE.

TL; DR

Jak dodać FileReference do Animal modelu z istniejących (nowo utworzony) rekord FAL?

+1

Czy sprawdzić 7.6.x http://insight.helhum.io/post/85015526410/file-upload-using-extbase-and-fal-in-typo3-6-2 - go jest innym podejściem niż twój kod w 'uploadAction', ponieważ używa typowego konwertera typów, aby przekonwertować przesłany plik (lub pliki) na obiekt, który jest bezpośrednio używany podczas tworzenia twojego modelu' Zwierzęcia'. Działa doskonale zarówno w Wf i BE. – derhansen

+0

@derhansen thx, to pierwsza rzecz, którą widzisz podczas wyszukiwania, TBH, Miałem nadzieję, że jest prostsze rozwiązanie dla takiej ... podstawowej rzeczy, zresztą, jak widzę, muszę głębiej zagłębić się w poc pocisku Helmuta. – biesior

Odpowiedz

13

Musisz zrobić kilka rzeczy. Ten issue on forge jest tam, gdzie dostałem informacje, a niektóre rzeczy zostały usunięte z Helmut Hummels frontend upload example (i accompanying blogpost), które @derhansen już skomentował.

Nie jestem do końca pewien, czy to wszystko, czego potrzebujesz, więc możesz dodać coś. To nie używa TypeConvertera, co prawdopodobnie powinieneś zrobić. Otworzyłoby to dalsze możliwości, na przykład łatwo byłoby wdrożyć usunięcie i zastąpienie odniesień do plików.

Musisz:

  • Tworzenie FAL obiekt wzorcowy plik z obiektu pliku. Można to zrobić za pomocą fabryki zasobów FAL.
  • owinąć go w \TYPO3\CMS\Extbase\Domain\Model\FileReference (metoda ->setOriginalResource)
  • EDIT: Ten krok jest niepotrzebny, ponieważ od TYPO3 6.2.11 i 7.2, można korzystać bezpośrednio z klasy \TYPO3\CMS\Extbase\Domain\Model\FileReference.

    Ale ponieważ model bazowy pomija pole ($uidLocal) w wersji 6.2.10rc1, to nie będzie działać. Musisz dziedziczyć z modelu extbase, dodać to pole i wypełnić je. Nie zapomnij dodać odwzorowania w TypoScript, aby zmapować własny model na sys_file_reference.

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

    Klasa będzie wyglądać następująco (wzięty z emisji kuźni):

    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(); 
         } 
        } 
    
  • Dodaj do tego TCA pola obrazu, w config poprzecznym (dostosowanie do stolika i nazwy pól oczywiście):

    'foreign_match_fields' => array(
        'fieldname' => 'photo', 
        'tablenames' => 'tx_zoo_domain_model_animal', 
        'table_local' => 'sys_file', 
    ), 
    
  • EDIT Use \TYPO3\CMS\Extbase\Domain\Model\FileReference w tym etapie, jeżeli w TYPO3 6.2.11 lub 7,2 lub AB ove.

    Więc na koniec dodać utworzony $fileRef zamiast $fileObject

    $fileRef = GeneralUtility::makeInstance('\Zoo\Zoo\Domain\Model\FileReference'); 
    $fileRef->setOriginalResource($fileObject); 
    
    $animal->addPhoto($fileRef); 
    
  • Nie mów nikomu, co masz zrobić.

+0

Jost, ok, nie powiem nikomu;) W końcu uświadomiłem sobie, że całkowicie przegapiłem TypeConverters w przeszłości. – biesior

+0

#biesior Twoje pytanie i #Wysyłaj odpowiedzi, oszczędzając mój dzień. Po wykonaniu wszystkich kroków utworzę nowy plik FileRefence.php w moim modelu. Wszystko działa po usunięciu litero3temp;) również muszę zmienić ustawioną metodę w modelu. Dziękuję wam obu Gentleman :) –

+0

Właściwie to uratowało mój dzień ponownie wczoraj;) – biesior

0

Oto pełna funkcja przesłać plik w TYPO3 za pomocą FAL i tworzyć 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');

And

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

+0

Dzięki za udostępnienie! Pojawia się błąd 'Błąd krytyczny: Wywołanie funkcji member writelog() na wartości null w /var/www/typo3_src-7.6.15/typo3/sysext/core/Classes/DataHandling/DataHandler.php na linii 8138' i znalezione następujące wydanie na TYPO3 kuźnia: https://forge.typo3.org/issues/75805. Czy robię coś źle, albo dlaczego to działa dla ciebie, a nie dla mnie? :-) – chris

0

Ten przykład nie zasługuje na nagrodę kosmetyczny ale może ci pomóc. To działa w

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)); 
} 
Powiązane problemy