<?php
namespace App\Form;
use App\Entity\User;
use App\Entity\UserCategory;
use App\String\Constant;
use App\Utility\DropdownValues;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\ChoiceList\ChoiceList;
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\TelType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UserType extends AbstractType
{
public const HONEYPOT_EMAIL_NAME = 'emailAddress';
public const HONEYPOT_FULLNAME_NAME = 'fullName';
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(self::HONEYPOT_EMAIL_NAME, TextType::class, [
'required' => false,
'attr' => [
'autocomplete' => 'nope',
'autofill' => false,
]
]) // honeypot email
->add(self::HONEYPOT_FULLNAME_NAME, TextType::class, [
'required' => false,
'attr' => [
'autocomplete' => 'nope',
'autofill' => false,
]
]) // honeypot full name
->add('roles', ChoiceType::class, [
'label_html' => true,
'choices' => [
'Donor/Funder' => Constant::ROLE_DONOR,
'Filmmaker' => Constant::ROLE_FILMMAKER,
'Impact Partner' => Constant::ROLE_SPONSOR,
'Documentary Lover' => Constant::ROLE_DOCUMENTARY_LOVER,
],
'expanded' => true,
'multiple' => true,
'attr' => [
'class' => 'col-3'
],
'label_attr' => [
'class' => 'user_roles-tile',
],
'choice_label' => function ($choice, $key, $value) {
switch($choice) {
case Constant::ROLE_DONOR: return '<i class="icons donor"></i> Donor/Funder';
case Constant::ROLE_FILMMAKER: return '<i class="icons filmmaker"></i> Filmmaker';
case Constant::ROLE_SPONSOR: return '<i class="icons sponsor"></i> Impact Partner';
case Constant::ROLE_DOCUMENTARY_LOVER: return '<i class="icons sponsor"></i> Documentary Lover';
}
return strtoupper($key);
},
])
->add('email', EmailType::class, [
'required' => true
])
->add('firstName', TextType::class, [
'required' => true
])
->add('lastName', TextType::class, [
'required' => true
])
->add('phone', TelType::class, [
'required' => true
])
->add('organisation', TextType::class, [
'required' => false
])
->add('categories', EntityType::class, [
'label_html' => true,
'multiple' => true,
'class' => UserCategory::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.name', 'ASC');
},
'choice_attr' => ChoiceList::attr($this, function (?UserCategory $category) {
return $category ? ['data-roles' => implode(',', $category->getRoles())] : [];
}),
])
->add('userRoles', ChoiceType::class, [
'label_html' => true,
'choices' => DropdownValues::USER_ROLE_VALUES,
'expanded' => false,
'multiple' => true,
'property_path'=>'userProfile.userRoles'
])
->add('areaInterest', ChoiceType::class, [
'label_html' => true,
'choices' => DropdownValues::IMPACT_VALUES,
'expanded' => true,
'multiple' => true,
])
->add('street', TextType::class, [
'property_path'=>'userAddress.street'
])
->add('city', TextType::class, [
'property_path'=>'userAddress.city'
])
->add('state', ChoiceType::class, [
'property_path'=>'userAddress.state',
'choices' => [
'ACT' => 'ACT',
'NSW' => 'NSW',
'NT' => 'NT',
'QLD' => 'QLD',
'SA' => 'SA',
'TAS' => 'TAS',
'VIC' => 'VIC',
'WA' => 'WA',
'Other State' => 'Other State',
],
'placeholder' => 'Select your state',
'empty_data' => null,
'required' => true,
])
->add('postcode', TextType::class, [
'property_path'=>'userAddress.postcode'
])
->add('country', CountryType::class, [
'property_path'=>'userAddress.country',
'empty_data' => null,
'required' => true,
'placeholder' => 'Select your country'
])
->add('gender', ChoiceType::class, [
'empty_data' => null,
'choices' => [
'Select your gender' => null,
'Male' => 'Male',
'Female' => 'Female',
'Non-binary' => 'Non-binary',
'Prefer not to say' => 'Prefer not to say',
]
])
->add('isAborigin', ChoiceType::class, [
'choices' => [
'No' => 'No',
'Yes' => 'Yes',
'Prefer not to say' => 'Prefer not to say',
],
'empty_data' => '',
'required' => false
])
->add('isDiverse', ChoiceType::class, [
'choices' => [
'No' => 'No',
'Yes' => 'Yes',
'Prefer not to say' => 'Prefer not to say',
],
'empty_data' => '',
'required' => false
])
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'first_options' => ['label' => 'Password'],
'second_options' => ['label' => 'Confirm Password']
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'csrf_protection' => false,
'data_class' => User::class,
]);
}
}