php - 没有实体的 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,我该如何解决我的问题(或者有更好的方法来做我想做的事?)
解决方案
推荐阅读
- sql - SUM 语句中的 AVG
- python-3.x - TypeError: preprocess_input() 得到了一个意外的关键字参数“模式”
- python - 如何使用子进程 python 恢复终端
- python - 如何通过在任意一对连续数字之间切割整数 N 将其拆分为两个非空部分。这样就创建了一对整数 A, B
- javascript - 如何将 google sheet API v3 迁移到 google sheet Api v4
- google-cloud-platform - 格式化 gcloud 计算实例列表以获取单个元数据值
- python - Django 存储实际可用性并查询新预订的可用时间表
- python - 使用 pandas 的 groupby 和 agg 合并包含 dicts 的列
- java - 我必须使用两个edittext获得两个用户输入,并在单击按钮时在textview中随机显示任何人
- npm - npm install 遇到问题