2013-10-23 5 views
2

하나의 작업에서 2 개의 양식을 만들고이 양식을 jquery ajax에서 다른 2 개의 작업으로 제출합니다. 이제 문제는 첫 번째 양식 만 작동한다는 것입니다. 양식을 편집하면 해당 csrf 토큰이 유효하지 않습니다. 왜 그런 일이 일어나는거야? 내 코드 :symfony2 양식 유형을 사용하는 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 
     } 
} 

이 두 형태 사이의 유일한 디퍼 런스 세라마이드는이 그 편집 양식입니다 한 번 더 필드 - 숨겨진 ID.

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

을 그리고 난 그런 형태의 표시 : 모두 그렇게 JQuery와에 의해 작성

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

누군가가 내 실수를 지적 할 수 있습니까? 하나의 작업에 3 가지 양식을 포함시킬 수 있습니까? 아니면 CSRF를 다른 방식으로 생성해야합니까?

@ 편집 : 심포니를 최신 릴리스로 업데이트 했으므로 지금은 완벽하게 작동합니다. 이 버전이 버그가 있거나 벤더 코드가 부족한 것 같습니다. 어쨌든 문제가 해결되었습니다.

+0

잘 모르겠습니다. 3 가지 양식을 동시에보기에 보냅니 까? 컨트롤러 액션 코드는 어떻게 생겼습니까? – cheesemacfly

+0

예, 저는 그것을 (2 가지 형식으로)하고 있습니다. 내 질문은 내가 할 수 있는지에 관한 것이다. 그리고 그렇지 않은 경우 - 대안은 무엇입니까? 내 작업이 한 줄만 더 많았습니다. 그 형식의 배열 반환 – Nekromancer

답변

2

난 당신이 컨트롤러에 두 개의 토큰을 만들 수 있다고 생각 :

$token_add = $this->get('form.csrf_provider')->generateCsrfToken('add'); 

$token_edit = $this->get('form.csrf_provider')->generateCsrfToken('edit'); 

와 숨겨진 필드에서보기에 넣어. 그런 다음 양식을 처리하는 컨트롤러 작업에서 확인하십시오.

# Here you can validate the 'add' or 'edit' token 
if (!$this->get('form.csrf_provider')->isCsrfTokenValid('add', $token)) { 

    $respuesta = array('mensaje' => 'Oops! Invalid token.', 
         'token' => $token); 
    return new Response(json_encode($respuesta)); 
} 
+0

$ form-> isValid()에 의해 해당 토큰을 확인할 수있는 기회가 있습니까? – Nekromancer

+0

나는 예라고 생각한다! 어떤 문제가 있으면 알려주세요! – JGrinon

+0

내 문제는 Symfony2 코드 (편집 된 질문의 설명)로 인해 발생한 것 같습니다. 하지만 여전히 도움을 주셔서 감사합니다! :) – Nekromancer

관련 문제