Php 没有实体的Symfony表单步骤向导
所以我现在正在做一个项目,基本上我必须为一个客户注册。客户是个人或组织。如果是组织,客户必须提供公司名称。一旦收集到数据(客户提交了表单并且所有验证都正常),数据将发送到API,API将用户保存在数据库中(实体位于不同的项目中,并且两者共享同一数据库) 因此,注册需要两个步骤,第一步是选择您是个人还是组织,第二步是所有字段(如果您选择了组织,则带有额外字段) 我正在构建的代码尝试在一个表单类型中实现它(这段代码不是我完成的,但是这个想法是我应该完成的) 但问题是,如果我转到我的表单,在第一步按下next按钮,它会在第二步验证字段。如果我在第二步按Signup,它不会验证任何内容,只会将表单视为有效 现在我知道有一个包可以执行stepwizard(CraueFormFlowBundle),但这只在使用我不使用的实体时有效Php 没有实体的Symfony表单步骤向导,php,forms,symfony,Php,Forms,Symfony,所以我现在正在做一个项目,基本上我必须为一个客户注册。客户是个人或组织。如果是组织,客户必须提供公司名称。一旦收集到数据(客户提交了表单并且所有验证都正常),数据将发送到API,API将用户保存在数据库中(实体位于不同的项目中,并且两者共享同一数据库) 因此,注册需要两个步骤,第一步是选择您是个人还是组织,第二步是所有字段(如果您选择了组织,则带有额外字段) 我正在构建的代码尝试在一个表单类型中实现它(这段代码不是我完成的,但是这个想法是我应该完成的) 但问题是,如果我转到我的表单,在第一步按下
为什么在第1步中单击“下一步”时会验证第2步?我如何解决我的问题(或者是否有更好的方法来做我想做的事情?@emix我知道我不应该使用superglobals,我没有改变这一点。至于其他人,我怎么不需要一个倾听者呢?根据步骤,我将如何显示字段/隐藏字段?我将在细枝中进行管理。想举个例子说明一下您是如何做到的吗?我不知道我该怎么做
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);
}
}