You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
5.9KB

  1. <?php
  2. namespace Lc\SovBundle\Form\Common;
  3. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  4. use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface;
  5. use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto;
  6. use Lc\SovBundle\Field\Filter\AssociationFilter;
  7. use Lc\SovBundle\Field\Filter\CheckboxFilter;
  8. use Lc\SovBundle\Field\Filter\ChoiceFilter;
  9. use Lc\SovBundle\Field\Filter\DateFilter;
  10. use Lc\SovBundle\Field\Filter\IntegerFilter;
  11. use Lc\SovBundle\Field\Filter\TextFilter;
  12. use Lc\SovBundle\Translation\TranslatorAdmin;
  13. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  14. use Symfony\Component\Form\AbstractType;
  15. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  16. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  17. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  18. use Symfony\Component\Form\Extension\Core\Type\DateType;
  19. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  20. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  21. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  22. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  23. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  24. use Symfony\Component\Form\Extension\Core\Type\TextType;
  25. use Symfony\Component\Form\FormBuilderInterface;
  26. use Symfony\Component\OptionsResolver\OptionsResolver;
  27. use function Symfony\Component\String\u;
  28. class FiltersFormType extends AbstractType
  29. {
  30. protected $translatorAdmin;
  31. public function __construct(TranslatorAdmin $translatorAdmin)
  32. {
  33. $this->translatorAdmin = $translatorAdmin;
  34. }
  35. public function buildForm(FormBuilderInterface $builder, array $options)
  36. {
  37. foreach ($options['fields'] as $field) {
  38. if ($field instanceof FieldInterface) {
  39. $fieldDto = $field->getAsDto();
  40. } else {
  41. $fieldDto = $field;
  42. }
  43. //POurt modifier le type de filtre filter_type
  44. //Pour désactiver le filtre sur un champ filter à false
  45. if ($fieldDto->isDisplayedOn(Crud::PAGE_INDEX) && $fieldDto->getCustomOption('filter')!==false) {
  46. if($fieldDto->getCustomOption('filter_fqcn')){
  47. $filterFqcn = $fieldDto->getCustomOption('filter_fqcn');
  48. $checkboxFilter = new $filterFqcn($this->translatorAdmin);
  49. $checkboxFilter->buildProperty($builder, $fieldDto, $options);
  50. }else {
  51. switch ($this->guessFormType($fieldDto)) {
  52. case CheckboxType::class:
  53. $checkboxFilter = new CheckboxFilter();
  54. $checkboxFilter->buildProperty($builder, $fieldDto);
  55. break;
  56. case ChoiceType::class:
  57. $choiceFilter = new ChoiceFilter($this->translatorAdmin);
  58. $choiceFilter->buildProperty($builder, $fieldDto, $options);
  59. break;
  60. case IntegerType::class:
  61. $integerFilter = new IntegerFilter();
  62. $integerFilter->buildProperty($builder, $fieldDto);
  63. break;
  64. case TextType::class:
  65. case EmailType::class:
  66. case TextareaType::class:
  67. $textFilter = new TextFilter();
  68. $textFilter->buildProperty($builder, $fieldDto);
  69. break;
  70. case DateTimeType::class:
  71. case DateType::class:
  72. $textFilter = new DateFilter();
  73. $textFilter->buildProperty($builder, $fieldDto);
  74. break;
  75. case EntityType::class:
  76. $associationFilter = new AssociationFilter();
  77. $associationFilter->buildProperty($builder, $fieldDto, $options);
  78. break;
  79. }
  80. }
  81. }
  82. }
  83. $builder->add(
  84. 'action_apply',
  85. SubmitType::class,
  86. array(
  87. 'label_html' => true,
  88. 'label' => '<i class="fa fa-search"></i>',
  89. 'attr' => array(
  90. 'class' => 'btn btn-sm btn-info',
  91. 'form' => 'filters-form',
  92. 'data-toggle' => "tooltip",
  93. 'title' => $this->translatorAdmin->transAction("apply"),
  94. 'aria-label' => $this->translatorAdmin->transAction("apply")
  95. ),
  96. )
  97. );
  98. $builder->add(
  99. 'action_reset',
  100. SubmitType::class,
  101. array(
  102. 'label_html' => true,
  103. 'label' => '<i class="fa fa-eraser"></i>',
  104. 'attr' => array(
  105. 'class' => 'btn btn-sm btn-warning lc-reset-filters',
  106. 'form' => 'filters-form',
  107. 'data-toggle' => "tooltip",
  108. 'title' => $this->translatorAdmin->transAction("reset"),
  109. 'aria-label' => $this->translatorAdmin->transAction("reset")
  110. ),
  111. )
  112. );
  113. $builder->add('reset', HiddenType::class);
  114. }
  115. public function configureOptions(OptionsResolver $resolver)
  116. {
  117. $resolver->setDefaults(
  118. [
  119. 'label' => false,
  120. 'csrf_protection' => false,
  121. 'entity_dto' => null,
  122. //'translation_domain' => 'lcshop',
  123. 'fields' => false,
  124. 'entity_name' => false,
  125. 'entity_class' => false,
  126. //'entityClass' => false
  127. ]
  128. );
  129. }
  130. protected function guessFormType(FieldDto $fieldDto){
  131. if($fieldDto->getCustomOption('filter_type')){
  132. return $fieldDto->getCustomOption('filter_type');
  133. }else{
  134. return$fieldDto->getFormType();
  135. }
  136. }
  137. }