searchProvider = $searchProvider; $this->translator = $translator; $this->paginatorFactory = $paginatorFactory; $this->searchApi = $searchApi; } public function advancedSearchAction($name, Request $request) { try { /** @var Chill\MainBundle\Search\SearchProvider $variable */ $searchProvider = $this->searchProvider; /** @var Chill\MainBundle\Search\HasAdvancedSearchFormInterface $variable */ $search = $this->searchProvider ->getHasAdvancedFormByName($name); } catch (\Chill\MainBundle\Search\UnknowSearchNameException $e) { throw $this->createNotFoundException('no advanced search for ' . "{$name}"); } if ($request->query->has('q')) { $data = $search->convertTermsToFormData($searchProvider->parse( $request->query->get('q') )); } $form = $this->createAdvancedSearchForm($name, $data ?? []); if ($request->isMethod(Request::METHOD_POST)) { $form->handleRequest($request); if ($form->isValid()) { $pattern = $this->searchProvider ->getHasAdvancedFormByName($name) ->convertFormDataToQuery($form->getData()); return $this->redirectToRoute('chill_main_search', [ 'q' => $pattern, 'name' => $name, ]); } } return $this->render( '@ChillMain/Search/advanced_search.html.twig', [ 'form' => $form->createView(), 'name' => $name, 'title' => $search->getAdvancedSearchTitle(), ] ); } public function advancedSearchListAction(Request $request) { /** @var Chill\MainBundle\Search\SearchProvider $variable */ $searchProvider = $this->searchProvider; $advancedSearchProviders = $searchProvider ->getHasAdvancedFormSearchServices(); if (count($advancedSearchProviders) === 1) { reset($advancedSearchProviders); return $this->redirectToRoute('chill_main_advanced_search', [ 'name' => key($advancedSearchProviders), ]); } return $this->render('@ChillMain/Search/choose_list.html.twig'); } public function searchAction(Request $request, $_format) { $pattern = trim($request->query->get('q', '')); if ('' === $pattern) { switch ($_format) { case 'html': return $this->render( '@ChillMain/Search/error.html.twig', [ 'message' => $this->translator->trans('Your search is empty. ' . 'Please provide search terms.'), 'pattern' => $pattern, ] ); case 'json': return new JsonResponse([ 'results' => [], 'pagination' => ['more' => false], ]); } } $name = $request->query->get('name', null); try { if (null === $name) { if ('json' === $_format) { return new JsonResponse('Currently, we still do not aggregate results ' . 'from different providers', JsonResponse::HTTP_BAD_REQUEST); } // no specific search selected. Rendering result in "preview" mode $results = $this->searchProvider ->getSearchResults( $pattern, 0, 5, [SearchInterface::SEARCH_PREVIEW_OPTION => true] ); } else { // we want search on a specific search provider. Display full results. $results = [$this->searchProvider ->getResultByName( $pattern, $name, $this->paginatorFactory->getCurrentPageFirstItemNumber(), $this->paginatorFactory->getCurrentItemsPerPage(), [ SearchInterface::SEARCH_PREVIEW_OPTION => false, SearchInterface::REQUEST_QUERY_PARAMETERS => $request ->get(SearchInterface::REQUEST_QUERY_KEY_ADD_PARAMETERS, []), ], $_format ), ]; if ('json' === $_format) { return new JsonResponse(reset($results)); } } } catch (UnknowSearchDomainException $ex) { return $this->render( '@ChillMain/Search/error.html.twig', [ 'message' => $this->translator->trans('The domain %domain% ' . 'is unknow. Please check your search.', ['%domain%' => $ex->getDomain()]), 'pattern' => $pattern, ] ); } catch (UnknowSearchNameException $ex) { throw $this->createNotFoundException('The name ' . $ex->getName() . ' is not found'); } catch (ParsingException $ex) { return $this->render( '@ChillMain/Search/error.html.twig', [ 'message' => $this->translator->trans('Invalid terms') . ': ' . $this->translator->trans($ex->getMessage()), 'pattern' => $pattern, ] ); } return $this->render( '@ChillMain/Search/list.html.twig', ['results' => $results, 'pattern' => $pattern] ); } public function searchApi(Request $request, $_format): JsonResponse { //TODO this is an incomplete implementation $query = $request->query->get('q', ''); $types = $request->query->get('type', []); if (count($types) === 0) { throw new BadRequestException('The request must contains at ' . ' one type'); } try { $collection = $this->searchApi->getResults($query, $types, []); } catch (SearchApiNoQueryException $e) { throw new BadRequestHttpException($e->getMessage(), $e); } return $this->json($collection, \Symfony\Component\HttpFoundation\Response::HTTP_OK, [], ['groups' => ['read']]); } protected function createAdvancedSearchForm($name, array $data = []) { $builder = $this ->get('form.factory') ->createNamedBuilder( null, FormType::class, $data, ['method' => Request::METHOD_POST] ); $this->searchProvider ->getHasAdvancedFormByName($name) ->buildForm($builder); $builder->add('submit', SubmitType::class, [ 'label' => 'Search', ]); return $builder->getForm(); } }