Итак, я сейчас работаю над проектом, и в основном я должен подписаться на клиента. Клиент - это либо человек, либо организация. Если это организация, клиент должен указать название компании. Как только данные собраны (клиент отправил форму и все проверки правильны), данные отправляются в API, который сохраняет пользователя в базе данных (объекты находятся в другом проекте и оба совместно используют одну и ту же базу данных)
Итак, регистрация требует 2 шага, первый шаг - выбрать, являетесь ли вы человеком или организацией, а второй шаг - это все поля (с дополнительными полями, если вы выбрали организацию)
код, который я строю на попытках сделать это в одном 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);
}
}
Проблема, однако, в том, что если я go к моей форме, и я нажимаю следующую кнопку на первом шаге, она проверяет поля на втором шаге. Если я нажимаю на втором шаге «Регистрация», он ничего не проверяет и просто видит форму как правильную.
Теперь я знаю, что есть пакет для выполнения пошагового мастера (CraueFormFlowBundle), но это работает только при использовании объектов, которые Я не использую.
Почему он проверяет шаг 2 при нажатии кнопки «Далее» на шаге 1 и как я могу исправить свою проблему (или есть лучший способ сделать то, что я хочу?)