<?php
namespace App\Profile\Form\Type\Auth;
use App\Profile\Model\Profile;
use Pimcore\Model\DataObject\Service;
use Pimcore\Tool;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CountryType;
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\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Intl\Languages;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Contracts\Translation\TranslatorInterface;
class RegisterType extends AbstractType
{
protected $translator;
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$user = new Profile();
$genderOptions = array_flip(Service::getOptionsForSelectField($user, 'gender'));
$customerOptions = array_flip(Service::getOptionsForSelectField($user, 'profileType'));
$titleOptions = array_flip(Service::getOptionsForSelectField($user, 'title'));
$profileTypeData = $builder->getData()->getProfileType();
$profileType = $profileTypeData ? $profileTypeData : $customerOptions['person'];
$languages = array_filter(Languages::getNames(), fn ($key) => in_array($key, Tool::getValidLanguages()), ARRAY_FILTER_USE_KEY);
$builder
->add('profileType', ChoiceType::class, [
'choices' => $customerOptions,
'data' => $profileType,
'required' => true,
'label' => 'auth.form.register.label.profileType',
'expanded' => true,
])
->add('country', CountryType::class, [
'preferred_choices' => ['DE', 'FR', 'GB', 'AT', 'CH'],
])
->add('gender', ChoiceType::class, [
'choices' => $genderOptions,
'data' => 'unknown',
'required' => true,
'label' => 'auth.form.register.label.gender',
])
->add('title', ChoiceType::class, [
'choices' => $titleOptions,
'required' => false,
])
->add('firstname', TextType::class, [
'required' => true,
'label' => 'auth.form.register.label.firstname',
'attr' => ['autocomplete' => 'given-name'],
'constraints' => [new NotBlank()],
])
->add('lastname', TextType::class, [
'required' => true,
'label' => 'auth.form.register.label.lastname',
'attr' => ['autocomplete' => 'family-name'],
'constraints' => [new NotBlank()],
])
->add('email', EmailType::class, [
'required' => true,
'label' => 'auth.form.register.label.email',
'attr' => ['autocomplete' => 'username'],
])
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'auth.form.register.error.password.matching',
'required' => true,
'constraints' => [new Length(['min' => 6])],
'error_mapping' => [
'.' => 'second',
],
'first_options' => [
'label' => 'auth.form.register.label.password',
'attr' => ['autocomplete' => 'new-password'],
],
'second_options' => [
'label' => 'auth.form.register.label.password.repeat',
'attr' => ['autocomplete' => 'new-password'],
],
])->add('preferredLanguage', ChoiceType::class, [
'choices' => array_flip($languages),
'required' => true,
'label' => 'auth.form.register.label.preferredLanguage',
])
->add('accept_privacy', CheckboxType::class, [
'label' => 'auth.form.register.label.accept_privacy',
'label_html' => true,
'required' => true,
])
->add('accept_termsofuse', CheckboxType::class, [
'label' => 'auth.form.register.label.accept_termsofuse',
'label_html' => true,
'required' => true,
])
->add('accept_oflegalage', CheckboxType::class, [
'label' => 'auth.form.register.label.accept_oflegalage',
'label_html' => true,
'required' => true,
])
->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$profileType = $event->getData()?->getProfileType();
if ($profileType == 'company') {
$form->add('vat', TextType::class, [
'required' => true,
'constraints' => [new NotBlank()],
]);
$form->add('company', TextType::class, [
'required' => true,
'constraints' => [new NotBlank()],
]);
}
})
;
}
}