<?php
namespace App\Form;
use App\Component\Captcha\Form\CaptchaType;
use App\Component\Configuration\Util\Config;
use App\Entity\User;
use App\Util\TokenGenerator;
use Symfony\Component\Form\AbstractType;
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;
class RegisterUserType extends AbstractType
{
public function __construct(
private readonly Config $config,
) {
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($this->config->get('site_user_register_with_first_and_last_name')) {
$builder
->add('firstName', TextType::class, [
'required' => true,
])
->add('lastName', TextType::class, [
'required' => true,
])
;
}
$builder->add('email', EmailType::class, [
'required' => true,
]);
if ($this->config->get('site_user_register_with_username')) {
$builder->add('username', TextType::class, [
'required' => true,
]);
} else {
$builder->add('username', HiddenType::class);
}
if ($this->config->get('site_user_register_with_city')) {
$builder->add('city', TextType::class, [
'required' => true,
]);
}
if ($this->config->get('site_user_register_with_password')) {
$builder->add('plainPassword', RepeatedType::class, [
'type' => PasswordType::class,
'required' => true,
'options' => ['attr' => ['class' => 'password-field']],
'first_options' => ['label' => 'Password'],
'second_options' => ['label' => 'Repeat password'],
]);
} else {
$builder->add('plainPassword', HiddenType::class);
}
$builder->add('captcha', CaptchaType::class);
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
/** @var User $user */
$user = $event->getData();
if (!$user->getUsername()) {
$event->setData($user->setUsername($user->getEmail()));
}
if (!$user->getPlainPassword()) {
$event->setData($user->setPlainPassword(TokenGenerator::generateToken()));
// If password was generated: send a reset password mail
$event->setData($user->setPasswordRequestedAt(new \DateTime()));
}
});
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
'translation_domain' => 'user_data',
]);
}
}