/** * Generates the filters. * * @param QueryBuilder $queryBuilder * @param TableView $view */ private function generateFilters(QueryBuilder $queryBuilder, TableView $view) { if (null !== ($removedFilterId = $this->requestHelper->getRequestVar('remove_filter'))) { // Remove an active filter $this->removeActiveFilter($removedFilterId); } elseif (null !== ($requestedFilterFullName = $this->requestHelper->getRequestVar('add_filter'))) { // Filter widget if (null !== ($filterOptions = $this->config->findFilterByFullName($requestedFilterFullName))) { $type = $this->factory->getFilterType($filterOptions['type']); // Build Form $formBuilder = $this->factory->getFormFactory()->createBuilder(); $type->buildFilterFrom($formBuilder, $filterOptions); $form = $formBuilder->add('add_filter', 'hidden', ['data' => $filterOptions['full_name']])->getForm(); // Handle request $form->handleRequest($this->requestHelper->getRequest()); if ($form->isValid()) { $this->createActiveFilter($filterOptions, $form->getData()); } else { $view->filter_label = $filterOptions['label']; $view->filter_form = $formBuilder->getForm()->createView(); } } } // Build available filters foreach ($this->config->getFilters() as $filterOptions) { // Filter type $type = $this->factory->getFilterType($filterOptions['type']); // Build available filter $availableFilter = new AvailableFilter(); $type->buildAvailableFilter($availableFilter, $filterOptions); $view->available_filters[] = $availableFilter; } // Build actives Filters foreach ($this->requestHelper->getSessionVar($this->getName() . '_filters', []) as $data) { // Filter type $type = $this->factory->getFilterType($data['type']); if (null === ($options = $this->config->findFilterByFullName($data['full_name']))) { throw new RuntimeException(sprintf('Filter "%s" not found.', $data['full_name'])); } // Build actives Filter $type->buildActiveFilter($view, $data, $options); // Configure query builder $type->applyFilter($queryBuilder, $data, $options); } }