<?php
namespace App\Form;
use App\Entity\Instrument;
use App\Entity\User;
use DateTime;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
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\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Contracts\Translation\TranslatorInterface;
class RegistrationType extends AbstractType
{
private TranslatorInterface $translator;
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$label = 'label';
$translationDomain = 'translation_domain';
$required = 'required';
$external = 'external';
$currentDateTime = new DateTime();
$dateFormat = $currentDateTime->format('Y-m-d');
$builder
->add('email', EmailType::class, [$label => 'form.email', $translationDomain => 'users'])
->add('username', null, [$label => 'form.username', $translationDomain => 'users'])
->add('plainPassword', RepeatedType::class, [
'type' => PasswordType::class,
'constraints' => [
new NotBlank(['message' => 'user.password.blank']),
new Length(['min' => 6, 'minMessage' => 'user.password.short']),
],
'options' => [
'translation_domain' => 'users',
'attr' => [
'autocomplete' => 'new-password',
],
],
'first_options' => [$label => 'form.password'],
'second_options' => [$label => 'form.password_confirmation'],
'invalid_message' => 'user.password.mismatch',
])
->add(
'firstname',
TextType::class,
array($label => 'profile.form.firstname', $required => false)
)
->add(
'lastName',
TextType::class,
array($label => 'profile.form.lastName', $required => false)
)
->add('instruments', EntityType::class, array(
'class' => Instrument::class,
'choice_label' => 'name',
'label' => 'bandMember.form.instruments',
'translation_domain' => 'messages',
'choice_translation_domain' => 'messages',
'required' => false,
'multiple' => true,
'expanded' => false,
'attr' => array('class' => 'multiple-select'),
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('instruments')
->orderBy('instruments.name', 'ASC');
},
))
->add($external,HiddenType::class, array('mapped' => false))
->add('birthday', BirthdayType::class, array(
$label => 'profile.form.birthday',
'attr' => array('placeholder' => $this->translator->trans('common.example').': '.$dateFormat),
'placeholder' => $dateFormat,
'invalid_message' => $this->translator->trans(
'event.form.invalid_date_format',
['format' => $dateFormat]
),
'widget' => 'single_text',
'format' => 'yyyy-MM-dd',
$required => true,
));
$builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) use ($external) {
$data = $event->getData();
if (isset($data[$external]) && $data[$external] === 'true') {
$uniq = uniqid();
$data['plainPassword'] = ['first' => $uniq, 'second' => $uniq];
$event->setData($data);
}
});
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}