Symfony-来自同一页面上两个实体的两个表单


Symfony - Two forms from two entities on the same page

我希望主页上有两个表单,来自同一控制器中的两个实体。

表格如下:

class DevisController extends Controller
{
    public function DevisAction(Request $request)
    {
        $devis = new Devis();
        $form = $this->createForm(new DevisType(), $devis);
        if ($form->handleRequest($request)->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($devis);
            $em->flush();
            $request
                ->getSession()
                ->getFlashBag()
                ->add('info', 'Le devis a bien été envoyé !');
            $message = 'Swift_Message::newInstance();
            $imgUrl = $message->attach('Swift_Attachment::fromPath('http://img15.hostingpics.net/pics/419370oah.png'));
            $message
                ->setSubject('Demande de devis bien reçue !')
                ->setFrom('xxx@gmail.com')
                ->setTo($devis->getEmail())
                ->setBody(
                    $this->renderView(
                        'OAHDevisBundle:Devis:devis_email.html.twig',
                        array('url' => $imgUrl)
                    ),
                    'text/html'
                );
            $this->get('mailer')->send($message); 
            $message = 'Swift_Message::newInstance()
                 ->setSubject('Nouvelle demande de devis')
                 ->setFrom('xxxn@gmail.com')
                 ->setTo('xxxn@gmail.com')
                 ->setBody(
                      $this->renderView(
                           'OAHDevisBundle:Devis:devis_recu.html.twig'
                      ),
                      'text/html'
                 );
           $this->get('mailer')->send($message);
           return $this->redirect($this->generateUrl('oah_core_homepage'));
      }
      // Si on n'est pas en POST, alors on affiche le formulaire
      return $this->render('OAHCoreBundle:Core:layout.html.twig', array(
          'form' => $form->createView(),
      ));
    }
    public function NewsletterAction(Request $request)
    {
        $newsletter = new Newsletter();
        $formEmail = $this->createForm(new NewsletterType(), $newsletter);
        if ($formEmail->handleRequest($request)->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($newsletter);
            $em->flush();
            $request
               ->getSession()
               ->getFlashBag()
               ->add('info', 'Vous êtes bien inscrit à la newsletter ');
            return $this->redirect($this->generateUrl('oah_core_homepage'));
        } 
         return $this->render('OAHCoreBundle:Core:layout.html.twig', array(
            'formEmail' => $formEmail->createView(),
         ));
    }
}

第一个非常有效,第二个我更改了变量名以使trick有所不同。所以在我的模板中,我有第二个:

{{ form(formEmail) }}

每次我都会出现以下错误:

中不存在变量"formEmail"OAHCoreBundle:核心:在384 线上的layout.html.twig

请问这个怎么了?

根据您当前的代码,您只调用您的DevisAction

在这样做的时候,你甚至没有接触到NewsletterAction,这就是为什么你的树枝找不到formEmail形式的原因

试着将两个窗体都包含在一个控制器操作中,这样它就会正确呈现。

class DevisController extends Controller
{
    public function DevisAction(Request $request)
    {
        $devis = new Devis();
        $form = $this->createForm(new DevisType(), $devis);
        $newsletter = new Newsletter();
        $formEmail = $this->createForm(new NewsletterType(), $newsletter);
        if ($formEmail->handleRequest($request)->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($newsletter);
            $em->flush();
            $request
                ->getSession()
                ->getFlashBag()
                ->add('info', 'Vous êtes bien inscrit à la newsletter ');
            return $this->redirect($this->generateUrl('oah_core_homepage'));
        }
        if ($form->handleRequest($request)->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($devis);
            $em->flush();
            $request
                ->getSession()
                ->getFlashBag()
                ->add('info', 'Le devis a bien été envoyé !');
            $message = 'Swift_Message::newInstance();
            $imgUrl = $message->attach('Swift_Attachment::fromPath('http://img15.hostingpics.net/pics/419370oah.png'));
            $message
                ->setSubject('Demande de devis bien reçue !')
                ->setFrom('xxx@gmail.com')
                ->setTo($devis->getEmail())
                ->setBody(
                    $this->renderView(
                        'OAHDevisBundle:Devis:devis_email.html.twig',
                        array('url' => $imgUrl)
                    ),
                    'text/html'
                );
            $this->get('mailer')->send($message);
            $message = 'Swift_Message::newInstance()
                ->setSubject('Nouvelle demande de devis')
                ->setFrom('xxxn@gmail.com')
                ->setTo('xxxn@gmail.com')
                ->setBody(
                    $this->renderView(
                        'OAHDevisBundle:Devis:devis_recu.html.twig'
                    ),
                    'text/html'
                );
            $this->get('mailer')->send($message);
            return $this->redirect($this->generateUrl('oah_core_homepage'));
        }
        // Si on n'est pas en POST, alors on affiche le formulaire
        return $this->render('OAHCoreBundle:Core:layout.html.twig', array(
            'form' => $form->createView(),
            'formEmail' => $formEmail->createView()
        ));
    }
}

EDIT这仍然需要通过提供正确的表单验证来清理,我还没有这样做,但渲染问题应该得到解决。