I have a form and i want submit it depends on the click of a radio button which is a choiceType : I have three entities(User which is the parent of Particuler and Professionnal) :
#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ORM\InheritanceType("JOINED")]
#[ORM\DiscriminatorColumn(name:"compte", type: "string")]
#[ORM\DiscriminatorMap(["professionnel"=>Professionel::class, "particulier"=> Particulier::class])]
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private $id;
#[ORM\Column(type: 'string', length: 50)]
private $typeCompte;
#[ORM\Column(type: 'string', length: 180, unique: true)]
#[Assert\NotBlank()]
#[Assert\Length(min:2, max:80)]
#[Assert\Email(message:"Choisir un autre email")]
private $email;
#[ORM\Column(type: 'boolean', nullable: true)]
private $approve;
// getters and setters
}
#[ORM\Entity(repositoryClass: ProfessionelRepository::class)]
class Professionel extends User
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private $id;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private $logo;
// getters and setters
}
class Particulier extends User
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private $id;
#[ORM\Column(type: 'string', length: 50)]
#[Assert\NotBlank()]
#[Assert\Length(min:2, max:50)]
private $prenom;
// getters and setters
}
the corresponding formtype :
class RegistrationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('typeCompte', ChoiceType::class, [
'label' => 'Type de compte*',
'choices'=>[
'Particulier' =>'Particulier',
'Professionel'=>'Professionel'
],
'data'=>'Particulier',
'expanded'=> true,
'multiple'=> false,
'attr'=>[
'class'=>'form-check-input',
'name' => 'type_compte'
]
])
->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
// Set the default value for the "typeCompte" field
$form->get('typeCompte')->setData('particulier');
})
->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
//dd($data);
// Check the value of the "typeCompte" field
$user = $event->getForm()->getData();
dd($user);
if ($data['typeCompte'] === 'Particulier') {
// Add the corresponding fields
$form->add('civility', ChoiceType::class, [
'label' => 'Civilité',
'choices' => [
'Madame' => 'Madame',
'Madamoiselle' => 'Madamoiselle',
'Monsieur' => 'Monsieur'
],
'expanded' => true,
'multiple' => false,
'attr' => [
'class' => 'form-check-input',
]
])
->add('prenom', TextType::class, [
'label' => 'Prénom*',
'attr' => [
'placeholder' => 'Votre prénom',
'class' => 'form-control'
]
])
->add('nom', TextType::class, [
'label' => 'Nom*',
'attr' => [
'placeholder' => 'Votre nom',
'class' => 'form-control'
]
])
;
} elseif ($data['typeCompte'] === 'professionel') {
// Add the corresponding fields
$form->add('nomProfessionel', TextType::class, [
'label' => 'Concession*',
'attr' => [
'placeholder' => 'Nom concession',
'class' => 'form-control',
'id' => 'entreprise',
])
->add('logo', FileType::class, [
'label' => 'Logo',
'attr' => [
'class' => 'form-control',
'id' => 'entreprise',
]
])
;
}
})
->add('email', EmailType::class, [
'label' => 'Email*',
'attr' => [
'placeholder' => 'Votre email',
'class' => 'form-control'
]
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}
the corresponding controller :
#[Route('/Inscription', name: 'app_register')]
public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher): Response
{
$form = $this->createForm(RegistrationFormType::class);
// dd($form->get('typeCompte')->getData());
// dd($request);
$form->handleRequest($request);
// dd($form->handleRequest($request));
// dd($form);
// dd($form->isSubmitted() && $form->isValid());
if ($form->isSubmitted() && $form->isValid()) {
dd($form->get('typeCompte')->getData());
if ($form->get('typeCompte')->getData() === 'particulier'){
$user = new Particulier();
}
if ($form->get('typeCompte')->getData() === 'professionel') {
$user = new Professionel();
}
$form->getData($user);
// encode the plain password
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('password')->getData()
)
);
$this->em->persist($user);
$this->em->flush();
return $this->renderForm('registration/register.html.twig', [
'registrationForm' => $form,
]);
}
I have tried to build the form by adding eventlisteners as shown in the formType but i accross a null error when i trying to use dd($data). What i expect is to submit the form whether the user is Particulier or Professionnal by clicking on the typeCompte field.