在 Symfony 中提交并验证表单后确认表单

问题描述 投票:0回答:3

我有一个预约表格,一旦提交,您会收到对所填写数据的确认,确认中有一个按钮,按下该按钮后,应将数据插入数据库。

我的问题是,如何实现确认按钮以便插入?


我正在考虑做一个 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 %}

如果我的问题有任何困惑,请要求澄清,如果您认为有更好的方法来实现我想要实现的目标,请提出建议。

感谢任何帮助,提前致谢。

forms symfony twig symfony4
3个回答
0
投票

如果您的确认模板不是表单,则将数据发送到控制器的最佳方法可能是通过 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));

        }
}

0
投票

我们可以在不使用

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();

希望有帮助。


0
投票

寻找最不引人注目的选项,我现在这样做..

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 %}
        
© www.soinside.com 2019 - 2024. All rights reserved.