<?php
/**
* Pimcore Customer Management Framework Bundle
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (C) Elements.at New Media Solutions GmbH
* @license GPLv3
*/
namespace App\Form\Auth;
use App\Form\DefaultFormType;
use App\Form\Type\PimcoreCountryType;
use Pimcore\Model\DataObject\Data\Consent;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Regex;
use Pimcore\Model\DataObject\CountryAndRegions;
use Symfony\Component\Form\FormInterface;
use Pimcore\Model\DataObject\Customer;
class RegisterFormType extends DefaultFormType
{
/**
* @inheritDoc
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$translator = $this->translator;
$customer = new Customer();
$prefixes = $customer->getClass()->getFieldDefinition('prefix');
$prefixOptions = [ $translator->trans('stoelting.forms.prefix.placeholder') => '' ];
foreach ($prefixes->getOptions() as $option) {
$prefixOptions[$option['key']] = $option['value'];
}
$builder->add(
'accountInformation',
FormType::class,
[
'label' => $translator->trans('stoelting.register.accountInformation-title'),
]
);
$builder->add(
'address',
FormType::class,
[
'label' => $translator->trans('stoelting.register.address-title'),
]
);
$builder->get('accountInformation')->add(
'email',
EmailType::class,
[
'label' => $this->translator->trans('stoelting.email'),
'attr' => [
'placeholder' => $this->translator->trans('stoelting.email.placeholder'),
],
'constraints' => [
new NotBlank([
'message' => $translator->trans('stoelting.email.required.message'),
]),
new Email([
'message' => $translator->trans('stoelting.invalid-email'),
'mode' => 'strict'
])
]
]
)->add(
'password',
RepeatedType::class,
[
'type' => PasswordType::class,
'invalid_message' => $translator->trans('stoelting.passwords-dont-match.required.message'),
'constraints' => [
new NotBlank(
[
'message' => $translator->trans('stoelting.password.required.message'),
]
),
new Length(
[
'min' => 8,
'minMessage' => $translator->trans('stoelting.password.min.message'),
]
)
],
'first_options' => [
'label' => $this->translator->trans('stoelting.password'),
'attr' => [
'placeholder' => $this->translator->trans(
'stoelting.password.placeholder'
)
]
],
'second_options' => [
'label' => $this->translator->trans('stoelting.password-confirmation'),
'attr' => [
'placeholder' => $this->translator->trans(
'stoelting.password-confirmation.placeholder'
)
]
],
]
)->add(
'prefix',
ChoiceType::class,
[
'label' => $translator->trans('stoelting.prefix'),
'placeholder' => $translator->trans('stoelting.prefix.placeholder'),
'multiple' => false,
'choices' => $prefixOptions,
'choice_attr' => function ($key, $val, $index) {
return empty($key) ? ['disabled' => 'disabled'] : [];
}
]
)->add(
'firstname',
TextType::class,
[
'label' => $this->translator->trans('stoelting.firstname'),
'attr' => [
'placeholder' => $this->translator->trans('stoelting.firstname.placeholder'),
],
'constraints' => [
new NotBlank(
[
'message' => $translator->trans('stoelting.firstname.required.message'),
]
)
]
]
)->add(
'lastname',
TextType::class,
[
'label' => $this->translator->trans('stoelting.lastname'),
'attr' => [
'placeholder' => $this->translator->trans('stoelting.lastname.placeholder'),
],
'constraints' => [
new NotBlank(
[
'message' => $translator->trans('stoelting.lastname.required.message'),
]
)
]
]
)->add(
'divisions',
ChoiceType::class,
[
'label' => $translator->trans('stoelting.divisions'),
'attr' => [
'placeholder' => $translator->trans('stoelting.divisions.select-area'),
],
'multiple' => true,
'choices' => [
'Neuroscience/ANY-maze' => 'neuroscience',
'Polygraph Instruments' => 'polygraph-instruments',
'Psychological Testing' => 'psychological-testing'
],
'constraints' => [
new NotBlank(
[
'message' => $translator->trans('stoelting.divisions.required.message'),
]
)
]
]
)->add(
'newsletter',
CheckboxType::class,
[
'label' => $translator->trans('stoelting.should-contact'),
]
);
$builder->get('accountInformation')->get('newsletter')->addModelTransformer(
new CallbackTransformer(
function ($newsletter) {
return $newsletter;
},
function ($newsletter) {
return new Consent($newsletter);
}
)
);
$builder->get('address')->add(
'company',
TextType::class,
[
'label' => $translator->trans('stoelting.company'),
'attr' => [
'placeholder' => $translator->trans('stoelting.enter-company'),
]
]
)->add(
'streetLine01',
TextType::class,
[
'label' => $translator->trans('stoelting.StreetLine02-required'),
'attr' => [
'placeholder' => $translator->trans('stoelting.enter-street'),
],
'constraints' => [
new NotBlank(
[
'message' => $translator->trans('stoelting.street-required.message'),
]
)
]
]
)->add(
'streetLine02',
TextType::class,
[
'label' => $translator->trans('stoelting.second-street'),
'attr' => [
'placeholder' => $translator->trans('stoelting.enter-second-street'),
],
]
)->add(
'city',
TextType::class,
[
'label' => $translator->trans('stoelting.city-required'),
'attr' => [
'placeholder' => $translator->trans('stoelting.enter-city'),
],
'constraints' => [
new NotBlank(
[
'message' => $translator->trans('stoelting.city-required.message'),
]
)
]
]
)->add(
'state',
TextType::class,
[
'label' => $translator->trans('stoelting.state'),
'attr' => [
'placeholder' => $translator->trans('stoelting.state'),
'class' => 'input-state-name'
],
'constraints' => [
new NotBlank(
[
'groups' => ['required_state'],
'message' => $translator->trans('stoelting.state-required.message'),
]
)
]
]
)->add(
'stateDisplay',
HiddenType::class,
[
'label' => false,
'attr' => [
'class' => 'input-state-display'
],
]
)->add(
'zipCode',
TextType::class,
[
'label' => $translator->trans('stoelting.zip-required'),
'attr' => [
'placeholder' => $translator->trans('stoelting.zip-street'),
],
'constraints' => [
new NotBlank(
[
'message' => $translator->trans('stoelting.zip-required.message'),
]
)
]
]
)->add(
'country',
PimcoreCountryType::class,
[
'label' => $translator->trans('stoelting.country-required'),
'attr' => [
'placeholder' => $translator->trans('stoelting.country'),
'class' => 'input-country-select'
],
'constraints' => [
new NotBlank(
[
'message' => $translator->trans('stoelting.country-required.message'),
]
)
]
]
)->add(
'phone',
TextType::class,
[
'label' => $translator->trans('stoelting.phone-required'),
'attr' => [
'placeholder' => $translator->trans('stoelting.enter-phone-number'),
],
'constraints' => [
new Regex(
[
'pattern' => '/\+?[0-9]/',
'message' => $translator->trans('stoelting.invalid-phone-number'),
]
)
]
]
)->add(
'fax',
TextType::class,
[
'label' => $translator->trans('stoelting.fax'),
'attr' => [
'placeholder' => $translator->trans('stoelting.enter-fax-number'),
],
]
);
$builder->get('accountInformation')->add(
'VATNumber',
TextType::class,
[
'label' => $translator->trans('stoelting.tax-exempt-number'),
'attr' => [
'placeholder' => $translator->trans('stoelting.enter-tax-exempt-number'),
],
]
);
$builder
->add('g-recaptcha-response', HiddenType::class, [
'attr' => [
'id' => 'g-recaptcha-response'
],
])
->add('action', HiddenType::class, [
'attr' => [
'id' => 'validate_captcha'
],
'data' => 'registerForm'
])
->add(
'save',
SubmitType::class,
[
'label' => $this->translator->trans('stoelting.register-submit'),
'attr' => [
'class' => 'btn btn-primary'
]
]
);
}
/**
* @inheritDoc
*/
public function getBlockPrefix()
{
return '';
}
/**
* @inheritDoc
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'validation_groups' => function (FormInterface $form) {
$data = $form->getData();
$address = $data['address'];
$countryCode = $address['country'] ?? null;
if ($countryCode) {
$country = CountryAndRegions::getByPath(CountryAndRegions::FOLDER_PATH.$countryCode);
if ($country && $country->getIsRegionRequired()) {
return ['Default', 'required_state'];
}
}
return ['Default'];
},
]);
}
}