You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:09:02