2016-07-04 10 views
0

Ich verwende die Methode here implementiert, um mehrere Datei-Upload zu implementieren, aber es kann keinen Weg finden, um es funktionieren zu lassen. Ich weiß, dass es schon viele Fragen darüber gibt, aber ich konnte keine passende Antwort für meinen Fall finden.Symfony2 nicht gemappte collectionType funktioniert nicht

Beachten Sie, dass ich den Inhalt der Datei in der Datenbank speichern, dank einer Datei Entity mit Name, Inhalt und Typ Attribute. Um es jedoch funktionieren zu lassen, kartiere ich das Formular nicht auf diese Entität.

Also, mein Controller sieht wie folgt aus:

$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 

Meine MultipleFilesType ist die Sammlung, die mehrere addFileType einbetten:

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) 
      ) 
     )) 
    ; 
} 
} 

und meine addFileType ist dies:

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 
     )) 
    ; 

} 
} 

In Meine Ansicht Ich kann Felder hinzufügen/entfernen dank einiger JQuery in der verknüpften Dokumentation erklärt. (Der Code ist mehr oder weniger der gleiche wie der im Dokument, außer dass ich nicht mit Entitys arbeite, also zeige ich es hier nicht).

Ich versuchte zuerst, einzelne Dateiuploads zu machen, was gut funktionierte, und dann habe ich den obigen Code ausprobiert, mit dem collectionType und einem $ files -Array die Daten vom Formular an den Controller abzurufen, aber ich habe diese Probleme :

Wenn ich das Formular abschicke, sind anscheinend die Werte der Dateien nach dem ersten nicht gültig.

Wenn ich nur eine Datei übergebe (kein Validierungsfehler), zeigt der Dump ($ files) im Controller mir ein leeres Array an, egal was passiert.

Jede Hilfe würde geschätzt werden =) Zögern Sie nicht, nach mehr Code zu fragen, wenn Sie denken, dass es benötigt wird.

Vielen Dank!

Antwort

0

Statt

$files = $form->getData(); 

es war

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

AddFileType ist nutzlos und bricht Ihre Formularzuordnung. Verwenden Sie direkt FileType in Ihrem MultipleFileType.

Dann, für Ihre anderen Fehler, hängt es hauptsächlich von Ihrem JavaScript und Ihren Entitäten ab.

Clientseitig müssen Sie jede Datei mit dem Namen "multiple_file_form [files] [INDEX]" übergeben, wobei INDEX der Index jeder Datei in der Liste ist.Um dies zu tun:

  • Wenn Sie synchron einreichen (Senden mit der Taste und form-Tag), haben <input type="file" name="multiple_files_form[files][INDEX]"> Eingang-Tags
  • Wenn Ihr Formular asynchron abgegeben wird (über AJAX), Ihre Anfrage Parameter muss ein Array sein wie dies:

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

Vorerst meine Eingabedateien haben den Namen "multiple_files [Dateien] [INDEX]". Ist das mein $ files array in meinem Controller leer? Sollte ich nur diesen Namen mit etwas Javascript ändern, um die "_form" hinzuzufügen, die fehlt? Auch ich merke, dass mein AddFileType in seinem aktuellen Zustand nutzlos ist, aber ich verstehe nicht wirklich, wie es stattdessen verwendet oder FileType würde zu Fehlern führen:/ – abernard

+1

Ja kann es definitiv der Grund sein, dass $ Daten leer ist, könnte es einen anderen geben Grund, aber das scheint ein guter zu sein. AddFileType kann zu Fehlern führen, da Sie eine Schachtelungsebene in dem erwarteten Datenarray hinzufügen. Mit AddFileType müssten Eingaben mit "multiple_files_form [files] [INDEX] [file]" – Terenoth

+0

gesendet werden. Also habe ich diese Änderung vorgenommen. Wenn meine Namen "multiple_files_form [files] [INDEX]" sind, funktioniert das auch nicht. Der Controller geht nicht mehr in die Bedingung 'if ($ form-> isSubmitted() && $ form-> isValid()) ', wenn ich das Formular absende. – abernard