No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

196 líneas
7.3KB

  1. <?php
  2. namespace Lc\SovBundle\Field\Filter;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use DoctrineExtensions\Query\Mysql\Field;
  5. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  6. use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface;
  7. use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
  8. use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto;
  9. use Lc\SovBundle\Repository\RepositoryQueryInterface;
  10. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  11. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  12. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  13. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  14. use Symfony\Component\Form\Extension\Core\Type\DateType;
  15. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  16. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  17. use Symfony\Component\Form\Extension\Core\Type\TextType;
  18. use Symfony\Component\Form\Form;
  19. use Symfony\Component\HttpFoundation\RequestStack;
  20. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  21. /**
  22. * @author La clic ! <contact@laclic.fr>
  23. */
  24. class FilterManager
  25. {
  26. protected $em;
  27. protected bool $isFiltered = false;
  28. use FilterTrait;
  29. public function __construct(SessionInterface $session, EntityManagerInterface $entityManager)
  30. {
  31. $this->session = $session;
  32. $this->em = $entityManager;
  33. }
  34. public function handleFiltersForm(RepositoryQueryInterface $repositoryQuery, Form $filtersForm, $fields, EntityDto $entityDto):bool
  35. {
  36. foreach ($fields as $field) {
  37. $filteredValue = array();
  38. if ($field instanceof FieldInterface) {
  39. $fieldDto = $field->getAsDto();
  40. } else {
  41. $fieldDto = $field;
  42. }
  43. if ($fieldDto->isDisplayedOn(Crud::PAGE_INDEX)) {
  44. if ($filtersForm->has($this->getFieldPropertySnake($fieldDto->getProperty()))) {
  45. if ($fieldDto->getFormType() === DateTimeType::class || $fieldDto->getFormType() === DateType::class) {
  46. $filteredValue['dateStart'] = $this->getFilteredValue(
  47. $filtersForm,
  48. $entityDto->getFqcn(),
  49. $fieldDto->getProperty(),
  50. 'dateStart'
  51. );
  52. $filteredValue['dateEnd'] = $this->getFilteredValue(
  53. $filtersForm,
  54. $entityDto->getFqcn(),
  55. $fieldDto->getProperty(),
  56. 'dateEnd'
  57. );
  58. if($filteredValue['dateStart'] || $filteredValue['dateEnd']){
  59. $this->isFiltered = true;
  60. }
  61. } else {
  62. $filteredValue['value'] = $this->getFilteredValue(
  63. $filtersForm,
  64. $entityDto->getFqcn(),
  65. $fieldDto->getProperty()
  66. );
  67. if($filteredValue['value'] ){
  68. $this->isFiltered = true;
  69. }
  70. }
  71. $this->applyFilter($repositoryQuery, $fieldDto, $filteredValue);
  72. }
  73. }
  74. }
  75. return $this->isFiltered;
  76. }
  77. public function applyFilter(RepositoryQueryInterface $repositoryQuery, FieldDto $fieldDto, array $filteredValue)
  78. {
  79. if ($fieldDto->getCustomOption('filter_fqcn')) {
  80. $filterFqcn = $fieldDto->getCustomOption('filter_fqcn');
  81. $customFilter = new $filterFqcn;
  82. $customFilter->applyFilter($repositoryQuery, $fieldDto, $filteredValue['value']);
  83. } else {
  84. switch ($fieldDto->getFormType()) {
  85. case CheckboxType::class:
  86. $checkboxFilter = new CheckboxFilter();
  87. $checkboxFilter->applyFilter($repositoryQuery, $fieldDto, $filteredValue['value']);
  88. break;
  89. case ChoiceType::class:
  90. $choiceFilter = new ChoiceFilter();
  91. $choiceFilter->applyFilter($repositoryQuery, $fieldDto, $filteredValue['value']);
  92. break;
  93. case IntegerType::class:
  94. $integerFilter = new IntegerFilter();
  95. $integerFilter->applyFilter($repositoryQuery, $fieldDto, $filteredValue['value']);
  96. break;
  97. case TextareaType::class:
  98. case TextType::class:
  99. $textFilter = new TextFilter();
  100. $textFilter->applyFilter($repositoryQuery, $fieldDto, $filteredValue['value']);
  101. break;
  102. case EntityType::class:
  103. $textFilter = new AssociationFilter();
  104. $textFilter->applyFilter($repositoryQuery, $fieldDto, $filteredValue['value']);
  105. break;
  106. case DateTimeType::class:
  107. case DateType::class:
  108. $textFilter = new DateFilter();
  109. $textFilter->applyFilter(
  110. $repositoryQuery,
  111. $fieldDto,
  112. $filteredValue['dateStart'],
  113. $filteredValue['dateEnd']
  114. );
  115. break;
  116. }
  117. }
  118. }
  119. public function getFilteredValue(
  120. Form $filtersForm,
  121. string $entityFqcn,
  122. string $field,
  123. string $dateExtraField = null
  124. )
  125. {
  126. $field = $this->getFieldPropertySnake($field);
  127. $sessionParam = $entityFqcn . $field . $dateExtraField;
  128. $formField = $this->getFormField($filtersForm, $field, $dateExtraField);
  129. $value = $formField->getData();
  130. //Il existe une valeur posté dans le formulaire
  131. if ($value !== null) {
  132. $this->session->set($sessionParam, $value);
  133. return $value;
  134. }
  135. //action reset
  136. if ($filtersForm->get('reset')->getData() == 'clearAll') {
  137. $this->session->remove($sessionParam);
  138. return null;
  139. }
  140. //Récupération des valeurs stocké en sessions si le forrmFilters n'a pas été posté
  141. if ($this->session->get($sessionParam) && !$filtersForm->isSubmitted() && $formField) {
  142. $value = $this->session->get($sessionParam);
  143. //Champ date
  144. if ($formField->getConfig()->getOption('input') == 'datetime') {
  145. $filtersForm->get($field)->get($dateExtraField)->setData($value);
  146. //Champ association
  147. } elseif ($formField->getConfig()->getOption('class')) {
  148. $valFormated = $this->em->getRepository(
  149. $formField->getConfig()->getOption('class')
  150. )->find($value);
  151. $filtersForm->get($field)->setData($valFormated);
  152. } else {
  153. //Champ noramux
  154. $filtersForm->get($field)->setData($value);
  155. }
  156. return $value;
  157. }
  158. }
  159. public function getFormField(Form $filtersForm, string $field, string $extraField = null): Form
  160. {
  161. if ($extraField) {
  162. return $filtersForm->get($field)->get($extraField);
  163. } else {
  164. return $filtersForm->get($field);
  165. }
  166. }
  167. }