2016-07-04 2 views
0

Я использую метод, описанный here, для реализации множественной загрузки файлов, но он не может найти способ заставить его работать. Я знаю, что в нем уже много вопросов, но я не мог найти подходящего ответа для моего дела.Symfony2 не привязанный к коллекции тип не работает

Обратите внимание, что я сохраняю содержимое файла в базе данных, благодаря файлу Entity с атрибутами 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, описанному в связанной документации. (Код более или менее совпадает с кодом в документе, за исключением того, что я не работаю с Entites, поэтому я не показываю его здесь).

Сначала я попытался сделать отдельные загрузки файлов, которые хорошо работали, а затем я попробовал вышеуказанный код, используя массив collectionType и $ files для извлечения данных из формы в контроллер, но у меня возникают эти проблемы :

Когда я отправляю форму, по-видимому, значения файлов после первого недействительны.

Когда я отправляю только один файл (нет ошибки проверки), дамп ($ files) в контроллере показывает мне пустой массив, несмотря ни на что.

Любая помощь будет оценена =) Не стесняйтесь спрашивать больше кода, если считаете, что это необходимо.

Спасибо!

ответ

0

Вместо

$files = $form->getData(); 

это

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

AddFileType бесполезен и разбивает вашу форму. Используйте непосредственно FileType в своем MultipleFileType.

Тогда для ваших других ошибок это зависит в основном от вашего JavaScript и ваших объектов.

На стороне клиента вам необходимо отправить каждый файл с именем «multiple_file_form [files] [INDEX]», где INDEX - индекс каждого файла в списке.Для этого:

  • Если вы передаете синхронно (с помощью кнопки и form тега Submit), имеют <input type="file" name="multiple_files_form[files][INDEX]"> входных тегов
  • Если форма отправлена ​​асинхронно (через AJAX), ваши параметры запроса должны быть массивом, как это:

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

На данный момент мои входные файлы имеют название "multiple_files [файлы] [INDEX]". Это почему мой массив $ 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

Смежные вопросы