<?php
namespace App\Form;
use App\Entity\Profile\JobseekerProfile;
use App\Entity\WantedJob;
use App\Entity\WantedJobsSearch\WantedJobsSearchParameters;
use App\Service\LocationService;
use App\Value\PossibleAvailabilitiesValue;
use App\Value\ZipcodeRadiusesValue;
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\HiddenType;
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\OptionsResolver\OptionsResolver;
class WantedJobsSearchParametersType extends AbstractType
{
private LocationService $locationService;
public function __construct(LocationService $locationService)
{
$this->locationService = $locationService;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
'filterSearchterm',
TextType::class,
[
'label' => 'recurrent_jobs.new_page.occupational_field_searchterm_intro'
]
);
$builder->add(
'filterZipcodeRadius',
ChoiceType::class,
[
'choices' => array_flip(ZipcodeRadiusesValue::ALL_ASSOCIATIVE),
'choice_label' => function (int $number): string {
return $number . 'km';
},
'label' => '',
'data' => ZipcodeRadiusesValue::DEFAULT
]
);
$builder->add(
'filterZipcode',
TextType::class,
[
'label' => 'wanted_jobs_search.form_page.zipcode_label'
]
);
$builder->add(
'filterAlreadyContacted',
CheckboxType::class,
[
'label' => 'wanted_jobs.new_page.already_contacted',
'required' => false,
'data' => true
]
);
$builder->add(
'filterRequiredCareerLevels',
ChoiceType::class,
[
'required' => false,
'expanded' => true,
'multiple' => true,
'choices' => WantedJob::POSSIBLE_CAREER_LEVEL_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING,
'data' => WantedJob::POSSIBLE_CAREER_LEVEL_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING
]
);
$builder->add(
'filterRequiredEmploymentTypes',
ChoiceType::class,
[
'required' => false,
'expanded' => true,
'multiple' => true,
'choices' => WantedJob::POSSIBLE_EMPLOYMENT_TYPE_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING,
'data' => WantedJob::POSSIBLE_EMPLOYMENT_TYPE_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING
]
);
$builder->add(
'filterRequiredExperience',
ChoiceType::class,
[
'label' => 'wanted_jobs_search.form_page.experience_label',
'choices' => JobseekerProfile::POSSIBLE_EXPERIENCES_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING,
'expanded' => true,
'multiple' => false
]
);
$builder->add(
'atLeastOneRequiredCareerLevelMustMatch',
HiddenType::class,
[
'data' => '0',
'empty_data' => '0'
]
);
$builder->add(
'atLeastOneRequiredEmploymentTypeMustMatch',
HiddenType::class,
[
'data' => '0',
'empty_data' => '0'
]
);
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$builder->add(
'filterIsRequiredOn' . $weekday . $timeOfDay,
CheckboxType::class,
[
'required' => false,
'label' => false
]
);
}
}
$builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'onPreSubmit']);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => WantedJobsSearchParameters::class,
'csrf_protection' => false,
]);
}
public function onPreSubmit(FormEvent $event)
{
$this->locationService->normalizeZipcode($event, 'filterZipcode');
}
}