2015-02-24 12 views
7

Tôi có phần mở rộng giả định Zoo trong đó tôi đã mô hình Animal với các trường photo và FrontEnd (FE) với các hành động CRUD điển hình. photo trường là điển hình của FAL FileReference và nó hoạt động hoàn hảo trong phụ trợ (BE) với cấu hình TCA IRRE chung.TYPO3 6.2 - cách tạo FileReference trong giao diện người dùng (FE)?

Tôi có thể tải lên thành công file để lưu trữ, nó hiển thị trong các mô-đunfilelist, và tôi có thể sử dụng nó trong BE trong chỉnh sửa động vật của tôi, dù sao tôi không thể tạo FileReference trong Plugin FE của tôi.

cách tiếp cận hiện tại của tôi trông như thế này:

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

nào cố gắng để tạo ra tài liệu tham khảo của dòng này ném ngoại lệ:

$animal->addPhoto($fileObject); 

Làm thế nào tôi có thể giải quyết này?

Đã kiểm tra: DataHandler phương pháp tiếp cận (link) cũng sẽ không hoạt động vì không khả dụng đối với người dùng FE.

TL; DR

Làm thế nào để thêm FileReference-Animal mô hình từ hiện (vừa tạo) kỷ lục FAL?

+1

Bạn đã kiểm tra http://insight.helhum.io/post/85015526410/file-upload-using-extbase-and-fal-in-typo3-6-2 - it là một cách tiếp cận khác với mã của bạn trong 'uploadAction' vì nó sử dụng một trình biến đổi kiểu chung để chuyển đổi tệp (hoặc tệp) đã tải lên của bạn thành một đối tượng được sử dụng trực tiếp khi tạo mô hình' Động vật' của bạn. Hoạt động hoàn hảo cả trong FE và BE. – derhansen

+0

@derhansen thx, đó là điều đầu tiên bạn nhìn thấy khi googling, TBH, tôi hy vọng có giải pháp đơn giản cho một điều cơ bản ... như vậy, dù sao tôi có thể thấy tôi cần phải đào sâu hơn vào trong Helmut's poc. – biesior

Trả lời

13

Bạn cần thực hiện một số việc. Đây là issue on forge là nơi tôi nhận được thông tin và một số nội dung được lấy ra từ Helmut Hummels frontend upload example (và accompanying blogpost) mà @derhansen đã nhận xét.

Tôi không hoàn toàn chắc chắn nếu đây là tất cả mọi thứ bạn cần, vì vậy hãy thêm mọi thứ. Điều này không sử dụng một TypeConverter, mà bạn có lẽ nên làm. Điều đó sẽ mở ra các khả năng hơn nữa, ví dụ nó sẽ dễ dàng thực hiện việc xóa và thay thế các tham chiếu tệp.

Bạn cần phải:

  • Tạo một đối tượng tham chiếu tập tin FAL từ đối tượng tập tin. Điều này có thể được thực hiện bằng cách sử dụng nhà máy tài nguyên FALs.
  • Wrap nó trong một \TYPO3\CMS\Extbase\Domain\Model\FileReference (phương pháp ->setOriginalResource)
  • EDIT: Bước này là không cần thiết như của Typo3 6.2.11 và 7.2, bạn có thể trực tiếp sử dụng lớp \TYPO3\CMS\Extbase\Domain\Model\FileReference.

    Tuy nhiên, vì mô hình extbase bỏ sót một trường ($uidLocal) trong 6.2.10rc1, điều đó sẽ không hoạt động. Bạn cần kế thừa từ mô hình extbase, thêm trường đó và điền vào nó. Đừng quên thêm ánh xạ trong TypoScript để ánh xạ mô hình của riêng bạn tới sys_file_reference.

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

    Lớp sẽ trông như thế này (lấy từ các vấn đề giả mạo):

    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(); 
         } 
        } 
    
  • Thêm phần này vào TCA của lĩnh vực hình ảnh, trong config-phần (thích ứng với bảng của bạn và tên trường tất nhiên):

    'foreign_match_fields' => array(
        'fieldname' => 'photo', 
        'tablenames' => 'tx_zoo_domain_model_animal', 
        'table_local' => 'sys_file', 
    ), 
    
  • EDIT: Sử dụng \TYPO3\CMS\Extbase\Domain\Model\FileReference trong bước này nếu trên Typo3 6.2.11 hoặc 7.2 hoặc ab ove.

    Vì vậy, cuối cùng thêm tạo $fileRef thay vì $fileObject

    $fileRef = GeneralUtility::makeInstance('\Zoo\Zoo\Domain\Model\FileReference'); 
    $fileRef->setOriginalResource($fileObject); 
    
    $animal->addPhoto($fileRef); 
    
  • Đừng nói cho ai biết những gì bạn đã làm.

+0

Jost, ok, tôi sẽ không nói với bất kỳ ai;) Cuối cùng tôi nhận ra rằng tôi hoàn toàn bỏ qua TypeConverters trong quá khứ. – biesior

+0

#đối với câu hỏi của bạn và #Cho câu trả lời của bạn lưu ngày của tôi. Tôi đã làm theo tất cả các bước, tạo FileRefence.php tập tin mới theo mô hình của tôi. Tất cả mọi thứ đang làm việc sau khi loại bỏ typo3temp;) Tôi cũng phải thay đổi phương pháp thiết lập của tôi trong mô hình. Cảm ơn cả hai quý ông :) –

+0

Thực ra nó đã cứu ngày của tôi một lần nữa ngày hôm qua;) – biesior

0

Dưới đây là chức năng hoàn chỉnh để tải lên tập tin trong Typo3 sử dụng FAL và tạo 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');

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

+0

Cảm ơn bạn đã chia sẻ! Tôi nhận được lỗi 'Lỗi nghiêm trọng: Gọi hàm thành viên writelog() trên null trong /var/www/typo3_src-7.6.15/typo3/sysext/core/Classes/DataHandling/DataHandler.php trên dòng 8138' và tìm thấy sau vấn đề về giả mạo TYPO3: https://forge.typo3.org/issues/75805. Tôi đang làm điều gì đó sai, hay tại sao điều này lại có ích cho bạn chứ không phải cho tôi? :-) – chris

0

Ví dụ này không xứng đáng một giải thưởng sắc đẹp nhưng nó có thể giúp bạn. Nó hoạt động trong 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)); 
} 
Các vấn đề liên quan