【问题标题】:Duplicating form on button click单击按钮时复制表单
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多