Symfony嵌入子控制器的联系表单提交后如何显示成功/错误提示
解决方案
你当前的场景不需要使用flash消息,直接通过控制器传递提交状态到表单自身的渲染模板即可实现需求,无需上层ContentController参与。
第一步:修改ContactController.php
在原有逻辑中新增提交状态和提示消息变量,渲染模板时传递给表单模板:
public function contactForm(Request $request, \Swift_Mailer $mailer) { $contactForm = new ContactForm(); $form = $this->createForm(ContactFormType::class, $contactForm); $form->handleRequest($request); // 新增状态变量 $status = null; $message = ''; if ($form->isSubmitted() && $form->isValid()){ // 建议开启校验 $message = (new \Swift_Message) ->setFrom($contactForm->getEmail()) ->setTo('mail') ->setSubject("Kontaktformular - ". $contactForm->getFirstname() ." ". $contactForm->getLastname()) ->setBody($contactForm->getMessage()) ; if ($contactForm->getHonigtopfRoboter() == "") { try { $mailer->send($message); $this->confirmationMail($mailer, $contactForm->getEmail()); // 重置表单 unset($contactForm); unset($form); $contactForm = new ContactForm(); $form = $this->createForm(ContactFormType::class, $contactForm); // 赋值成功状态 $status = 'success'; $message = '消息提交成功,我们已向您的邮箱发送确认邮件,会尽快与您联系。'; } catch (\Swift_TransportException $Ste){ // 赋值失败状态 $status = 'error'; $message = '消息发送失败,请稍后重试,或直接通过其他联系方式联系我们。'; } } else { // honeypot触发,可根据需求设置状态或不处理 $status = 'error'; $message = '提交失败,请重试。'; } } return $this->render('form/contactForm.html.twig', [ 'contactform' => $form->createView(), 'submitStatus' => $status, 'submitMsg' => $message ]); }
第二步:修改form/contactForm.html.twig(表单的实际渲染模板)
在表单的上方/下方新增提示展示逻辑:
{# 提交提示 #} {% if submitStatus is not null %} <div class="alert {% if submitStatus == 'success' %}alert-success{% else %}alert-danger{% endif %}" style="padding: 10px; margin-bottom: 15px; border-radius: 4px;"> {{ submitMsg }} </div> {% endif %} {# 原有表单渲染代码 #} {{ form_start(contactform) }} {# 你的表单字段渲染 #} {{ form_widget(contactform) }} <button type="submit">提交</button> {{ form_end(contactform) }}
如果你使用Bootstrap框架,自带的alert、alert-success、alert-danger类可以直接生效,无框架的话自行补充对应CSS样式即可。
效果说明
- 提交成功:控制器已重置表单,页面会展示成功提示,表单内容清空
- 提交失败:表单不会重置,自动保留用户已填写的所有内容,同时展示错误提示
- 所有逻辑仅在表单组件内部完成,不需要修改上层default.html.twig或ContentController的任何代码,完美适配你嵌入式渲染的场景
内容的提问来源于stack exchange,提问作者Kjenos
相关产品推荐
相关产品推荐

