Symfony2: The CSRF token is invalid. Please try to resubmit the form

匿名 (未验证) 提交于 2019-12-03 02:16:02

问题:

I have a form wher I have to fill in some information in a field. Even if I put something inside, I am getting the error:

The CSRF token is invalid. Please try to resubmit the form 

Related to this question: symfony2 CSRF invalid I am using correctly the $form->bindRequest()

if ($this->getRequest()->getMethod() == 'POST') {    $form->bindRequest($this->getRequest());    if ($form->isValid())     {        ...    } 

Here is my template (twig) code:

<div class="item item-last"> <h1>Create Affiliation</h1>  {% if valid == false %}     <div class="error">         {{ form_errors(form) }}         {{ form_errors(form.affiliation) }}         {{ error }}     </div> {% endif %} {% if app.session.flash('user-notice') != '' %} <div class="flash-notice">     {% autoescape false %}     {{ app.session.flash('user-notice') }}     {% endautoescape %} </div> {% endif %}  </div> <div class="item item-last"> <form action="{{ path('SciForumVersion2Bundle_user_submission_affiliation_create', {'hash_key' : submission.hashkey, 'author_id' : author.id }) }}?ajax=no" method="POST" class="authorForm" {{ form_enctype(form) }}>     <div style="float:left;">         <table width="100%" cellspacing="0" cellpadding="0">             <tr>                 <td>                     {{ form_label(form.affiliation) }}                 </td>                 <td>                     {{ form_widget(form.affiliation, { 'attr': {'size': 40} }) }}                 </td>             </tr>             <tr>                 <td>                     &nbsp;                 </td>                 <td>                     <div class="button button-left button-cancel">                         <img src="{{ asset('bundles/sciforumversion2/images/design/new/button-red.png') }}"/>                         <a href="{{ path('SciForumVersion2Bundle_user_submission_author_edit', { 'hash_key' : submission.hashkey, 'author_id' : 0 }) }}" class="submission_link">cancel</a>                     </div>                     <div style="float: left;">&nbsp;</div>                     <div class="button button-left button-cancel">                         <img src="{{ asset('bundles/sciforumversion2/images/design/new/button.png') }}"/>                         <input type="submit" name="login" value="submit" />                     </div>                     <div style="clear: both;"></div>                 </td>             </tr>         </table>     </div> {{ form_rest(form) }}  </form> </div> 

And here is the js code:

function init_submission_functions() {  init_fck();  $(".submission_link").unbind("click").bind("click", function() {      var href = $(this).attr("href");     if( href == null || href == '' ) return false;      $.ajax({         type: "POST",         async: true,         url: href,         cache: false,         dataType: "json",         success: function(data) {              $("#content .contentwrap .itemwrap").html( data.content );             init_submission_functions();         }     });      return false; });  $(".authorForm").unbind("submit").bind("submit", function() {      var href = $(this).attr("action");     if( href == null || href == '' ) return false;      var affiliation = "blabla";      $.ajax({         type: "POST",         async: true,         url: href,         affiliation: affiliation,         cache: false,         dataType: "json",         success: function(data) {              $("#content .contentwrap .itemwrap").html( data.content );             init_submission_functions();         }     });      return false; }); }   

But I am still getting the same error.

回答1:

Send a serialized form using the serialize jQuery method:

$form.submit(function (e) {     e.preventDefault();      $this = $(this);     $.post($this.attr('action'), $this.serialize(), function (response) {         // handle the response here     }); }); 

This way Symfony will handle the submit request as a normal request ― you don't have to do anything special to handle an Ajax form submission. All you'll need to do is to return a JsonResponse ― if you need it, of course.

Here is an example of handling the form ― adapt it to your needs:

if ('POST' === $request->getMethod()) {     $form->bind($request);      if ($form->isValid()) {         // do something here ― like persisting or updating an entity          return new JsonResponse([             'success' => true,         ]);     }      return new JsonResponse([         'success' => false,         'form' => $this->render($pathToTheTemplateHere, [             'form' => $form,         ],     ]); } 

The other way would be to use different templates: form.json.twig and form.html.twig ― read the docs for details.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!