我有一个预约表格,一旦提交,您会收到对所填写数据的确认,确认中有一个按钮,按下该按钮后,应将数据插入数据库。
我的问题是,如何实现确认按钮以便插入?
我正在考虑做一个 if 语句,如下所示:
if ($form->isSubmitted() && $form->isValid()) {
}
在该 if 语句中,另一个 if 语句将检查确认按钮是否已提交,以便我可以使用实体管理器将其插入数据库中。
if ($form->isSubmitted() && $form->isValid()) {
if () {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($appointment);
$entityManager->persist($customer);
$entityManager->flush();
}
}
预约表格: 预约表格
确认模板: 确认模板
预约表格:
{% block body %}
<p>new appointment</p>
{{ form_start(form) }}
{{ form_widget(form) }}
<button class="btn">{{ button_label|default('Plan In') }}</button>
{{ form_end(form) }}
{% endblock %}
确认模板
{% block body %}
<p>confirm appointment</p>
<p>{{ customer_name }}</p>
<p>{{ customer_phone }}</p>
<p>{{ customer_email }}</p>
<hr>
<p>{{ barber_name }}</p>
<p>{{ treatment_name }}</p>
<p>{{ appointment_date|date('d-m-Y') }}</p>
<p>{{ appointment_time|date('H:i') }}</p>
<button class="btn">{{ button_label|default('Confirm') }}</button>
{% endblock %}
如果我的问题有任何困惑,请要求澄清,如果您认为有更好的方法来实现我想要实现的目标,请提出建议。
感谢任何帮助,提前致谢。
如果您的确认模板不是表单,则将数据发送到控制器的最佳方法可能是通过 Ajax 请求发送数据。单击按钮时,发送请求:
$('#button').click(function(e) {
// guetting all the data you want to send
$.ajax({
type: 'POST',
// url is the route of your controller action
url: url,
processData: true,
data: objectYouWantToSend
beforeSend: function(request) {console.log('sending someting');},
success: function (data) {
console.log("nailed it");
// some logic you want to do
},
error: function(xhr, textStatus, thrownError) {
console.log('ooops, sometin went wrong');
}
});
}
});
然后,在您的控制器中,您可以使用以下方式获取数据:
if($request->isXmlHttpRequest()) {
if($request->isMethod('POST')) {
// getting data from request
$data = $request->request;
// symfo logic you want to do
return new JsonResponse(array($status => $message));
}
}
我们可以在不使用
javascript
的情况下解决这个问题。
我们将通过将表单转发到确认操作来处理提交
/**
* @Route("/submit", name="form-submit")
*/
public function submitApp(){
if ($form->isSubmitted() && $form->isValid()) {
return $this->redirectToRoute('confirm',[form])
}
return $this->render('appo.html.twig', [
'form' => 'form',
]);
}
单击确认后,我们将保留该值。
/**
* @Route("/confirm", name="form-confirm")
*/
public function confirmApp()
{
if ($form->isSubmitted() && $form->isValid()) {
// if configrm is pressed
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($appointment);
$entityManager->persist($customer);
$entityManager->flush();
}
}
在视图中
{{ form_widget(myFieldName, { ‘disabled’:’disabled’ }) }}
显示受限形式的值
ReadOnly
如果您确实想在确认页面中实现自定义模板而不使用
form
,您可以从form
获取值,如下所示:
$data = $form->getData();
使用 setter 将值分配给您的对象,如下所示
$app = new Apportionment();
$app->setCustomer_name($form->get('customer_name')->getData());
如果按下确认键,则保留该值。
$entityManager->persist($appointment);
$entityManager->flush();
希望有帮助。
寻找最不引人注目的选项,我现在这样做..
url中有一个变量
action
。操作是“提交”或“确认”。如果表单是 POST,只需将其 POST 到带有 ?action=foo
: 的 url
{{ form_start(theform,{'action': path('theroute',{'action': action}) }}
在控制器中,我从 url 读取操作并将其传递回 twig 模板
$action = $request->query->get('action') ?? 'submit';
$form = $this->createForm($myclass,$myentity);
if ($form->isSubmitted() && $resform->isValid()) {
if ($action !== 'confirm') {
$action = 'confirm';
// do nothing else
} else {
// persist the submitted data
// .....
$this->addFlash('notice', 'Thanks a ton');
return $this->redirectToRoute('all_is_fine');
}
}
return $this->render('thepage.html.twig', [
'action' => $action,
'form' => $form,
]);
首次提交时,操作将不是是
confirm
,并返回到填写相同表格的同一页面,但现在操作将被确认。您可以将表单设置为看起来像确认信息(例如,将字段设置为只读)。第二次提交实际上会保留数据。
问题可能是您的表单包含一个提交按钮,您可能希望在提交阶段修改该按钮。我实际上从表单中删除了整个按钮(在 PHP 中),在 twig 中,我写了类似的东西
{% if action != 'confirm' %}
<button type="button" onclick="this.form.submit();">
Submit
</button>
{% else %}
<button type="button" onclick="this.form.submit();">
Confirm
</button>
{% endif %}