2016-07-04 6 views
0

hereの方法を使用して複数のファイルを実装していますが、動作させる方法が見つかりません。私はすでにそれについて多くの質問があることを知っていますが、私は私の場合に適切な答えを見つけることができませんでした。symfony2マッピングされていないコレクション型が動作しない

名前、コンテンツ、およびタイプの属性を持つファイルエンティティのおかげで、ファイルのコンテンツをデータベースに格納していることに注意してください。 しかし、それを機能させるために、私はこのエンティティにフォームをマッピングしていません。

だから、私のコントローラは次のようになります。

$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のおかげでフィールドを追加/削除することができます。 (コードはドキュメントのものとほぼ同じですが、私はEntitiesで作業していないので、ここでは示しません)。

最初に単一ファイルのアップロードを試みましたがうまくいきました。そして、上記のコードを試みました。コレクションタイプと$ファイル配列を使用してフォームからコントローラにデータを取得しましたが、 :

フォームを送信すると、明らかに最初のファイルの後のファイルの値が無効になります。

私は1つのファイルのみを提出すると(検証エラーなし)、コントローラーのダンプ($ファイル)は空の配列を表示します。

何か助けていただければ幸いです。必要と思われる場合は、もっと欲しいと思ってください。

ありがとうございました!

答えて

0

代わりの

$files = $form->getData(); 

今、私の入力ファイルは名前 "multiple_files [ファイル] [INDEX]" を持っているため、それは

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

AddFileTypeは、フォームマッピングを壊してしまいます。 MultipleFileTypeに直接FileTypeを使用してください。

他の間違いのため、主にJavaScriptとエンティティによって異なります。

クライアント側では、「multiple_file_form [files] [INDEX]」という名前の各ファイルを送信する必要があります。ここで、INDEXはリスト内の各ファイルのインデックスです。そのためには:あなたは、(ボタンとformタグを提出使用して)同期提出フォームは(AJAXを通じて)非同期的に送信された場合<input type="file" name="multiple_files_form[files][INDEX]">入力タグ

  • をお持ちの場合は

    • することは、あなたのリクエストパラメータのような配列でなければなりませんこの:

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

    ました。コントローラの$ files配列が空であるのはなぜですか? 私はいくつかのjavascriptでこれらの名前を変更して "_form"を追加するべきですか? また、自分の現在の状態でAddFileTypeが役に立たないことを認識していますが、代わりにFileTypeを使用すると間違いを起こすことはありません。/ – abernard

    +1

    $データが空である可能性があります。理由はありますが、これは良いようです。 AddFileTypeは、予想されるデータ配列にネスティングのレベルを追加するため、間違いを招く可能性があります。 AddFileTypeでは、 "multiple_files_form [ファイル] [INDEX] [ファイル]" – Terenoth

    +0

    と入力を提出する必要がありますので、私はこの変更を行いました。私の名前が '' multiple_files_form [files] [INDEX] ''であるときは、どちらもうまくいきません。フォームを送信すると、コントローラは 'if($ form-> isSubmitted()&& $ form-> isValid())'状態になりません。 – abernard

    関連する問題