【发布时间】:2020-04-15 10:14:24
【问题描述】:
我有一个包含 2 个字段的非常简单的表单,我想要做的只是一个按钮,用户可以复制此表单以在一批中添加多个条目。
What i would like to do (I can't integrate images yet, sry..)
我不确定如何集成它,我发现 some documentation 关于表单集合,但我不确定它是否符合我的需求,而且它是针对 Symfony 2 的,我使用的是最新版本( Symfony 5)
我想我可以用href='#?duplicateForm=1' 添加我的按钮并使用控制器和类型来处理它,但这对我来说似乎不是一个合适的解决方案......在for 中抛出用户输入是个坏主意声明。
我的类型类:
表单根据当前用户角色不同,管理员有更多字段。
class NetworkFolderAccessType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($options['type'] == 'ADMIN_FORM'){
$builder
->add('userId', EntityType::class, [
'class' => User::class,
'choice_label' => function ($user) {
return $user->getNom() . ' ' . $user->getPrenom() .' ('. $user->getUsername().')';
},
'label'=>'Demandeur',
'attr'=> [
'class'=>'form-control'
]
])
->add('validated',ChoiceType::class,[
'expanded'=>false,
'multiple'=>false,
'choices'=>['Oui'=>true,'Non'=>false],
'label'=>'Validé par le responsable',
'attr'=> [
'class'=>'form-control'
],
'choice_attr'=> [
'class'=>'checkbox-inline'
]
]);
}
if($options['type'] == 'USER_FORM' || $options['type'] == 'ADMIN_FORM'){
$builder
->add('dataPath',TextType::class,[
'attr'=> [
'class'=>'form-control'
],
'label'=>'Chemin d\'accès'
])
->add('rights', ChoiceType::class, [
'choices' => [
'Lecture' => 'read',
'Écriture' => 'write',
'Lecture & Écriture' => 'readwrite',
],
'expanded' => false,
'multiple' => false,
'label'=>'Droits d\'accès',
'attr' => ['class' => 'form-control'],
])
;
}
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => NetworkFolderAccess::class,
'type'=>'USER_FORM'
]);
}
}
我的控制器:
/**
* @Route("/new", name="network_folder_access_new", methods={"GET","POST"})
* @IsGranted("ROLE_USER")
*/
public function new(Request $request): Response
{
$networkFolderAccess = new NetworkFolderAccess();
if ($this->isGranted('ROLE_ADMIN'))
$form = $this->createForm(NetworkFolderAccessType::class, $networkFolderAccess, ['type'=>'ADMIN_FORM']);
elseif ($this->isGranted('ROLE_USER'))
$form = $this->createForm(NetworkFolderAccessType::class, $networkFolderAccess, ['type'=>'USER_FORM']);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$networkFolderAccess->setDateDemand(new DateTime());
if ($this->IsGranted('ROLE_USER') && !$this->isGranted('ROLE_ADMIN'))
$networkFolderAccess->setUserId($this->security->getUser());
$entityManager->persist($networkFolderAccess);
$entityManager->flush();
return $this->redirectToRoute('network_folder_access_index');
}
return $this->render('network_folder_access/new.html.twig', [
'network_folder_access' => $networkFolderAccess,
'form' => $form->createView(),
]);
}
【问题讨论】:
-
symfony.com/doc/current/form/form_collections.html。如果您遵循本教程并发现您没有“父实体”,因此没有关系,您仍然可以使用主表单和子表单类型
-
对不起,我想我可能误解了您的评论,但我确实有一个 OneToMany 关系:一个用户可以有多个 NetworkFolderAccesses。虽然感谢表单集合的当前文档的链接,但我认为它只存在于 2.0 版本,因为没有指向最新版本的链接。
标签: php symfony duplicates formbuilder