src/Form/RegistrationType.php line 25

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\Instrument;
  4. use App\Entity\User;
  5. use DateTime;
  6. use Doctrine\ORM\EntityRepository;
  7. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  8. use Symfony\Component\Form\AbstractType;
  9. use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
  10. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  11. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  12. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  13. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  14. use Symfony\Component\Form\Extension\Core\Type\TextType;
  15. use Symfony\Component\Form\FormBuilderInterface;
  16. use Symfony\Component\Form\FormEvent;
  17. use Symfony\Component\Form\FormEvents;
  18. use Symfony\Component\OptionsResolver\OptionsResolver;
  19. use Symfony\Component\Validator\Constraints\Length;
  20. use Symfony\Component\Validator\Constraints\NotBlank;
  21. use Symfony\Contracts\Translation\TranslatorInterface;
  22. class RegistrationType extends AbstractType
  23. {
  24.     private TranslatorInterface $translator;
  25.     public function __construct(TranslatorInterface $translator)
  26.     {
  27.         $this->translator $translator;
  28.     }
  29.     public function buildForm(FormBuilderInterface $builder, array $options): void
  30.     {
  31.         $label 'label';
  32.         $translationDomain 'translation_domain';
  33.         $required 'required';
  34.         $external 'external';
  35.         $currentDateTime = new DateTime();
  36.         $dateFormat $currentDateTime->format('Y-m-d');
  37.         $builder
  38.             ->add('email'EmailType::class, [$label => 'form.email'$translationDomain => 'users'])
  39.             ->add('username'null, [$label => 'form.username'$translationDomain => 'users'])
  40.             ->add('plainPassword'RepeatedType::class, [
  41.                 'type' => PasswordType::class,
  42.                 'constraints' => [
  43.                     new NotBlank(['message' => 'user.password.blank']),
  44.                     new Length(['min' => 6'minMessage' => 'user.password.short']),
  45.                 ],
  46.                 'options' => [
  47.                     'translation_domain' => 'users',
  48.                     'attr' => [
  49.                         'autocomplete' => 'new-password',
  50.                     ],
  51.                 ],
  52.                 'first_options' => [$label => 'form.password'],
  53.                 'second_options' => [$label => 'form.password_confirmation'],
  54.                 'invalid_message' => 'user.password.mismatch',
  55.             ])
  56.             ->add(
  57.                 'firstname',
  58.                 TextType::class,
  59.                 array($label => 'profile.form.firstname'$required => false)
  60.             )
  61.             ->add(
  62.                 'lastName',
  63.                 TextType::class,
  64.                 array($label => 'profile.form.lastName'$required => false)
  65.             )
  66.             ->add('instruments'EntityType::class, array(
  67.                 'class' => Instrument::class,
  68.                 'choice_label' => 'name',
  69.                 'label' => 'bandMember.form.instruments',
  70.                 'translation_domain' => 'messages',
  71.                 'choice_translation_domain' => 'messages',
  72.                 'required'  => false,
  73.                 'multiple'  => true,
  74.                 'expanded'  => false,
  75.                 'attr' => array('class' => 'multiple-select'),
  76.                 'query_builder' => function (EntityRepository $er) {
  77.                     return $er->createQueryBuilder('instruments')
  78.                         ->orderBy('instruments.name''ASC');
  79.                 },
  80.             ))
  81.             ->add($external,HiddenType::class, array('mapped' => false))
  82.             ->add('birthday'BirthdayType::class, array(
  83.                 $label => 'profile.form.birthday',
  84.                 'attr' => array('placeholder' => $this->translator->trans('common.example').': '.$dateFormat),
  85.                 'placeholder' => $dateFormat,
  86.                 'invalid_message' => $this->translator->trans(
  87.                     'event.form.invalid_date_format',
  88.                     ['format' => $dateFormat]
  89.                 ),
  90.                 'widget' => 'single_text',
  91.                 'format' => 'yyyy-MM-dd',
  92.                 $required  => true,
  93.             ));
  94.         $builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) use ($external) {
  95.             $data $event->getData();
  96.             if (isset($data[$external]) && $data[$external] === 'true') {
  97.                 $uniq uniqid();
  98.                 $data['plainPassword'] = ['first' => $uniq'second' => $uniq];
  99.                 $event->setData($data);
  100.             }
  101.         });
  102.     }
  103.     public function configureOptions(OptionsResolver $resolver): void
  104.     {
  105.         $resolver->setDefaults([
  106.             'data_class' => User::class,
  107.         ]);
  108.     }
  109. }