*/ class FilterManager { protected $em; use FilterTrait; public function __construct(SessionInterface $session, EntityManagerInterface $entityManager) { $this->session = $session; $this->em = $entityManager; } public function handleFiltersForm(QueryBuilder $queryBuilder, Form $filtersForm, $fields, EntityDto $entityDto) { foreach ($fields as $field) { if ($field instanceof FieldInterface) { $fieldDto = $field->getAsDto(); } else { $fieldDto = $field; } if ($fieldDto->isDisplayedOn(Crud::PAGE_INDEX)) { if ($filtersForm->has($this->getFieldPropertySnake($fieldDto->getProperty()))) { if ($fieldDto->getFormType() === DateTimeType::class || $fieldDto->getFormType( ) === DateType::class) { $filteredValue['dateStart'] = $this->getFilteredValue( $filtersForm, $entityDto->getFqcn(), $fieldDto->getProperty(), 'dateStart' ); $filteredValue['dateEnd'] = $this->getFilteredValue( $filtersForm, $entityDto->getFqcn(), $fieldDto->getProperty(), 'dateEnd' ); }else{ $filteredValue = $this->getFilteredValue( $filtersForm, $entityDto->getFqcn(), $fieldDto->getProperty() ); } $this->applyFilter($queryBuilder, $fieldDto, $filteredValue); } } } } public function applyFilter(QueryBuilder $queryBuilder, FieldDto $fieldDto, $filteredValue) { switch ($fieldDto->getFormType()) { case CheckboxType::class: $checkboxFilter = new CheckboxFilter(); $checkboxFilter->applyFilter($queryBuilder, $fieldDto->getProperty(), $filteredValue); break; case ChoiceType::class: $choiceFilter = new ChoiceFilter(); $choiceFilter->applyFilter($queryBuilder, $fieldDto->getProperty(), $filteredValue); break; case IntegerType::class: $integerFilter = new IntegerFilter(); $integerFilter->applyFilter($queryBuilder, $fieldDto->getProperty(), $filteredValue); break; case TextType::class: $textFilter = new TextFilter(); $textFilter->applyFilter($queryBuilder, $fieldDto->getProperty(), $filteredValue); break; case EntityType::class: $textFilter = new AssociationFilter(); $textFilter->applyFilter($queryBuilder, $fieldDto->getProperty(), $filteredValue); break; case DateTimeType::class: case DateType::class: $textFilter = new DateFilter(); $textFilter->applyFilter( $queryBuilder, $fieldDto->getProperty(), $filteredValue['dateStart'], $filteredValue['dateEnd'] ); break; } } public function getFilteredValue( Form $filtersForm, string $entityFqcn, string $field, string $dateExtraField = null ) { $field = $this->getFieldPropertySnake($field); $sessionParam = $entityFqcn.$field.$dateExtraField; $formField = $this->getFormField($filtersForm, $field, $dateExtraField); $value = $formField->getData(); //Il existe une valeur posté dans le formulaire if ($value !== null) { $this->session->set($sessionParam, $value); return $value; } //action reset if ($filtersForm->get('reset')->getData() == 'clearAll') { $this->session->remove($sessionParam); return null; } //Récupération des valeurs stocké en sessions si le forrmFilters n'a pas été posté if ($this->session->get($sessionParam) && !$filtersForm->isSubmitted() && $formField) { $value = $this->session->get($sessionParam); //Champ date if ($formField->getConfig()->getOption('input') == 'datetime') { $filtersForm->get($field)->get($dateExtraField)->setData($value); //Champ association } elseif ($formField->getConfig()->getOption('class')) { $valFormated = $this->em->getRepository( $formField->getConfig()->getOption('class') )->find($value); $filtersForm->get($field)->setData($valFormated); } else { //Champ noramux $filtersForm->get($field)->setData($value); } return $value; } } public function getFormField( Form $filtersForm, string $field, string $extraField = null ): Form { if ($extraField) { return $filtersForm->get($field)->get($extraField); } else { return $filtersForm->get($field); } } }