php - 单击按钮时复制表单
问题描述
我有一个包含 2 个字段的非常简单的表单,我要做的只是一个按钮,用户可以在其中复制此表单以在一批中添加多个条目。
我不确定如何集成它,我找到了一些关于表单集合的文档,但我不确定它是否符合我的需要,另外它是用于 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(),
]);
}
解决方案
你看过symfonyCast 上的这些教程了吗?它完全符合您的需求(从第 18 章到最后)
它将向您展示如何使用 OneToMany 关系、表单原型和 Collection 类型来添加和/或删除嵌入的表单。
推荐阅读
- java - 如何找到按钮注册
- python - 在线 LSTM 分类模型给出非常多的错误预测
- node.js - Node.js 中的 Pdf 空文件
- python - 从 mgltools 运行 PMV 时出现“ImportError:没有名为 oldnumeric 的模块”
- javascript - 在 javascript 游戏中的列中添加一个额外的步骤
- android - 撤销 - (为未来的发布使用相同的选择)
- ag-grid - 如何有条件地启用/禁用 Ag-Grid 中的单元格渲染器?
- if-statement - Eclipse-RCPTT If 条件实现
- javascript - 使用 javascript 更改 css 背景图像
- java - 与 Keylisteners 斗争(Java)