首页 > 解决方案 > Symfony 提交多个相关表单

问题描述

我正在寻找一个具有多个实体和多个表单的 CRUD。一个想要创建一个站点,创建时每个站点需要有 1 个地址,每个地址需要 1 个城市,每个城市需要 1 个国家 关系

所以我有一个控制器,我称之为我的Type

/**
    * @Route("admin/sites/new", name="admin.sites.new")
    * @param Request $request
    * @return RedirectResponse|Response
    */
   public function new (Request $request)
   {
       $site = new Site();
       $adresse = new Adresse();
       $ville = new Ville();
       $pays = new Pays();
       $form = $this->createForm(SiteType::class, $site);
       $form2 = $this->createForm(AdresseType::class, $adresse);
       $form3 = $this->createForm(VilleType::class, $ville);
       $form4 = $this->createForm(PaysType::class, $pays);
       $form->handleRequest($request);
       $form2->handleRequest($request);
       $form3->handleRequest($request);
       $form4->handleRequest($request);

       if ($form->isSubmitted() && $form->isValid()
           && $form2->isSubmitted() && $form2->isValid()
           && $form3->isSubmitted() && $form3->isValid()
           && $form4->isSubmitted() && $form4->isValid()){
           $this->em->persist($site);
           $this->em->persist($adresse);
           $this->em->persist($ville);
           $this->em->persist($pays);
           $this->em->flush();
           $this->addFlash('success', 'Site crée avec succès');
           return $this->redirectToRoute('admin.sites.index');
       }
       return $this->render('admin/sites/create.html.twig', [
           'site' => $site,
           'adresse' => $adresse,
           'ville' => $ville,
           'pays' => $pays,
           'form' => $form->createView(),
           'form2' => $form2->createView(),
           'form3' => $form3->createView(),
           'form4' => $form4->createView(),
       ]);
   }

和一个 Twig 来生成视图。

    <div class="row">
        <div class="col s12 m12 l12">
            <div class="card-panel ">
                <div class="row">

                    {{ form_start(form) }}
                        {{ form_widget(form) }}


                    {{ form_start(form2) }}
                    {{ form_widget(form2) }}

                    {{ form_start(form3) }}
                    {{ form_widget(form3) }}

                    {{ form_start(form4) }}
                    {{ form_widget(form4) }}

                    <button class="btn s12 m6 l3">{{ button|default('Enregister') }}</button>
                    {{ form_end(form) }}{{ form_end(form2) }}{{ form_end(form3) }}{{ form_end(form4) }}
                </div>
            </div>
        </div>
    </div>

我的问题是下一个,当我将如何创建我的站点时,我可以链接 site_id 和 address_id 以及 adress_id 和 city_id、city_di 和国家/地区 _id ?没有分开我的表格?我的意思是当我按下按钮时,关系将被正确创建。

谢谢你的帮助。

标签: phpformssymfonysymfony4

解决方案


这就是你应该并且可以做到这一点的方式:你应该使用嵌入表单如何嵌入表单

您只需为您的实体创建表单类型:SiteType、AdresseType、VilleType、PaysType并将它们嵌入如下

// in SiteType
    //....
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('adresse', AdresseType::class)
         ;
    }
// in AdresseType
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('ville', VilleType::class)
         ;
    }
// in VilleType
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('pays', PaysType::class)
         ;
    }

最后在您的控制器中,您所要做的就是创建

   /**
    * @Route("admin/sites/new", name="admin.sites.new")
    * @param Request $request
    * @return RedirectResponse|Response
    */
   public function new (Request $request)
   {
       $site = new Site();
       $form = $this->createForm(SiteType::class, $site);
       $form->handleRequest($request);

       if ($form->isSubmitted() && $form->isValid()
           $this->em->persist($site);
           $this->em->flush();
           $this->addFlash('success', 'Site crée avec succès');

           return $this->redirectToRoute('admin.sites.index');
       }

       return $this->render('admin/sites/create.html.twig', [
           'site' => $site,
           'adresse' => $adresse,
           'ville' => $ville,
           'pays' => $pays,
           'form' => $form->createView(),
       ]);
   }

相应的树枝是:

    <div class="row">
        <div class="col s12 m12 l12">
            <div class="card-panel ">
                <div class="row">
                    {{ form_start(form) }}
                        {{ form_widget(form) }}

                        <button class="btn s12 m6 l3">{{ button|default('Enregister') }}</button>
                    {{ form_end(form) }}
                </div>
            </div>
        </div>
    </div>

请注意,为了使其工作,您需要在实体学说元数据中使用级联,如下所示:

/**
 * @ORM\OneToOne(targetEntity="AppBundle:Adresse", cascade={"all"})
 */
private $adresse;

推荐阅读