[英]Symfony2 form validation in Ajax
在某些頁面上,我使用bootstrap模式中的表單。 我使用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()&do smth of the kind:
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 ):
然后在你的控制器中 :
// ...
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;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.