<?php
namespace App\Form\Type\Registration;
use App\Entity\User;
use App\Model\Form\UserField;
use App\Services\DTV\YamlConfig\YamlReader;
use Exception;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\IsTrue;
class RegistrationFormType extends AbstractType
{
private YamlReader $yamlReader;
private UserField $userField;
public function __construct(
YamlReader $yamlReader,
UserField $userField
)
{
$this->yamlReader = $yamlReader;
$this->userField = $userField;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*
* @return void
*
* @throws Exception
*/
public function buildForm( FormBuilderInterface $builder, array $options ): void
{
$globalFormType = $this->yamlReader->getFormType();
$userType = $globalFormType[ 'user' ][ 'register' ] ?? NULL;
if ( !is_null( $userType ) ) {
foreach ( $userType[ 'fields' ] as $key => $fieldOptions ) {
if ( isset( $fieldOptions[ 'enabled' ] ) && $fieldOptions[ 'enabled' ] === TRUE ) {
$field = $this->userField->getField( $key, $fieldOptions );
$builder->add( $key, $field->getFormType(), $field->toArray() );
}
}
} else {
$builder
->add( 'email', EmailType::class, [
'label' => 'E-mail',
'attr' => [
'data-parsley-type' => 'email',
],
'required' => TRUE,
] )
->add( "phone", TextType::class, [
"required" => TRUE,
'attr' => [
'placeholder' => '00 00 00 00 00',
'data-parsley-pattern' => "^0[1-9] \d{2} \d{2} \d{2} \d{2}$",
'data-inputmask' => "'mask': '99 99 99 99 99'",
'inputmode' => "text",
],
] )
->add( 'lastName', TextType::class, [
'label' => 'Nom',
'required' => TRUE,
] )
->add( 'firstName', TextType::class, [
'label' => 'Prénom',
'required' => TRUE,
] )
->add( 'companySiret', TextType::class, [
'label' => 'SIRET',
'required' => TRUE,
] )
->add( 'company', TextType::class, [
'label' => 'Société',
'required' => TRUE,
] )
->add( 'address1', TextType::class, [
'label' => 'Adresse',
'required' => TRUE,
] )
->add( 'postcode', TextType::class, [
'label' => 'Code postal',
'attr' => [
'data-parsley-length' => '[4,5]',
'data-parsley-type' => 'number',
'maxlength' => '5',
],
'required' => TRUE,
] )
->add( 'city', TextType::class, [
'label' => 'Ville',
'required' => TRUE,
] )
->add( 'newsletter', CheckboxType::class, [
'label' => 'Je souhaite recevoir la Newsletter REHAU',
'required' => FALSE,
] )
->add( 'cguAt', CheckboxType::class, [
'label' => "J'ai lu et j'accepte le <a href='/static-file/general_documents/rehau-pro-reglement-def-30-09-21-61c4b65bc27b9335425151.pdf' targer='blank'>règlement de la plateforme REHAU Pro</a> ",
'label_html' => TRUE,
'mapped' => FALSE,
'constraints' => [
new IsTrue( [
'message' => 'Vous devez accepter le règlement de la plateforme continuer votre inscription',
] ),
],
] )
->add( 'companyIsOk', CheckboxType::class, [
'label' => "J'atteste être le dirigeant de l’entreprise, ou à défaut avoir informé le dirigeant de mon inscription au Club REHAU expert fenêtre",
'mapped' => FALSE,
'constraints' => [
new IsTrue( [
'message' => 'Vous devez accepter pour continuer votre inscription',
] ),
],
] )
->add( 'password', RepeatedType::class, [
'type' => PasswordType::class,
'first_options' => [
'label' => 'Créer mon mot de passe',
'label_attr' => [
'class' => 'custom-account-label',
],
'attr' => [
'autocomplete' => 'new-password',
'data-parsley-error-message' => 'Le mot de passe doit contenir au moins 8 caractères, 1 majuscule, 1 minuscule, 1 chiffre et un caractère spécial @ $ ! % * ? &',
'data-parsley-pattern' => "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^A-Za-z0-9]).{8,}$",
'class' => 'custom-account-input',
],
],
'second_options' => [
'label' => 'Confirmer mon mot de passe',
'label_attr' => [
'class' => 'custom-account-label',
],
'attr' => [
'class' => 'custom-account-input',
],
],
'invalid_message' => 'Les champs de mot de passe doivent correspondre.',
// instead of being set onto the object directly,
// this is read and encoded in the controller
'mapped' => FALSE,
'required' => TRUE,
] )
;
}
}
/**
* @param OptionsResolver $resolver
*
* @return void
*/
public function configureOptions( OptionsResolver $resolver ): void
{
$resolver->setDefaults(
[
'data_class' => User::class,
]
);
}
}