Ajax中的Symfony2表单验证
Symfony2 form validation in Ajax
在某些页面上,我使用引导模式中的表单。我使用Ajax提交表单,并在控制器中进行验证。大多数用户都会正确填写表单,但如果验证失败,则会重新呈现表单并将其发送回用户。我一点也不喜欢这样,但我找不到更好的方法,因为我无法访问字段的验证错误。有人有更好的方法来实现JSON中返回的验证错误吗?
我自己创建了一个函数
public function getFormErrors(Form $form) {
$errors = $form->getErrors();
foreach ($form->all() as $child) {
foreach ($child->getErrors() as $key => $error) {
$template = $error->getMessageTemplate();
$parameters = $error->getMessageParameters();
foreach ($parameters as $var => $value) {
$template = str_replace($var, $value, $template);
}
$errors[$child->getName()][] = $template;
}
}
return $errors;
}
如果我理解正确,你有一个表单,你需要分别获得每个字段的错误。如果是,请查看''Symfony''Component''Form''Form::getErrorsAsString()&做同类的smth:
function getFormErrors($form)
{
$errors = array();
// get the form errors
foreach($form->getErrors() as $err)
{
// check if form is a root
if($form->isRoot())
$errors['__GLOBAL__'][] = $err->getMessage();
else
$errors[] = $err->getMessage();
}
// check if form has any children
if($form->count() > 0)
{
// get errors from form child
foreach ($form->getIterator() as $key => $child)
{
if($child_err = getFormErrors($child))
$errors[$key] = $child_err;
}
}
return $errors;
}
我认为最干净的解决方案是实现JMSSerializerBundle(http://jmsyst.com/bundles/JMSSerializerBundle)它使用以下类别:
https://github.com/schmittjoh/serializer/blob/6bfebdcb21eb0e1eb04aa87a68e0b706193b1e2b/src/JMS/Serializer/Handler/FormErrorHandler.php
然后在控制器中:
// ...
if ($request->isXMLHttpRequest()) {
$jsonResponse = new JsonResponse();
$serializer = $this->container->get('jms_serializer');
$form = $serializer->serialize($form, 'json');
$data = array('success' => false,
'errorList' => $form);
$jsonResponse->setData($data);
return $jsonResponse;
}
我今天也有同样的问题!
我用ajax发送了表单,如果我的控制器没有向我发送json"OK",则会用控制器发送的包含错误的新表单刷新表单。当form->isValid()时发送数据"OK",否则返回表单呈现
HTML:
<div class="form_area">
<form id="myform" action.... >
...code form ...
</form>
</div>
控制器操作:
use Symfony'Component'HttpFoundation'JsonResponse;
public function myEditAction(){
.......
if ( $request->getMethod() == 'POST' ) {
$form->bind($request);
if ($form->isValid()) {
... code whn valide ...
if ( $request->isXmlHttpRequest() ) {
return new JsonResponse('OK');
}
}
}
return $form;
}
JS:
$('#myform').on('submit',function(e){
var formdata = $('#myform').serialize();
var href = $(this).attr('action');
$.ajax({
type: "POST",
url: href,
data: formdata,
cache: false,
success: function(data){
if(data != "OK") {
$('.form_area').html(data);
}
},
error: function(){},
complete: function(){}
});
return false;
});
相关文章:
- JAVASCRIPT验证表单中的日期
- 如何在使用ajax提交的codeigniter中使用form_validation验证表单数据
- 如何使用jQuery正确验证表单
- Javascript不会验证表单
- 如何使用javascript验证表单中的数据,然后调用php页面
- 包括来自另一个页面的Boostrap模态;t验证表单
- Javascript验证表单不重定向页面
- 在提交之前验证表单,jQuery发布到javaScript,然后提交到确认页面
- 引导复选框-x 选中时未正确更新 DOM - 如何验证表单
- Jquery 验证表单
- 验证表单中的 jQuery-UI 微调器
- 在 Jquery 中验证表单的输入字段
- 如何验证表单控制数据大小不超过2.5 mb
- 在表单进入Angular中的ng-submit之前验证表单
- Javascript表单验证:表单在错误返回时提交:
- 使用Angular.js验证表单输入的原始状态
- 正在复制验证表单
- 如何在转盘中逐步(3步)验证表单
- 使用javascript验证表单值
- 验证表单按id输入val