问题:如何在不刷新页面的情况下验证表单并在模式框中返回验证消息。
我刚开始学习Symfony 3,但在使用AJAX添加数据时遇到了麻烦。
我知道如何在模态框内包含模板表单,但是我不知道如何在模态框内显示$ form-> isValid()的错误消息并将其持久化。
new.html.twig
更新:我现在可以在Controller中调用方法操作。但是,当我验证表单时,模态框内没有收到任何验证错误。
<script>
$(function () {
$('.withdropdown').dropdown();
$('.add-company-launch').modal();
$('#company-form').submit(function(e) {
var formUrl = "{{ path('monteal_backend_company_ajax') }}";
var formData = new FormData(this)
$.ajax({
url: formUrl,
type: 'POST',
data: formData,
contentType: false,
cache: false,
processData: false,
success: function(data, textStatus, jqXHR)
{
if(data['status'] === 'success'){
alert('success');
} else {
$('#add-company').html(data['html']);
}
},
error: function(jqXHR, textStatus, errorThrown)
{
}
});
e.preventDefault();
});
})
</script>
{%endblock%}
CompanyController.php
更新:我已经为AJAX创建了两种方法,
1.处理表格的方法。
2. AjaxHandler。
public function newAction() {
$company = new Company();
$form = $this->createForm(CompanyForm::class, $company);
return $this->render('Admin/Backend/Company/new.html.twig', array(
'form'=>$form->createView()
));
}
public function ajaxAction(Request $request) {
if (!$request->isXmlHttpRequest()) {
return new JsonResponse(array('message' => 'You can access this only using Ajax!'), 400);
}
$company = new Company();
$form = $this->createForm(CompanyForm::class, $company);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($company);
$em->flush();
return new JsonResponse(array(
'status' => 'success'), 200
);
}
$html = $this->renderView("Admin/Backend/Company/new.html.twig", array(
'form' => $form->createView())
);
return new JsonResponse(['status' => 'error', 'html' => $html]);
}
参考方案
1-在newAction中,只需创建表单并将视图(createView)传递到模板即可。
2-编写ajaxFormHandlerAction并在此处创建表单,对其进行处理,对其进行验证,在一个变量中呈现视图:
$ html = $ this-> renderView('yourTemplate.html.twig',array($ form-> createView()));
编辑:当然,您的ajax必须将表单发布到新的ajax url中。
3-如果未通过验证
返回一个JsonResponse(array('html'=> $ html,'status'=>'error'));
如果验证
返回一个JsonResponse(array('status'=>'success'));
4-在ajax成功回调中,如果状态错误,则呈现新表单。
如果状态成功,重定向或其他
希望有帮助
编辑:
对于您的控制者来说是这样的:
use Symfony\Component\HttpFoundation\JsonResponse;
public function ajaxFormHandlerAction(Request $request)
{
$company = getYourCompany(); //get it from db?
$form = $this->createForm(CompanyForm::class, $company));
$form ->handleRequest($request);
if($form ->isValid()){
//do whatever you want, maybe persist, flush()
return new JsonResponse(array(
'status' => 'success'));
}
$html = $this->renderView("yourModalTemplate.html.twig", array('form' => $form->createView()));
return new JsonResponse(['status' => 'error', 'html' => $html]);
}
在成功的ajax回调中:
success: function(data, textStatus, jqXHR)
{
if(data['status'] === 'success'){
alert('success');
// maybe redirect the user ???
}else if(data['status' === 'error']){
$('#idOfYourModal').html(data['html']); //assuming you use jquery, or translate to javascript
}
},
您必须创建一个仅包含模态内部的树枝模板...
jQuery val函数在隐藏字段上不起作用? - javascript这是我的HTML代码:<div style='display:none;' id='allformid'> <div> <form action='#'> <input type='text' name='name' …
jQuery ajax发布电子邮件字段 - javascript我不确定为什么我无法发布电子邮件字段的内容,这是我的代码。<html> <head> <title></title> <script src="//code.jquery.com/jquery-1.11.2.min.js"></script> </head>…
Python返回jsonp自动完成 - javascript我正在使用devbridge https://www.devbridge.com/sourcery/components/jquery-autocomplete/的自动完成功能。我正在尝试在同一服务器内但在不同端口中获取json数据。所以我对跨域有问题。我已经尝试并阅读了有关此问题的许多不同方法,但是我无法设法解决它。所以我有一个python函数返回此:fo…
如何使HTML页面在加载时选择随机标题? - javascript我是Web开发的新手,似乎无法在此站点的任何地方找到此特定任务,只能找到与使用页面时动态更改有关的内容。基本上,我希望我的html文档中的标记内容在加载/刷新页面时始终是不同的;我想在JS中存储某种类型的字符串数组,并让页面在加载html时选择其中一个字符串插入标签中。这将导致每次我刷新页面时,选项卡上的标题都是不同的,除非再次刷新,否则不会更改。谁能指出我…
粗糙的Unicode->没有CLDR的语言代码? - javascript我在写字典应用。如果用户键入Unicode字符,我想检查该字符是哪种语言。例如字 - returns ['zh', 'ja', 'ko'] العربية - returns ['ar'] a - returns ['en', 'fr', …