php - 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 ?没有分开我的表格?我的意思是当我按下按钮时,关系将被正确创建。
谢谢你的帮助。
解决方案
这就是你应该并且可以做到这一点的方式:你应该使用嵌入表单如何嵌入表单
您只需为您的实体创建表单类型: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;
推荐阅读
- c# - 自定义 Winforms 标题栏中的文本
- android - ExecutorService 不能重用它的线程
- python - 如何使用 Opencv 和 Flask 将网络摄像头图像流广播到多个设备?
- c# - 如何重用来自其他项目的 TestCaseSource
- javascript - 页面上所有链接和按钮的平滑滚动
- android - Kotlin - 使用属性访问语法问题
- python - HTML类的网页抓取问题
- sql - 检索一列具有最大值的行
- android - 单击可扩展列表视图父项后,Andriod EditText 失去焦点
- javascript - firebase 存储保护?