<?php
namespace App\Form;
use App\Entity\Option;
use App\Entity\User;
use App\Form\MediaVichType;
use App\Repository\OptionRepository;
use Psr\Log\LoggerInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
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\IsTrue;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Contracts\Translation\TranslatorInterface;
use Rollerworks\Component\PasswordStrength\Validator\Constraints as RollerworksPassword;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\FormError;
class RegistrationSimpleFormType extends AbstractType
{
private $logger;
private $optionRepository;
private $translator;
public function __construct(
LoggerInterface $logger,
OptionRepository $optionRepository,
TranslatorInterface $translator
) {
$this->logger = $logger;
$this->optionRepository = $optionRepository;
$this->translator = $translator;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$policyTermsUrl = $this->optionRepository->getValueByKey(Option::URL_POLICY_TERMS, "#");
$useConditionsUrl = $this->optionRepository->getValueByKey(Option::URL_USE_CONDITION, "#");
$builder
->add('nickname', TextType::class, [
'label' => false,
'attr' => [
'placeholder' => 'general.nickname',
'class' => 'form-control required-placeholder'
]
])
->add('email', TextType::class, [
'label' => false,
'attr' => [
'placeholder' => 'general.email',
'class' => 'form-control required-placeholder'
]
])
->add('cpostal', TextType::class, [
'label' => false,
'attr' => [
'placeholder' => 'general.cpostal',
'class' => 'form-control required-placeholder'
]
])
->add('agreeTerms', CheckboxType::class, [
'label_html' => true,
'label' => $this->translator->trans('general.agree_terms', ['%useConditionsUrl%' => $useConditionsUrl, '%policyTermsUrl%' => $policyTermsUrl], 'messages') . ' *',
'mapped' => false,
'row_attr' => [
'class' => 'checkbox-inline',
],
'required' => true,
'constraints' => [
new IsTrue([
'message' => $this->translator->trans('general.shouldAgreeTerms'),
]),
],
])
->add('legalAge', CheckboxType::class, [
'label' => $this->translator->trans('login.legalAge'). ' *',
'required' => true,
'data' => false
])
->add('username', HiddenType::class, [])
->add('recaptchaToken', HiddenType::class, [
'mapped' => false,
]);
$builder
->addEventListener(
FormEvents::PRE_SET_DATA,
[$this, 'onPreSetData']
)
->addEventListener(
FormEvents::PRE_SUBMIT,
[$this, 'onPreSubmit']
)
->addEventListener(
FormEvents::POST_SUBMIT,
[$this, 'onPostSubmit']
);
}
public function onPreSetData(FormEvent $event): void
{
$user = $event->getData();
$form = $event->getForm();
$minLength = $this->optionRepository->getValueByKey(Option::PASSWORD_MINIMUM_LENGTH, 8);
$minStrength = $this->optionRepository->getValueByKey(Option::PASSWORD_MINIMUM_STRENGTH, 3);
$passwordConstraints = [
new RollerworksPassword\PasswordStrength([
"minLength" => $minLength,
"minStrength" => $minStrength,
"tooShortMessage" => $this->translator->trans('validators.PasswordStrength.tooShort', ["%length%" => $minLength], "validators"),
"message" => $this->translator->trans('validators.PasswordStrength.message', [], "validators"),
])
];
//Require non empty passwords
$passwordConstraints[] = new NotBlank();
if ($user && !$user->getUsername()) {
$form->add('plainPassword', PasswordType::class, [
'label' => false,
'attr' => [
'placeholder' => 'general.password',
'class' => 'form-control required-placeholder'
],
'mapped' => false,
'required' => true,
'constraints' => $passwordConstraints,
]);
} else {
$form->add('plainPassword', HiddenType::class, [
'mapped' => false,
'required' => false,
'data' => bin2hex(random_bytes(16))
]);
}
}
public function onPreSubmit(FormEvent $event): void
{
$form = $event->getForm();
$data = $event->getData();
if (empty($data['username']) && !empty($data['email'])) {
$email = $data['email'];
//Make empty emails transform to NULL
if (trim($email) === '') {
$email = null;
}
if (!$email) {
$this->logger->error("Failed to retrieve email information to setup user.username field value in " . __METHOD__);
}
$data['username'] = $email;
$event->setData($data);
}
}
public function onPostSubmit(FormEvent $event): void
{
$form = $event->getForm();
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}