一页中有两种形式

时间:2018-10-01 15:11:01

标签: php forms symfony email twig

伙计们,我在同一页面上有两次相同的表单(我试图阅读很多具有相同问题的问题,但是并不能解决我的问题...)我的问题是当我发送一种发送表单时另一个也是,具有相同的数据...

所以有我的控制者(表单正在发送邮件):

$defaultData = array('message' => 'Mail');
    $form2 = $this->createFormBuilder($defaultData)
        ->add('content', TextareaType::class)
        ->getForm();

    $form2->handleRequest($request);

    if ($form2->isSubmitted() && $form2->isValid()) {

        $message = \Swift_Message::newInstance()
            ->setSubject('Demande')
            ->setTo('test@gmail.com')
            ->setFrom($loggedAs->getEmail())
            ->setBody($this->render('mail_templates/probleme.html.twig', array(
                'nom' => $loggedAs->getFirstName(),
                'prenom' => $loggedAs->getSecondName(),
                'content' => $form2["content"]->getData(),
            )), 'text/html');
        $this->get('mailer')->send($message);
        $this->get('session')->getFlashBag()->add('success', "Rapport envoyé");
    }

    $defaultData2 = array('message2' => 'Mail2');
    $form3 = $this->createFormBuilder($defaultData2)
        ->add('content', TextareaType::class)
        ->getForm();

    $form3->handleRequest($request);

    if ($form3->isSubmitted() && $form3->isValid()) {

        $message2 = \Swift_Message::newInstance()
            ->setSubject('Signaler un problème')
            ->setTo('test@gmail.com')
            ->setFrom($loggedAs->getEmail())
            ->setBody($this->render('mail_templates/probleme.html.twig', array(
                'nom' => $loggedAs->getFirstName(),
                'prenom' => $loggedAs->getSecondName(),
                'content' => $form3["content"]->getData(),
            )), 'text/html');
        $this->get('mailer')->send($message2);
        $this->get('session')->getFlashBag()->add('success', "Rapport envoyé");
    }

和我的html(树枝):

{{ form_start(form2) }}
{{ form_widget(form2.content) }}
{% if form_errors(form2.content) %}
<div class="alert alert-danger" role="alert">
    {{ form_errors(form2.content) | striptags }}
</div>
{% endif %}
<br/>
<button type="submit" class="btn btn-danger btn-rounded">Envoyer</button>
{{ form_end(form2) }}
{{ form_start(form3) }}
{{ form_widget(form3.content) }}
{% if form_errors(form2.content) %}
<div class="alert alert-danger" role="alert">
   {{ form_errors(form3.content) | striptags }}
</div>
{% endif %}
<br/>
<button type="submit" class="btn btn-danger btn-rounded">Envoyer</button>
{{ form_end(form3) }}

enter image description here

2 个答案:

答案 0 :(得分:1)

您需要命名表单并分别处理。 您可以在MailFormType类中移动表单构建代码,并创建2个命名表单:

$form1 = $this->get('form.factory')
    ->createNamedBuilder('form1', MailFormType::class)
    ->getForm();

$form2 = $this->get('form.factory')
    ->createNamedBuilder('form2', MailFormType::class)
    ->getForm();

if ($request->request->has('form1') {
     // handle form1
}

if ($request->request->has('form2') {
     // handle form2
}

答案 1 :(得分:0)

事实上,正如Mihai Aurelian所说,您需要命名这两种表格才能正确处理它们。从已发布的html代码中可以看到,当前您有两种形式,其中包含名称完全相同的输入。这就是为什么似乎两个表单都使用完全相同的数据提交的原因。由于您是在控制器内部而不是在单独的Form Type类中构建表单,因此应该具有以下内容:

use Symfony\Component\Form\Extension\Core\Type\FormType;

public function yourAction(Request $request, FormFactoryInterface $formFactory) {

     $defaultData = array('message' => 'Mail');

     $form2 = $formFactory->createNamedBuilder('form2', FormType::class, $defaultData)
         ->add('content', TextareaType::class)
         ->getForm();

     $defaultData2 = array('message2' => 'Mail2');

     $form3 = $formFactory->createNamedBuilder('form3', FormType::class, $defaultData2)
         ->add('content', TextareaType::class)
         ->getForm();

     $form2->handleRequest($request);

     if ($form2->isSubmitted() && $form2->isValid()) {
          // handle form2
     }

     $form3->handleRequest($request);

     if ($form3->isSubmitted() && $form3->isValid()) {
          // handle form3
     }
}

编辑:我修复了操作中缺少的$ formFactory服务。但是,您应该通过在操作中键入提示$ formFactory参数来自动装配来获得FormFactory服务,而不是使用$this->get('form.factory')直接从服务容器中获取它。您应该避免以这种方式在控制器内部获取服务,而是尽可能使用自动装配。