2

1 つのアクションで 2 つのフォームを作成していますが、これらのフォームは jquery ajax によって他の 2 つのアクションに送信されます。さて、問題は - 最初のフォームのみが機能することです。編集フォームは、csrf トークンが無効であることをスローします。なぜそれが起こっているのですか?私のコード:

フォームの作成:

$project = new Project();
      $addProjectForm = $this->createForm(new AddProjectType(), $project, [
        'action' => $this->generateUrl('tfpt_portfolio_versionhistory_addproject'),
        'method' => 'POST',
        'attr' => ['id' => 'newProjectForm']
      ]);
      $editProjectForm = $this->createForm(new EditProjectType(), $project, [
        'action' => $this->generateUrl('tfpt_portfolio_versionhistory_editproject'),
        'method' => 'POST',
        'attr' => ['id' => 'editProjectForm']
      ]);

送信編集フォームの処理 (ただし、追加フォームはほとんど同じです):

$project = new Project();
      $form = $this->createForm(new EditProjectType(), $project);

      $form->handleRequest($request);
      if($form->isValid()){
        //handle form
      }
}

これら 2 つのフォームの唯一の違いは、編集フォームにはもう 1 つのフィールド (非表示の ID) があることです。どちらも次のように jquery によって送信されます。

var form = $("#editProjectForm")
            if(form.valid()){
                $("#loader").show();
                $.ajax({
                    type: form.attr('method'),
                    url: form.attr('action'),
                    data: form.serialize()
                }).done(function(data){
                       //result
                            }
                        });

そして、私はそのようなフォームを表示します:

 {{ form_start(editProjectForm) }}
 {{ form_errors(editProjectForm) }}
 {{ form_widget(editProjectForm.name) }}
 {{ form_widget(editProjectForm.id) }}
 {{ form_rest(editProjectForm) }}
 {{ form_end(editProjectForm) }}

誰かが私の間違いを指摘できますか?1回のアクションで3つのフォームを埋め込むことはできませんか? または、別の方法で CSRF を生成する必要がありますか?

@Edit: symfony を最新のリリースに更新したところ、完全に動作するようになりました。このバージョンにはバグがあったか、ベンダーのコードが不足しているようです。とにかく、問題は解決しました。

4

1 に答える 1