vendor/croisiland/common-bundle/src/Form/CruiseSearchFullFormType.php line 34

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Croisiland\CommonBundle\Form;
  4. use Croisiland\CommonBundle\Filter\FilterInterface;
  5. use Croisiland\CommonBundle\Form\FilterType\CompaniesFilterType;
  6. use Croisiland\CommonBundle\Form\FilterType\CruiseCodeFilterType;
  7. use Croisiland\CommonBundle\Form\FilterType\DeparturePortsFilterType;
  8. use Croisiland\CommonBundle\Form\FilterType\DestinationsFilterType;
  9. use Croisiland\CommonBundle\Form\FilterType\DurationsFilterType;
  10. use Croisiland\CommonBundle\Form\FilterType\KeywordsFilterType;
  11. use Croisiland\CommonBundle\Form\FilterType\OffersFilterType;
  12. use Croisiland\CommonBundle\Form\FilterType\PaginationFilterType;
  13. use Croisiland\CommonBundle\Form\FilterType\PartnerFilterType;
  14. use Croisiland\CommonBundle\Form\FilterType\PeriodFilterType;
  15. use Croisiland\CommonBundle\Form\FilterType\PriceRangeFilterType;
  16. use Croisiland\CommonBundle\Form\FilterType\ShipsFilterType;
  17. use Croisiland\CommonBundle\Form\FilterType\SortOrderFilterType;
  18. use Croisiland\CommonBundle\Form\FilterType\TagsFilterType;
  19. use Croisiland\CommonBundle\Form\FilterType\WorldTourFilterType;
  20. use Croisiland\CommonBundle\Serializer\CruiseSearchModelSerializer;
  21. use Symfony\Component\Form\AbstractType;
  22. use Symfony\Component\Form\FormBuilderInterface;
  23. use Symfony\Component\Form\FormEvent;
  24. use Symfony\Component\Form\FormEvents;
  25. use Symfony\Component\OptionsResolver\OptionsResolver;
  26. use Symfony\Component\Routing\RouterInterface;
  27. /**
  28. * @extends AbstractType<CruiseSearchFullFormType>
  29. */
  30. class CruiseSearchFullFormType extends AbstractType
  31. {
  32. /**
  33. * @var FilterInterface[]
  34. */
  35. private array $filters;
  36. /**
  37. * @param iterable<FilterInterface> $filters
  38. */
  39. public function __construct(
  40. private readonly CruiseSearchModelSerializer $cruiseSearchModelSerializer,
  41. private readonly RouterInterface $router,
  42. iterable $filters,
  43. ) {
  44. $this->filters = $filters instanceof \Traversable ? iterator_to_array($filters) : $filters;
  45. }
  46. public function buildForm(FormBuilderInterface $builder, array $options): void
  47. {
  48. // Mappage des noms de champs vers leurs types
  49. $fieldTypes = [
  50. 'keywords' => KeywordsFilterType::class,
  51. 'cruiseCode' => CruiseCodeFilterType::class,
  52. 'period' => PeriodFilterType::class,
  53. 'priceRange' => PriceRangeFilterType::class,
  54. 'durations' => DurationsFilterType::class,
  55. 'worldTour' => WorldTourFilterType::class,
  56. 'companies' => CompaniesFilterType::class,
  57. 'partner' => PartnerFilterType::class,
  58. 'ships' => ShipsFilterType::class,
  59. 'destinations' => DestinationsFilterType::class,
  60. 'departurePorts' => DeparturePortsFilterType::class,
  61. 'tags' => TagsFilterType::class,
  62. 'offers' => OffersFilterType::class,
  63. ];
  64. // Ajouter les champs dans l'ordre spécifié
  65. foreach ($options['visible_fields'] as $fieldName => $fieldOptions) {
  66. if (isset($fieldTypes[$fieldName])) {
  67. $builder->add($fieldName, $fieldTypes[$fieldName], $fieldOptions);
  68. }
  69. }
  70. $builder
  71. ->add('order', SortOrderFilterType::class, [
  72. 'attr' => [
  73. 'class' => 'hidden',
  74. ],
  75. ])
  76. ->add('pagination', PaginationFilterType::class, [
  77. 'attr' => [
  78. 'class' => 'hidden',
  79. ],
  80. ])
  81. ;
  82. $builder->addEventListener(FormEvents::PRE_SET_DATA, [$this, 'onPreSetData']);
  83. $builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'onPreSubmit']);
  84. }
  85. public function onPreSetData(FormEvent $event): void
  86. {
  87. $form = $event->getForm();
  88. $data = $event->getData();
  89. foreach ($this->filters as $filter) {
  90. $filter->updateField(
  91. $form,
  92. $this->cruiseSearchModelSerializer->toSimpleArray($data)
  93. );
  94. }
  95. }
  96. public function onPreSubmit(FormEvent $event): void
  97. {
  98. $form = $event->getForm();
  99. $data = $event->getData();
  100. foreach ($this->filters as $filter) {
  101. $filter->updateField(
  102. $form,
  103. $this->cruiseSearchModelSerializer->simplifyFormData($data)
  104. );
  105. }
  106. }
  107. public function configureOptions(OptionsResolver $resolver): void
  108. {
  109. $resolver->setDefaults([
  110. 'translation_domain' => 'search-cruise-form',
  111. 'attr' => [
  112. 'id' => 'cruise-search-form-full',
  113. 'class' => 'common-search-engine-form',
  114. 'data-dynamic-options-url' => $this->router->generate('croisiland_common.get_dynamic-options'),
  115. ],
  116. 'visible_fields' => [
  117. 'keywords' => [],
  118. 'cruiseCode' => [],
  119. 'period' => [],
  120. 'priceRange' => [],
  121. 'durations' => [],
  122. 'worldTour' => [],
  123. 'companies' => [],
  124. 'partner' => [],
  125. 'ships' => [],
  126. 'destinations' => [],
  127. 'departurePorts' => [],
  128. 'tags' => [],
  129. 'offers' => [],
  130. 'order' => [],
  131. 'pagination' => [],
  132. 'submit' => [],
  133. 'reset' => [],
  134. ],
  135. ]);
  136. $resolver->setAllowedTypes('visible_fields', 'array');
  137. }
  138. }