Php Symfony提交多个相关表格

Php Symfony提交多个相关表格,php,forms,symfony,symfony4,Php,Forms,Symfony,Symfony4,我希望创建一个包含多个Entite和多个表单的CRUD。一个想要创建一个站点,每个站点在创建时需要有一个地址,每个地址需要一个城市,每个城市需要一个国家 所以我有一个控制器,在那里我调用了我的类型 /** *@Route(“admin/sites/new”,name=“admin.sites.new”) *@param Request$Request *@return-Response | Response */ 新公共功能(请求$Request) { $site=新站点(); $ADRESE

我希望创建一个包含多个Entite和多个表单的CRUD。一个想要创建一个站点,每个站点在创建时需要有一个地址,每个地址需要一个城市,每个城市需要一个国家

所以我有一个控制器,在那里我调用了我的
类型

/**
*@Route(“admin/sites/new”,name=“admin.sites.new”)
*@param Request$Request
*@return-Response | Response
*/
新公共功能(请求$Request)
{
$site=新站点();
$ADRESE=新ADRESE();
$VILE=新VILE();
$pays=新支付();
$form=$this->createForm(SiteType::class,$site);
$form2=$this->createForm(adrestype::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);
如果($form->isSubmitted()&&&$form->isValid()
&&$form2->isSubmitted()&&&$form2->isValid()
&&$form3->isSubmitted()&&&$form3->isValid()
&&$form4->isSubmitted()&&&$form4->isValid()){
$this->em->persist($site);
$this->em->persist($adrese);
$this->em->persist($ville);
$this->em->persist($pays);
$this->em->flush();
$this->addFlash('success','Site crée avec success');
返回$this->redirectToRoute('admin.sites.index');
}
返回$this->render('admin/sites/create.html.twig'[
“站点”=>$site,
“ADRESE”=>$ADRESE,
“ville”=>$ville,
“支付”=>美元支付,
'form'=>$form->createView(),
'form2'=>$form2->createView(),
'form3'=>$form3->createView(),
'form4'=>$form4->createView(),
]);
}
和生成视图的细枝


{{form_start(form)}}
{{form_widget(form)}
{{form_start(form2)}}
{{form_widget(form2)}}
{{form_start(form3)}
{{form_widget(form3)}
{{form_start(form4)}}
{{form_widget(form4)}
{{按钮|默认('Enregister')}
{{form_end(form)}{{form_end(form2)}}{{form_end(form3)}}{{form_end(form4)}
我的问题是下一个问题,我将如何创建我的站点,我可以链接站点id和地址id,地址id和城市id,城市id和国家id?没有分开的表格? 我的意思是,当我按下按钮时,关系将正确创建


谢谢您的帮助。

您应该使用嵌入表单:。

您应该使用嵌入表单:。

这是您应该并且可以实现的方法: 您应该使用嵌入表单

您只需为实体创建表单类型:SiteType、adresetype、VilleType、PaysType,并按如下方式嵌入它们

// in SiteType
    //....
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('adresse', AdresseType::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>

这是您应该并且能够实现这一目标的方式: 您应该使用嵌入表单

您只需为实体创建表单类型:SiteType、adresetype、VilleType、PaysType,并按如下方式嵌入它们

// in SiteType
    //....
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('adresse', AdresseType::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>

您必须在一种表单类型上嵌入表单。SiteType包含包含VilleType等的AddressType。您必须将表单嵌入到一种表单类型中。SiteType包含包含VilleType等的AddressType。只是一个愚蠢的问题。。。对于那些
'site'=>$site,'adrese'=>$adrese,'ville'=>$ville,'pays'=>$pays,
如何将这些变量声明为空?带有
$x=new x()的null ou?只是个愚蠢的问题。。。对于那些
'site'=>$site,'adrese'=>$adrese,'ville'=>$ville,'pays'=>$pays,
如何将这些变量声明为空?带有
$x=new x()的null ou