src/Controller/SearchController.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Dto\PageSearchDto;
  4. use App\Dto\SpeakerSearchDto;
  5. use App\Entity\Page;
  6. use App\Entity\PageTemplate;
  7. use App\Entity\Speaker;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. /**
  14.  * @Route("/search")
  15.  */
  16. class SearchController extends AbstractController
  17. {
  18.     const PER_PAGE 3;
  19.     /**
  20.      * @Route("/", name="search")
  21.      */
  22.     public function index(Request $request): Response
  23.     {
  24.         $term = (string)$request->get('search');
  25.         $searchSpeakerDto $this->getSpeakerSearchDto($term);
  26.         $speakerRep $this->getDoctrine()->getRepository(Speaker::class);
  27.         $searchNewsDto $this->getNewsSearchDto($term);
  28.         $pageRep $this->getDoctrine()->getRepository(Page::class);
  29.         return $this->render('search/index.html.twig', [
  30.             'speakers'      => $speakerRep->search($searchSpeakerDto),
  31.             'speakersCount' => $speakerRep->searchCount($searchSpeakerDto),
  32.             'news'          => $pageRep->search($searchNewsDto),
  33.             'newsCount'     => $pageRep->searchCount($searchNewsDto),
  34.         ]);
  35.     }
  36.     /**
  37.      * @Route("/speakers", name="search.speakers")
  38.      */
  39.     public function speakers(Request $request): JsonResponse
  40.     {
  41.         $searchDto $this->getSpeakerSearchDto((string)$request->get('search'))->setPage((int)$request->get('page'));
  42.         $speakerRep $this->getDoctrine()->getRepository(Speaker::class);
  43.         return $this->json([
  44.             'data' => $this->renderView('search/speakers.html.twig', [
  45.                 'speakers' => $speakerRep->search($searchDto),
  46.             ]),
  47.             'left' => $speakerRep->searchCount($searchDto) - $searchDto->getPage() * $searchDto->getPerPage(),
  48.         ]);
  49.     }
  50.     /**
  51.      * @Route("/news", name="search.news")
  52.      */
  53.     public function news(Request $request): JsonResponse
  54.     {
  55.         $searchDto $this->getNewsSearchDto((string)$request->get('search'))->setPage((int)$request->get('page'));
  56.         $pageRep $this->getDoctrine()->getRepository(Page::class);
  57.         return $this->json([
  58.             'data' => $this->renderView('search/news.html.twig', [
  59.                 'news' => $pageRep->search($searchDto),
  60.             ]),
  61.             'left' => $pageRep->searchCount($searchDto) - $searchDto->getPage() * $searchDto->getPerPage(),
  62.         ]);
  63.     }
  64.     /**
  65.      * @param string $term
  66.      * @return SpeakerSearchDto
  67.      */
  68.     protected function getSpeakerSearchDto(string $term): SpeakerSearchDto
  69.     {
  70.         return (new SpeakerSearchDto($term))->setPerPage(self::PER_PAGE)->setFullSearch(true);
  71.     }
  72.     protected function getNewsSearchDto(string $term): PageSearchDto
  73.     {
  74.         return (new PageSearchDto($term))->setPerPage(self::PER_PAGE)->setTemplate(
  75.             $this->getDoctrine()
  76.                 ->getRepository(PageTemplate::class)
  77.                 ->findOneBy(['path' => 'page/news_page.html.twig'])
  78.         );
  79.     }
  80. }