<?php
namespace FMT\Application\FormType;
use FMT\Data\Entity\User;
use FMT\Data\Entity\UserProfile;
use FMT\Data\Entity\UserSchool;
use FMT\Domain\Repository\UserSchoolRepositoryInterface;
use FMT\Application\Validator\Constraints\FmtEmail;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Regex;
/**
* Class UserProfileType
* @package FMT\Application\FormType\UserProfile
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class UserProfileType extends AbstractType
{
/** @var UserSchoolRepositoryInterface */
private $schoolRepository;
private TokenStorageInterface $tokenStorage;
/**
* UserProfileType constructor.
* @param UserSchoolRepositoryInterface $schoolRepository
*/
public function __construct(UserSchoolRepositoryInterface $schoolRepository, TokenStorageInterface $tokenStorage)
{
$this->schoolRepository = $schoolRepository;
$this->tokenStorage = $tokenStorage;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$user = $this->getUser();
if($user && ($user->isDonor() || $user->isIncompleteDonor())){
$otherEmailContraints = [
new Length([
'max' => 255,
])
];
} else {
$otherEmailContraints = [
new NotBlank(),
new Length([
'max' => 255,
]),
//new FmtEmail(), // remove this for now - no email validation as this is just a fallback
];
}
$builder
->add('firstName', TextType::class, [
'label' => $options['isLabelNeeded'] ? 'fmt.form.first_name' : false,
'required' => true,
'attr' => [
'placeholder' => 'First Name',
],
'constraints' => [
new NotBlank(),
new Length([
'min' => 2,
'max' => 255,
]),
],
])
->add('lastName', TextType::class, [
'label' => $options['isLabelNeeded'] ? 'fmt.form.last_name' : false,
'required' => true,
'attr' => [
'placeholder' => 'Last Name',
],
'constraints' => [
new NotBlank(),
new Length([
'min' => 2,
'max' => 255,
]),
],
])
->add('phone', TelType::class, [
'label' => $options['isLabelNeeded'] ? 'fmt.form.phone' : false,
'required' => true,
'attr' => [
'placeholder' => 'fmt.form.phone',
],
'constraints' => [
new NotBlank(),
new Regex([
'pattern' => '/[0-9]{3}-[0-9]{3}-[0-9]{4}/',
'match' => true,
'message' => 'fmt.sign_up.phone',
])
],
])
->add('school', EntityType::class, [
'label' => $options['isLabelNeeded'] ? 'fmt.form.school' : false,
'required' => true,
'disabled' => $options['isSchoolDisabled'],
'class' => UserSchool::class,
'choices' => $this->schoolRepository->getSchoolsCollection($this->getUser(), true),
'choice_label' => 'name',
])
->add('snapchatId', TextType::class, [
'required' => false,
'label' => $options['isLabelNeeded'] ? 'fmt.user.profile.label.snapchat' : false,
'attr' => [
'placeholder' => 'fmt.user.profile.snapchat_placeholder'
],
'constraints' => [
new Length([
'max' => 255,
]),
],
])
->add('facebookMessengerId', TextType::class, [
'required' => false,
'label' => $options['isLabelNeeded'] ? 'fmt.user.profile.label.facebook_messenger' : false,
'attr' => [
'placeholder' => 'fmt.user.profile.facebook_messenger_placeholder'
],
'constraints' => [
new Length([
'max' => 255,
]),
],
])
->add('otherEmail', EmailType::class, [
'required' => ($user && ($user->isDonor() || $user->isIncompleteDonor()))?false:true,
'label' => $options['isLabelNeeded'] ? 'fmt.user.profile.label.other_email' : false,
'attr' => [
'placeholder' => 'fmt.user.profile.other_email_placeholder'
],
'constraints' => $otherEmailContraints,
]);
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(
[
'data_class' => UserProfile::class,
'validation_groups' => ['Default', 'UserPortal'],
'attr' => ['novalidate' => true],
'isLabelNeeded' => false,
'isSchoolDisabled' => false
]
);
$resolver->setAllowedTypes('isLabelNeeded', ['boolean']);
$resolver->setAllowedTypes('isSchoolDisabled', ['boolean']);
}
/**
* @return UserInterface|null
*/
private function getUser(): ?UserInterface
{
$user = $this->tokenStorage->getToken()->getUser();
if ($user instanceof UserInterface) {
return $user;
}
return null;
}
}