<?php
namespace App\Form;
use App\Entity\Accent;
use App\Entity\AccentMapping;
use App\Entity\Country;
use App\Entity\Currency;
use App\Entity\Resource;
use App\Entity\ResourceSource;
use App\Entity\ScenarioAccentMapping;
use App\Repository\AccentMappingRepository;
use App\Repository\ScenarioAccentMappingRepository;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
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\EmailType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
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\Validator\Constraints\File;
use Symfony\Contracts\Translation\TranslatorInterface;
class ResourceRegisterType extends AbstractType
{
private $amRepo;
private $samRepo;
private $translator;
public function __construct(AccentMappingRepository $amRepo, ScenarioAccentMappingRepository $samRepo, TranslatorInterface $translator)
{
$this->amRepo = $amRepo;
$this->samRepo = $samRepo;
$this->translator = $translator;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Resource::class,
'translation_domain' => 'form',
]);
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$translator = $this->translator;
$activeMappings = $this->amRepo->findActive();
$scenarioActiveMappings = $this->samRepo->findActive();
$accents = [];
$ids = [];
/**
* @var AccentMapping $mapping
*/
foreach ($activeMappings as $mapping) {
if (!in_array($mapping->getAccent()->getId(), $ids)) {
$ids[] = $mapping->getAccent()->getId();
$accents[] = $mapping->getAccent();
}
}
/**
* @var ScenarioAccentMapping $mapping
*/
foreach ($scenarioActiveMappings as $mapping) {
if (!in_array($mapping->getAccent()->getId(), $ids)) {
$ids[] = $mapping->getAccent()->getId();
$accents[] = $mapping->getAccent();
}
}
$builder
->add('firstname', TextType::class, [
'required' => true,
'label' => 'Firstname',
])
->add('lastname', TextType::class, [
'required' => true,
'label' => 'Lastname',
])
->add('email', EmailType::class, [
'required' => true,
'label' => 'E-mail',
])
->add('phone', TelType::class, [
'required' => true,
'label' => 'Phone',
])
->add('gender', ChoiceType::class, [
'required' => true,
'choices' => array_flip(Resource::RESOURCE_GENDER),
'label' => 'Gender',
'translation_domain' => 'misc',
'attr' => [
'class' => 'custom',
]
])
->add('age', ChoiceType::class, [
'required' => true,
'choices' => array_flip(Resource::RESOURCE_AGE),
'label' => 'Age',
'translation_domain' => 'misc',
'attr' => [
'class' => 'custom',
]
])
->add('ethnicGroup', ChoiceType::class, [
'required' => false,
'choices' => array_flip(Resource::RESOURCE_ETHNICITY),
'label' => 'Etchnicity',
'translation_domain' => 'misc',
])
->add('education', ChoiceType::class, [
'required' => false,
'choices' => array_flip(Resource::RESOURCE_EDUCATION),
'label' => 'Study level',
'translation_domain' => 'misc',
])
->add('parentsEducation', ChoiceType::class, [
'required' => false,
'choices' => array_flip(Resource::RESOURCE_EDUCATION),
'label' => 'Parents Study level',
'translation_domain' => 'misc',
])
->add('country', EntityType::class, [
'required' => true,
'class' => Country::class,
'choice_label' => 'name',
'label' => 'Country',
'translation_domain' => 'countries',
'choice_translation_domain' => 'countries',
'attr' => [
'class' => 'custom',
]
])
->add('currency', EntityType::class, [
'required' => true,
'class' => Currency::class,
'choice_label' => 'display',
'label' => 'Currency',
'translation_domain' => 'misc',
'choice_translation_domain' => 'misc',
'attr' => [
'class' => 'custom',
],
])
->add('accent', EntityType::class, [
'required' => true,
'class' => Accent::class,
'choices' => $accents,
'choice_label' => function(Accent $accent) use ($translator) {
return implode(' - ', [
$translator->trans($accent->getLang(), [], 'languages'),
$translator->trans($accent->getCountry(), [], 'countries'),
$translator->trans($accent->getDisplay(), [], 'accents'),
]);
},
'label' => 'Geographical area / Accent',
'translation_domain' => 'accents',
'choice_translation_domain' => false,
'placeholder' => '',
'attr' => [
'class' => 'custom',
]
])
->add('source', EntityType::class, [
'required' => true,
'empty_data' => 'other',
'label' => 'How did you find us?',
'class' => ResourceSource::class,
'choice_label' => 'display',
'translation_domain' => 'resource_sources',
'choice_translation_domain' => 'resource_sources',
'query_builder' => function (EntityRepository $repo) {
return $repo->createQueryBuilder('rs')->addOrderBy('rs.sequence', 'ASC')->addOrderBy('rs.display', 'ASC');
},
])
->add('sample_file', FileType::class, [
'required' => true,
'label' => false,
'mapped' => false,
'constraints' => [
new File([
'mimeTypes' => [
'audio/*',
'video/ogg',
],
'mimeTypesMessage' => 'Please upload an audio file',
]),
],
])
->add('sponsor_code', TextType::class, [
'required' => false,
'mapped' => false,
])
->add('tra_acceptance', CheckboxType::class, [
'required' => true,
'mapped' => false,
])
->add('submit', SubmitType::class, [
'label' => 'Submit',
])
;
}
}