问题:如何在不刷新页面的情况下验证表单并在模式框中返回验证消息。
我刚刚开始学习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]);
}
答案 0 :(得分:0)
1 - 在你的newAction中,只需创建表单并将视图(createView)传递给你的模板。
2 - 编写一个ajaxFormHandlerAction,在这里创建表单,处理它,验证它,在变量中呈现一个视图: $ html = $ this-&gt; renderView(&#39; yourTemplate.html.twig&#39;,array($ form-&gt; createView())); 编辑:当然你的ajax必须将表单发布到你新的ajax网址... END编辑
3 - 如果已经过验证 返回一个JsonResponse(数组(&#39; html&#39; =&gt; $ html,&#39; status&#39; =&gt;&#39;错误&#39;)); 如果有效 返回一个JsonResponse(数组(&#39; status&#39; =&gt;&#39;成功&#39;));
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
}
},
您必须创建一个仅包含模态的树枝模板...