<?php
namespace App\Form;
use App\Entity\Profile\JobseekerProfile;
use App\Entity\RecurrentJob;
use App\Entity\RecurrentJobsSearch\RecurrentJobsSearchParameters;
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\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
class RecurrentJobsSearchParametersType extends AbstractType
{
private LocationService $locationService;
public function __construct(LocationService $locationService)
{
$this->locationService = $locationService;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$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' => 'recurrent_jobs_search.form_page.zipcode_label'
]
);
$builder->add(
'filterSearchterm',
TextType::class,
[
'label' => 'recurrent_jobs.new_page.occupational_field_searchterm_placeholder'
]
);
$builder->add(
'filterAlreadyContacted',
CheckboxType::class,
[
'label' => 'recurrent_jobs.new_page.already_contacted',
'required' => false,
'data' => true
]
);
$builder->add(
'filterRequiredCareerLevels',
ChoiceType::class,
[
'required' => false,
'expanded' => true,
'multiple' => true,
'choices' => RecurrentJob::POSSIBLE_CAREER_LEVEL_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING,
'data' => RecurrentJob::POSSIBLE_CAREER_LEVEL_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING
]
);
$builder->add(
'filterRequiredEmploymentTypes',
ChoiceType::class,
[
'required' => false,
'expanded' => true,
'multiple' => true,
'choices' => RecurrentJob::POSSIBLE_EMPLOYMENT_TYPE_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING,
'data' => RecurrentJob::POSSIBLE_EMPLOYMENT_TYPE_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING
]
);
$builder->add(
'filterRequiredExperience',
ChoiceType::class,
[
'label' => 'recurrent_jobs_search.form_page.experience_label',
'choices' => JobseekerProfile::POSSIBLE_EXPERIENCES_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING,
'expanded' => true,
'multiple' => false
]
);
$builder->add(
'filterSuperiorSalary',
CheckboxType::class,
[
'label' => 'Bestbezahlte Jobs zuerst anzeigen',
'required' => false,
'data' => false
]
);
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' => RecurrentJobsSearchParameters::class,
'csrf_protection' => false,
]);
}
public function onPreSubmit(FormEvent $event)
{
$this->locationService->normalizeZipcode($event, 'filterZipcode');
}
}