我使用解釋爲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數組來檢索表單中的數據到控制器,但我遇到了這些問題:
當我提交表單時,顯然第一個文件後面的值無效。
當我只提交一個文件(沒有驗證錯誤)時,控制器中的轉儲($文件)向我顯示一個空數組,無論如何。
任何幫助將不勝感激=)不要猶豫,如果你認爲需要更多的代碼請求。
謝謝!
現在我輸入文件名 「multiple_files [文件] [索引]」。這是爲什麼我的控制器中的$ files數組是空的? 我應該改變這些名稱與一些JavaScript來添加「_form」,這是缺少的? 另外我意識到我的AddFileType在他目前的狀態下是無用的,但我真的不明白如何使用它或FileType會導致錯誤:/ – abernard
是的,它可能肯定是$ data爲空的原因,可能有另一個原因,但這似乎是一個好的。 AddFileType可能會導致錯誤,因爲您在預期的數據數組中添加了一層嵌套。使用AddFileType,您需要使用「multiple_files_form [files] [INDEX] [file]」提交輸入 – Terenoth
所以,我做了這個改變。當我的名字是「multiple_files_form [files] [INDEX]」時,它也不起作用。當我提交表單時,控制器不再進入'if($ form-> isSubmitted()&& $ form-> isValid())'條件。 – abernard