2016-07-04 68 views
0

我使用解釋爲here的方法來實現多個文件上傳,但是找不到使其工作的方法。我知道已經有很多關於它的問題,但我無法爲我的案子找到合適的答案。Symfony2非映射collectionType不起作用

請注意,由於具有Name,Content和Type屬性的文件實體,我將文件的內容存儲在數據庫中。 但是爲了使它工作,我沒有將表單映射到這個實體。

所以,我的控制器看起來是這樣的:

$files = []; 

    $form = $this->createForm(MultipleFilesType::class, []); 

    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 

     $files = $form->getData(); 

     dump($files); 

     foreach ($files as $file) 
     { 
      //code that stores the file in the database which works fine and is not relevant to my problems I think 
     } 
     return // redirect to some page 
    } 

    return //form to the view 

我MultipleFilesType是嵌入多個addFileType集合:

class MultipleFilesType extends AbstractType 
{ 
/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('files', CollectionType::class, array (
      'entry_type' => addFileType::class, 
      'allow_add' => true, 
      'allow_delete' => true, 
      'label' => false, 
      'mapped' => false, 
      'data' => array(
       array ('file' => null) 
      ) 
     )) 
    ; 
} 
} 

和我addFileType是這樣的:

class AddFileType extends AbstractType 
{ 


/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('file', FileType::class, array (
      'label' => false 
     )) 
    ; 

} 
} 

在我的觀點是我可以添加/刪除字段,感謝鏈接文檔中解釋的一些JQuery。 (代碼與doc中的代碼大致相同,只是我沒有使用Entites,所以我沒有在這裏展示它)。

我第一次嘗試單個文件上傳,它很好地工作,然後我嘗試了上面的代碼,使用collectionType和$ files數組來檢索表單中的數據到控制器,但我遇到了這些問題:

當我提交表單時,顯然第一個文件後面的值無效。

當我只提交一個文件(沒有驗證錯誤)時,控制器中的轉儲($文件)向我顯示一個空數組,無論如何。

任何幫助將不勝感激=)不要猶豫,如果你認爲需要更多的代碼請求。

謝謝!

回答

0

而不是

$files = $form->getData(); 

$files = $form->get("files")->getData(); 
1

AddFileType是無用的,並打破您的表單映射。在您的MultipleFileType中直接使用FileType

然後,對於你的其他錯誤,它主要取決於你的JavaScript和你的實體。

客戶端,您需要提交名爲「multiple_file_form [files] [INDEX]」的每個文件,其中INDEX是列表中每個文件的索引。要做到這一點:

  • 如果您提交同步(通過提交按鈕和form標籤),有<input type="file" name="multiple_files_form[files][INDEX]">輸入標籤
  • 如果你的表格是異步提交(通過AJAX),您的請求參數必須像一個數組這樣的:

    { 
        "multiple_files_form": { 
         "files": [ 
          // Your files here... 
         ] 
        } 
    } 
    
+0

現在我輸入文件名 「multiple_files [文件] [索引]」。這是爲什麼我的控制器中的$ files數組是空的? 我應該改變這些名稱與一些JavaScript來添加「_form」,這是缺少的? 另外我意識到我的AddFileType在他目前的狀態下是無用的,但我真的不明白如何使用它或FileType會導致錯誤:/ – abernard

+1

是的,它可能肯定是$ data爲空的原因,可能有另一個原因,但這似乎是一個好的。 AddFileType可能會導致錯誤,因爲您在預期的數據數組中添加了一層嵌套。使用AddFileType,您需要使用「multiple_files_form [files] [INDEX] [file]」提交輸入 – Terenoth

+0

所以,我做了這個改變。當我的名字是「multiple_files_form [files] [INDEX]」時,它也不起作用。當我提交表單時,控制器不再進入'if($ form-> isSubmitted()&& $ form-> isValid())'條件。 – abernard