2014-11-05 122 views
4

我在Symfony2中有一个表单,我使用ajax进行了验证。这是所有的工作,我得到一个JSON与“全球”(全球错误),并在Ajax调用我的成功说明“田”(错误在这里每个字段):Symfony2 ajax表单验证在树枝中呈现错误

{"global":[],"fields":{"fos_user_registration_form_username":"Please enter a 
username","fos_user_registration_form_email":"Please enter an 
email","fos_user_registration_form_plainPassword_first":"Please enter a password"}} 

我的问题是:什么是从每个领域的视野中的“领域”呈现这些错误的最佳方式是什么?我渲染视图元素下面时,我确认的形式没有Ajax:

<div class="form-group"> 
    {{ form_label(form.xyz) }} 
    {{ form_widget(form.xyz) }} 
    {{ form_errors(form.xyz) }} 
</div> 

我怎么能注入现在的错误从我的JSON对象的“字段”列表中插入相应的

{{ form_errors(form.xyz) }} 

我很想听听您的想法和最佳实践。

问候。

回答

6

你可以通过Javascript/jQuery添加它们。

我有一个类似的情况,这是我的代码:

JS代码,在错误的情况下发布表单数据并显示错误消息。

$.ajax({ 

    url : $(this).attr('action') + ".json", 
    method : 'POST', 
    data : $(this).serialize(), 

}).done(function(data) { 

     // Code in case of success 

}).fail(function(jqXHR) { 

    $.each(jqXHR.responseJSON.errors.children, function(k, v) { 

     errorsText = ""; 

     if ((v.errors) && (v.errors.length > 0)) { 
      $.each(v.errors, function(n, errorText) { 
       errorsText += errorText; 
      }); 
      $('#form_'+k).tooltip('destroy'); 
      $('#form_'+k).tooltip({'title': errorsText});  
      $('#form_'+k).closest('div[class="form-group"]').addClass('has-error'); 
     } else { 
      $('#form_'+k).closest('div[class="form-group has-error"]').removeClass('has-error'); 
      $('#form_'+k).tooltip('destroy'); 
     } 

    }); 
} 

这是我的Json在出现错误的情况下。是标准的一个你,如果你使用FOSRestBundle

{ 
    "code":400, 
    "message":"Validation Failed", 
    "errors":{ 
     "children":{ 
     "name":{ 
      "errors":[ 
       "This value should not be blank." 
      ] 
     } 
     "email":{ 
      "errors":[ 
       "This value should not be blank." 
      ] 
     } 
     "privacy":{ 
      "errors":[ 
       "This value should not be blank." 
      ] 
     } 
     } 
    } 
} 

的HTML我的形式是

<form id="sfForm" action="/landingbuilder/landing/test_template" method="POST"> 

    <div class="form-group"> 
     <label class="control-label required" for="form_name">Name</label> 
     <input type="text" id="form_name" name="form[name]" required="required" class="form-control" /> 
    </div> 

    [..] 

</form> 

如果您需要更多的细节只是问

+0

您好,感谢这个答案。真的很有帮助。 我在控制器上发现了一个问题。我正在使用FosUserBundle RegistrationController。我已经覆盖它,并且将registerAction方法“最小化”为仅仅首先渲染空白注册表单。我已经将逻辑外包,以将表单验证为ajax请求的另一种方法。所以我的registerAction()创建一个空的用户对象,显示和呈现字段。然后在validateRegistrationAction()中创建另一个新的用户对象,并使用表单数据进行验证。这是正确的方式吗?问候。 – 2014-11-06 18:38:12

+0

好吧,这与你的第一个问题无关。如果您认为是正确的,请接受我的回复并发布新的回复。 – Hpatoio 2014-11-07 08:48:46

+0

嗨,我接受了你的回答。不,你错了,它是相关的。这是控制器发回我的json答案。我的建筑是正确的吗? – 2014-11-07 16:50:31