首页 > 解决方案 > 单击按钮时复制表单

问题描述

我有一个包含 2 个字段的非常简单的表单,我要做的只是一个按钮,用户可以在其中复制此表单以在一批中添加多个条目。

我想做什么(我还不能整合图像,sry ..)

我不确定如何集成它,我找到了一些关于表单集合的文档,但我不确定它是否符合我的需要,另外它是用于 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(),
        ]);
    }

标签: phpsymfonyduplicatesformbuilder

解决方案


你看过symfonyCast 上的这些教程了吗?它完全符合您的需求(从第 18 章到最后)

它将向您展示如何使用 OneToMany 关系、表单原型和 Collection 类型来添加和/或删除嵌入的表单。


推荐阅读