コード例 #1
0
ファイル: Table.php プロジェクト: ekyna/table
 /**
  * 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);
     }
 }