[英]Form Validation in symfony from ajax call
我需要通過ajax存儲來自symfony表單的數據,而不是更新瀏覽器。 此外,我需要你,如果字段中的錯誤可以某種方式讓他們響應該調用Ajax並顯示我的表單錯誤,所有這些都沒有刷新頁面。
我有一個帶有symfony資產的表單來驗證字段,如果執行ajax調用,將所有內容都完美,存儲數據或更新顯示錯誤的頁面,但我需要相同而不刷新頁面。
然后我把一些我正在使用的代碼:
控制器:
public function createAction(Request $request)
{
$entity = new Student();
$form = $this->createCreateForm($entity);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('student_show', array('id' => $entity->getId())));
}
return $this->render('BackendBundle:Student:new.html.twig', array(
'entity' => $entity,
'form' => $form->createView(),
));
}
ajax調用:( 我不明白如何處理錯誤部分)
$('.form_student').submit(function(event) {
event.preventDefault();
$.ajax({
type: 'POST',
url: Routing.generate('student_create'),
data: $(this).serialize(),
success: function(data) {
//clean form
cleanForm($(this));
//show success message
$('#result').html("<div id='message'></div>");
$('#message').html("<h2> student created</h2>").hide();
$('#message').fadeIn('slow').delay(5000).fadeOut('slow');
event.stopPropagation();
},
error: function (xhr, desc, err)
{
alert("error");
}
})
return false;
});
我已經看到一些從控制器返回一個JsonResponse並使用Ajax,但我從Ajax開始,我不知道如何使用它。 然后我把我的意思代碼:
if ( $request->isXmlHttpRequest() ) {
if ($form->isValid()) {
//...
return new JsonResponse(array('message' => 'Success!'), 200);
}
$response = new JsonResponse(array(
'message' => 'Error',
'form' => $this->renderView('BackendBundle:student:new.html.twig',
array(
'entity' => $entity,
'form' => $form->createView(),
))), 400);
return $response;
}
如果你能幫我理解更多如何使用Ajax來解決這個問題,我會永遠感激,因為對於我看過的許多手冊,我仍然不太了解它。
非常感謝你提前。
我可以與您分享我在舊項目中使用的自定義解決方案,用於通過ajax調用提交的表單上的管理錯誤。
在控制器動作中:
....
if ( $request->isXmlHttpRequest() ) {
if (!$form->isValid()) {
return array(
'result' => 0,
'message' => 'Invalid form',
'data' => $this->getErrorMessages($form)
);
// Do some stuff
return array(
'result' => 1,
'message' => 'ok',
'data' => ''
}
}
// Generate an array contains a key -> value with the errors where the key is the name of the form field
protected function getErrorMessages(\Symfony\Component\Form\Form $form)
{
$errors = array();
foreach ($form->getErrors() as $key => $error) {
$errors[] = $error->getMessage();
}
foreach ($form->all() as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
return $errors;
}
並且js代碼類似於:在客戶端:
$.ajax({
url: ...,
data: ....,
type: "POST",
success: function(data) {
if(data.result == 0) {
for (var key in data.data) {
$(form.find('[name*="'+key+'"]')[0]).before('<ul class="errors"><li>'+data.data[key]+'</li></ul>');
}
} else {
// Submit OK
}
}
});
希望這個幫助
在通過ajax提交表單時,實際上有一種更簡單的方法來呈現表單驗證錯誤。 上述答案都要求您手動將錯誤消息附加到正確的字段等。
既然這個問題已經過時了,那么對於那些來這里遇到類似問題的人,我會從你的具體案例中略微概括一下:
在控制器中,如果它不驗證,您只需返回渲染的表單:
public function createAction(Request $request)
{
$form = $this->createForm(StudentType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && !$form->isValid()) {
return $this->render('new.html.twig', [
'form' => $form->createView(),
]);
}
// ...
}
然后在你的ajax調用中,你可以獲取返回的html(包括任何驗證錯誤消息)並將其重新插入到表單中。 下面我只替換表單的內容,因此附加到表單本身的任何處理程序都保持不變。
$.ajax({
url: ...,
data: ....,
type: "POST",
success: function(data) {
if(!data.success) { // undefined here, set to true in controller the form is valid
var innerHTML = $(data).find('#appbundle_student').html();
$('#appbundle_student').html(innerHTML);
} else {
// Submit OK
}
}
});
使用symfony 3和錯誤驗證器,您可以解析Ajax請求,如下所示:
/**
* Create new student (ajax call)
* @Method("POST")
* @Route("/student/create", name"student_create")
* @param Request $request
* @return JsonResponse
*/
public function createAction(Request $request)
{
$student = new Student();
$form = $this->createForm(CreateStudentType::class, $student);
$form->handleRequest($request);
$errors = array();
if ($form->isSubmitted()) {
$validator = $this->get('validator');
$errorsValidator = $validator->validate($student);
foreach ($errorsValidator as $error) {
array_push($errors, $error->getMessage());
}
if (count($errors) == 0) {
$em = $this->getDoctrine()->getManager();
$em->persist($student);
$em->flush();
return new JsonResponse(array(
'code' => 200,
'message' => 'student toegevoegd',
'errors' => array('errors' => array(''))),
200);
}
}
return new JsonResponse(array(
'code' => 400,
'message' => 'error',
'errors' => array('errors' => $errors)),
400);
}
和jquery ajax
$("#createForm").submit(function(e) {
e.preventDefault();
var formSerialize = $(this).serialize();
var url = location.origin + '/web/app_dev.php/student/create';
$.ajax({
type: "POST",
url: url,
data: formSerialize,
success: function (result) {
console.log(result);
if (result.code === 200) {
// refresh current url to see student
} else {
}
}
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.