首页 > 解决方案 > 没有实体的 Symfony 表单 stepwizard

问题描述

所以我目前正在做一个项目,基本上我必须为客户注册。客户是个人或组织。如果是组织,客户必须提供公司名称。一旦收集到数据(客户已提交表单并且所有验证都很好),数据将被发送到一个 API,该 API 将用户保存在数据库中(实体在不同的项目中,并且都共享同一个数据库)

所以,注册需要两个步骤,第一步是选择您是个人还是组织,第二步是所有字段(如果您选择组织,则需要额外的字段)

我正在构建的代码尝试在一个 FormType 中执行(此代码不是我完成的,但这个想法是我会做的)

class SignUpFormType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
                $form = $event->getForm();

                if (!empty($_POST)) {
                    $data = $_POST['sign_up_form'];

                    if (isset($data['type'])) {
                        if ($data['type'] === 'company') {
                            $form
                                ->add('vatNr', TextType::class)
                                ->add('companyName', TextType::class);
                        }

                        $form
                            ->add('firstName', TextType::class)
                            ->add('lastName', TextType::class)
                            ->add('email', EmailType::class, [
                                'label' => 'Email:',
                                'label_attr' => ['class' => 'g-color-gray-dark-v2 g-font-weight-600 g-font-size-13'],
                                'required' => true,
                                'constraints' => [
                                    new NotBlank(['message' => 'Please fill in your email.'])
                                ]
                            ])
                            ->add('password', RepeatedType::class, [
                                'type' => PasswordType::class,
                                'invalid_message' => 'The password fields must match.',
                                'options' => ['attr' => ['class' => 'password-field']],
                                'required' => true,
                                'first_options' => [
                                    'label' => 'Password:',
                                    'label_attr' => ['class' => 'g-color-gray-dark-v2 g-font-weight-600 g-font-size-13']
                                ],
                                'second_options' => [
                                    'label' => 'Confirm Password:',
                                    'label_attr' => ['class' => 'g-color-gray-dark-v2 g-font-weight-600 g-font-size-13']
                                ],
                            ])
                            ->add('agree_tos', CheckboxType::class, [
                                'label' => 'I accept the Terms of Services',
                                'label_attr' => ['class' => 'form-check-inline u-check g-color-gray-dark-v2 g-font-weight-600 g-font-size-13'],
                                'attr' => ['class' => 'g-hidden-xs-up'],
                                'constraints' => [
                                    new IsTrue(['message' => 'You have to agree to our Terms of Services'])
                                ]
                            ])
                            ->add('Signup', SubmitType::class, ['attr' => ['class' => 'btn btn-md u-btn-primary rounded g-py-13 g-px-25']]);
                    }
                } else {
                    $form
                        ->add('type', ChoiceType::class, [
                            'multiple' => false,
                            'choices' => [
                                'company' => 'company',
                                'person' => 'person'
                            ]
                        ])
                        ->add('next', SubmitType::class, ['attr' => ['class' => 'btn btn-md u-btn-primary rounded g-py-13 g-px-25']]);
                }
            });
    }

    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefault('allow_extra_fields', true);
    }
}

但问题是,如果我转到我的表单,并在第一步按下下一步按钮,它会验证第二步的字段。如果我在第二步按注册,它不会验证任何内容,只会将表单视为有效。

现在我知道有一个捆绑包可以做一个步骤向导(CraueFormFlowBundle),但这仅在使用我不使用的实体时才有效。

为什么在步骤 1 中单击下一步时它会验证步骤 2,我该如何解决我的问题(或者有更好的方法来做我想做的事?)

标签: phpformssymfony

解决方案


推荐阅读