src/Service/Entry/FreeWordSearchService.php line 83

Open in your IDE?
  1. <?php
  2. namespace App\Service\Entry;
  3. use App\Form\FreeWordType;
  4. use App\Repository\Entry\EntryRepository;
  5. use App\Utils\PaginationUtil;
  6. use App\Utils\QbShortcutTrait;
  7. use App\Utils\TargetChoiceUtil;
  8. use Doctrine\ORM\QueryBuilder;
  9. use Psr\Container\ContainerInterface;
  10. use Symfony\Component\Form\FormInterface;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  13. class FreeWordSearchService
  14. {
  15.     use QbShortcutTrait;
  16.     private const MAX_RESULTS 4;
  17.     private ContainerInterface $container;
  18.     private UrlGeneratorInterface $urlGenerator;
  19.     private EntryRepository $entryRepository;
  20.     public function __construct(
  21.         ContainerInterface $container,
  22.         UrlGeneratorInterface $urlGenerator,
  23.         EntryRepository $entryRepository
  24.     ) {
  25.         $this->container $container;
  26.         $this->urlGenerator $urlGenerator;
  27.         $this->entryRepository $entryRepository;
  28.     }
  29.     public function getForm(): FormInterface
  30.     {
  31.         return $this->container->get('form.factory')->create(FreeWordType::class, null, [
  32.             "action" => $this->urlGenerator->generate('search_index'),
  33.             "method" => "GET",
  34.             "csrf_protection" => false
  35.         ]);
  36.     }
  37.     public function getQueryBuilder(int $categorystring $alias "a"): QueryBuilder
  38.     {
  39.         $qb $this->entryRepository->getListQuery([]);
  40.         $qb
  41.             ->andWhere($qb->expr()->eq('e.category'':category'))
  42.             ->setParameter('category'$category)
  43.             ;
  44.         $this->entryRepository->setDefaultOrder($qb);
  45.         $this->entryRepository->addPublishWhere($qb);
  46.         return $qb;
  47.     }
  48.     public function addWordSearch(QueryBuilder $qbFormInterface $form): self
  49.     {
  50.         $this->qbsWord(
  51.             $qb,
  52.             [
  53.                 "word" => $form->get('word')->getData()
  54.             ],
  55.             "word",
  56.             [
  57.                 "e.title",
  58.                 "e.title_en",
  59.                 "e.title_cn",
  60.                 "e.title_tw",
  61.                 "e.summaryTitle",
  62.                 "e.summaryTitle_en",
  63.                 "e.summaryTitle_cn",
  64.                 "e.summaryTitle_tw",
  65.                 "e.summaryContent",
  66.                 "e.summaryContent_en",
  67.                 "e.summaryContent_cn",
  68.                 "e.summaryContent_tw",
  69.             ]
  70.         );
  71.         return $this;
  72.     }
  73.     public function search(Request $requestint $currentPage 1): array
  74.     {
  75.         $form $this->getForm();
  76.         $form->handleRequest($request);
  77.         return [
  78.             "form" => $form,
  79.             "modelPlan" => $this->getResult($formTargetChoiceUtil::MODELPLAN$currentPage),
  80.             "workSpace" => $this->getResult($formTargetChoiceUtil::WORKSPACE$currentPage),
  81.             "hotel" => $this->getResult($formTargetChoiceUtil::HOTEL$currentPage),
  82.             "activity" => $this->getResult($formTargetChoiceUtil::ACTIVITY$currentPage),
  83.             "mobility" => $this->getResult($formTargetChoiceUtil::MOBILITY$currentPage)
  84.         ];
  85.     }
  86.     public function getSingleResult(Request $requestint $category): array
  87.     {
  88.         $form $this->getForm();
  89.         $form->handleRequest($request);
  90.         $page $request->query->has('page')? $request->query->get('page'): 1;
  91.         return $this->getResult($form$category$page);
  92.     }
  93.     public function getResult(FormInterface $formint $categoryint $currentPage): array
  94.     {
  95.         $qb $this->getQueryBuilder($category);
  96.         $this->addWordSearch($qb$form);
  97.         if($category === TargetChoiceUtil::MODELPLAN) {
  98.             $qb->orderBy("RAND()");
  99.         } else {
  100.             $qb->orderBy("e.id""desc");
  101.         }
  102.         $pagination = new PaginationUtil($qb$currentPageself::MAX_RESULTS);
  103.         return [
  104.             "iterator" => $pagination->getPaginator()->getIterator(),
  105.             "nextPage" => $pagination->getNextPage(),
  106.             "isLast" => $pagination->isLastPage(),
  107.             "itemCount" => $pagination->getPaginator()->count(),
  108.             "category" => $category
  109.         ];
  110.     }
  111. }