<?php
namespace App\Form;
use App\Dto\ProfileFilterFormData;
use App\Dto\ProfileFilterFormDataFilters;
use App\Form\Type\ProfileFiltersType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\DataMapperInterface;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ProfileFilterForm extends AbstractType implements DataMapperInterface
{
/**
* @inheritDoc
*/
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('listing', HiddenType::class, [
'required' => true,
]);
$builder->add('listing_parameters', HiddenType::class, [
'required' => false,
]);
$builder->add('filters', ProfileFiltersType::class, [
'required' => false,
'listing' => isset($options['form_data']) ? ($options['form_data'])->listing : null,
'listing_parameters' => isset($options['form_data']) ? ($options['form_data'])->listingParameters : null,
'profiles_presence_by_filters' => $options['profiles_presence_by_filters'] ?? null,
]);
$builder->add('submit', SubmitType::class, [
]);
$builder->setDataMapper($this);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefined('form_data');
$resolver->setAllowedTypes('form_data', ProfileFilterFormData::class);
$resolver->setAllowedTypes('form_data', null);
$resolver->setDefined('profiles_presence_by_filters');
$resolver->setAllowedTypes('profiles_presence_by_filters', 'array');
$resolver->setAllowedTypes('profiles_presence_by_filters', null);
$resolver->setDefaults([
'data_class' => ProfileFilterFormData::class,
'empty_data' => null,
]);
}
/**
* @inheritDoc
*/
public function mapDataToForms($data, $forms)
{
if (null === $data) {
return null;
}
if (!$data instanceof ProfileFilterFormData) {
throw new UnexpectedTypeException($data, ProfileFilterFormData::class);
}
/** @var FormInterface[] $forms */
$forms = iterator_to_array($forms);
/** @var ProfileFilterFormData */
$forms['listing']->setData($data->listing);
$forms['listing_parameters']->setData(json_encode($data->listingParameters));
$forms['filters']->setData($data->filters);
}
/**
* @inheritDoc
*/
public function mapFormsToData($forms, &$viewData): void
{
/** @var FormInterface[] $forms */
$forms = iterator_to_array($forms);
if (!$viewData instanceof ProfileFilterFormData) {
$viewData = new ProfileFilterFormData('', [], new ProfileFilterFormDataFilters());
}
$viewData->listing = $forms['listing']->getData();
$viewData->listingParameters = json_decode($forms['listing_parameters']->getData(), true);
$viewData->filters = $forms['filters']->getData();
}
}