ajax成功函数中的提交过程中不存在Twig变量



我有一个在POST中以ajax发送的表单,我检查该表单在我的控制器中是否有效,如果它有效,那么由于ajax成功功能,我会在userFormdiv中用另一个表单替换该表单。当我检查HTML代码时,第一个表单被第二个表单取代,并且它有Twig变量值​​在每个输入的"值"中。到目前为止一切都很好。

然后我想在jquery中自动提交第二个表单,但我在网络选项卡中有一个500错误:

变量"nom"不存在。

我不明白为什么在检查HTML代码时显示变量的内容时会出现此错误。。

我试图用JS而不是Twig变量定义每个输入的"值",但它也不起作用,尽管我没有500的错误。

我的主要观点:

<img src="{{ asset('loader/loader.gif', 'image_site') }}" alt="Loader" id="spinner" class="mt-30">
<div id="userForm">
{{ form_start(form, {'attr': {'class': 'contact-form user-form'}}) }}
{{ form_errors(form) }}
{{ form_widget(form.nom) }}
{{ form_errors(form.nom) }}
{{ form_widget(form.prenom) }}
{{ form_errors(form.prenom) }}
{{ form_widget(form.pays) }}
{{ form_errors(form.pays) }}
{{ form_widget(form.tel) }}
{{ form_errors(form.tel) }}
{{ form_widget(form.email) }}
{{ form_errors(form.email) }}
{{ form_widget(form.submit) }}
{{ form_end(form) }}
</div>
<script>
$(function () {
let registerForm = "{{ path('site_devenir_vip_ajax_payment_form') }}";
$("#spinner")
.hide();
$(document)
.on("submit", "form", function (e) {
e.preventDefault();
$.ajax({
url: registerForm,
type: "POST",
dataType: "json",
data: $(this)
.serialize(),
beforeSend: function () {
$("#spinner")
.show();
},
success: function (data) {
console.log(data);
if (data.code === "ok") {
$("#userForm").html(data.response);
$("#paymentForm")
.submit();
} else {
console.log(data);
}
},
complete: function () {
$("#spinner")
.hide();
},
error: function (jqXHR, status, error) {
},
});
});
});
</script>

控制器:

/**
* @Route("/{id<d+>?1}/{slug}", methods={"GET", "POST"}, name="show")
* @Security("is_granted('IS_AUTHENTICATED_ANONYMOUSLY')")
*/
public function show(Request $request, Offre $offre, $slug): Response
{
if ($offre->getSlug() !== $slug) {
return $this->redirectToRoute('site_devenir_vip_show', [
'id'   => $offre->getId(),
'slug' => $offre->getSlug(),
], Response::HTTP_MOVED_PERMANENTLY);
}
$utilisateur = new User();
$form = $this->createForm(UserType::class, $utilisateur);
$form->handleRequest($request);
$session = new Session(new NativeSessionStorage(), new AttributeBag());
$session->set('offre', $offre->getId());
return $this->render('site/pages/devenir_vip/show.html.twig', [
'form'  => $form->createView(),
'offre' => $offre,
]);
}
/**
* @Route("/load-payment-form", condition="request.isXmlHttpRequest()", name="ajax_payment_form", methods={"GET", "POST"})
*/
public function paymentForm(Request $request): Response
{
$utilisateur = new User();
$form = $this->createForm(UserType::class, $utilisateur);
$form->handleRequest($request);
if ($form->isSubmitted() === true) {
if ($form->isValid() === true) {
if ($request->getSession() === null) {
return new Response('Une erreur s'est produite pendant la récupération de l'offre.');
}
$offreSession = $request->getSession()->get('offre');
$offre        = $this->entityManager->getRepository(Offre::class)->find($offreSession);
$response = [
'code'     => 'ok',
'response' => $this->render('site/layout/partials/ajax/payment_form.html.twig', [
'nom'          => $utilisateur->getNom(),
'prenom'       => $utilisateur->getPrenom(),
'email'        => $utilisateur->getEmail(),
'tel'          => $utilisateur->getTel(),
'pays'         => $utilisateur->getPays(),
'accountId'    => $this->getParameter('app.payment.account_id'),
'abonnementId' => $offre->getAbonnementId(),
])->getContent(),
];
return new JsonResponse($response);
}
return new Response('Le formulaire comporte des erreurs.');
}
return $this->render('site/layout/partials/ajax/payment_form.html.twig');
}

payment_form.html.twig:

<form method="post" action="https://mywebsite.com/" id="paymentForm">
<input type="hidden" name="NOM" value="{{ nom }}">
<input type="hidden" name="PRENOM" value="{{ prenom }}">
<input type="hidden" name="EMAIL" value="{{ email }}">
<input type="hidden" name="TEL" value="{{ tel }}">
<input type="hidden" name="PAYS" value="{{ pays }}">
<input type="hidden" name="ID" value="{{ accountId }}">
<input type="hidden" name="ABONNEMENT" value="{{ abonnementId }}">
</form>

目前我被困在这条线上,因为我有一个500错误:

$("#paymentForm").submit();

我不明白你为什么要在收到用户表单后呈现付款表单?在您的控制器中,当用户注册时,您可以直接注册付款,而无需在前面传递。

所以,如果你想在前面也通过它,我在JsonResponse:中使用这个

$response = ['template' => $this->renderView('@your_template', ['form'=>$paymentForm])];
return new JsonResponse($response, JsonResponse::HTTP_OK);

此外,您还可以通过传递新的url:来附加第一个表单(用户)操作

$form = $this->createForm(UserType::class, $utilisateur, ['action'=> 'your_url', 'method' => 'POST');

在ajax提交表单中,您可以在不创建let registerForm的情况下获得表单url。

问题:let registerForm有一个路由名称site_devenir_vip_ajax_payment_form,您在控制器ajax_payment_form中的操作有名称前缀吗?

我可以帮你吗。

最新更新