php - 如何在 symfony 4 中使用 collectionType 创建一个包含多个表单作为字段的表单?
问题描述
我想在一个页面中创建多个表单,其中包含一个带有 symfony 的提交按钮。我检查了文档,发现我需要制作一个带有 collectiontype 字段的表单,但我不知道如何继续。我在两页中有两个表单,第一页用户告诉下一页将有多少个表单。我已经创建了我的第一个表单并且它工作正常,我有第一个表单的数据,但是现在我如何根据提交的数据创建包含多个表单的第二个页面。这是我的第一个表格:
class OrdersType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add ('tickets', CollectionType::class, [
'entry_type' => TicketsType::class,
'allow_add' => true
])
->add('numberOfTickets', ChoiceType::class, [
'attr' => [
'class' => 'form-control'
],
'choices' => [
'1' => 1,
'2' => 2,
'3' => 3,
'4' => 4,
'5' => 5,
]
])
->add('date', DateType::class, [
'attr' => [
'class' => 'form-control'
],
'widget' => 'single_text'
])
->add('type', ChoiceTYpe::class, [
'attr' => [
'class' => 'form-control'
],
'choices' => [
'Journée' => 1,
'Demi-journée(à partir de 14 heures)' => 0,
]
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Orders::class,
]);
}
}
我的第二个表格(我想在第二页复制的那个):
class TicketsType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('category', CheckboxType::class, [
'attr' => [
'class' => 'form-control'
]
])
->add('firstname', TextType::class, [
'attr' => [
'class' => 'form-control'
]
])
->add('lastname', TextType::class, [
'attr' => [
'class' => 'form-control'
]
])
->add('country', TextType::class, [
'attr' => [
'class' => 'form-control'
]
])
->add('dateOfBirth', DateType::class, [
'attr' => [
'class' => 'form-control'
],
'widget' => 'single_text'
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Tickets::class,
]);
}
}
和我的控制器:
/**
* @Route("/", name="home")
*/
public function home(Request $request, SessionInterface $session)
{
$Orders = new Orders();
$form = $this->createForm(OrdersType::class, $Orders);
$form->handleRequest($request);
if($form->isSubmitted()){
$formData = $form->getData();
$session->set('orders', $formData);
return $this->redirectToRoute('ticket');
}
$repo = $this->getDoctrine()->getRepository(Tickets::class);
$tickets = $repo->findAll();
return $this->render('louvre/home.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/ticket", name="ticket")
*/
public function ticket(Request $request, SessionInterface $session)
{
$data = $session->get('orders');
$Orders = new Orders()
for ($i=0; $i<$data->getNumberOfTickets() ;$i++){
echo 'test';
$tickets = new Tickets();;
$form = $this->createForm(OrdersType::class, $Orders);
$form->handleRequest($request);
};
$repo = $this->getDoctrine()->getRepository(Tickets::class);
$tickets = $repo->findAll();
return $this->render('louvre/ticket.html.twig', [
'form' => $form->createView()
]);
}
解决方案
所以解决方案是让collectiontype不在我的表单中,而是在我的控制器中,所以我删除了:
`->add ('tickets', CollectionType::class, [
'entry_type' => TicketsType::class,
'allow_add' => true
])
`
然后,当我想为我的表单创建一个集合类型时,我在我的控制器中写下这个:
$form = $this->createForm(CollectionType::class, $tickets, ['entry_type' => TicketsType::class] );
推荐阅读
- sql - 我需要使用相同的查询(with)输出(创建colmun)每个国家有多少个城市
- bash - 如何在 bash 中高效地迭代大量数字?
- facebook - 是否可以在 Facebook 上创建自定义信使机器人?
- nativescript - 如何在局域网外连接 Nativescript webrtc
- rxjs - rxjs publishReplay 与 windowTime 参数重置
- nsis - 为什么当我添加自定义 nsDialog 页面时,我的 NSIS 脚本似乎跳过了 MUI_PAGE_INSTFILES 等安装页面?
- java - 无法使用 interstitialAd.setAdUnitId() 方法?
- ruby-on-rails - 尝试将我的 Rails 应用程序部署到 Heroku:ModuleNotFoundError
- javascript - 无法在第二页访问。评估在第一页中定义的变量。评估(node.js puppeteer)
- python - 如何创建n个参数的方程生成器以与scipy一起使用?