<?php
namespace App\Controller;
use App\Dto\PageSearchDto;
use App\Dto\SpeakerSearchDto;
use App\Entity\Page;
use App\Entity\PageTemplate;
use App\Entity\Speaker;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/search")
*/
class SearchController extends AbstractController
{
const PER_PAGE = 3;
/**
* @Route("/", name="search")
*/
public function index(Request $request): Response
{
$term = (string)$request->get('search');
$searchSpeakerDto = $this->getSpeakerSearchDto($term);
$speakerRep = $this->getDoctrine()->getRepository(Speaker::class);
$searchNewsDto = $this->getNewsSearchDto($term);
$pageRep = $this->getDoctrine()->getRepository(Page::class);
return $this->render('search/index.html.twig', [
'speakers' => $speakerRep->search($searchSpeakerDto),
'speakersCount' => $speakerRep->searchCount($searchSpeakerDto),
'news' => $pageRep->search($searchNewsDto),
'newsCount' => $pageRep->searchCount($searchNewsDto),
]);
}
/**
* @Route("/speakers", name="search.speakers")
*/
public function speakers(Request $request): JsonResponse
{
$searchDto = $this->getSpeakerSearchDto((string)$request->get('search'))->setPage((int)$request->get('page'));
$speakerRep = $this->getDoctrine()->getRepository(Speaker::class);
return $this->json([
'data' => $this->renderView('search/speakers.html.twig', [
'speakers' => $speakerRep->search($searchDto),
]),
'left' => $speakerRep->searchCount($searchDto) - $searchDto->getPage() * $searchDto->getPerPage(),
]);
}
/**
* @Route("/news", name="search.news")
*/
public function news(Request $request): JsonResponse
{
$searchDto = $this->getNewsSearchDto((string)$request->get('search'))->setPage((int)$request->get('page'));
$pageRep = $this->getDoctrine()->getRepository(Page::class);
return $this->json([
'data' => $this->renderView('search/news.html.twig', [
'news' => $pageRep->search($searchDto),
]),
'left' => $pageRep->searchCount($searchDto) - $searchDto->getPage() * $searchDto->getPerPage(),
]);
}
/**
* @param string $term
* @return SpeakerSearchDto
*/
protected function getSpeakerSearchDto(string $term): SpeakerSearchDto
{
return (new SpeakerSearchDto($term))->setPerPage(self::PER_PAGE)->setFullSearch(true);
}
protected function getNewsSearchDto(string $term): PageSearchDto
{
return (new PageSearchDto($term))->setPerPage(self::PER_PAGE)->setTemplate(
$this->getDoctrine()
->getRepository(PageTemplate::class)
->findOneBy(['path' => 'page/news_page.html.twig'])
);
}
}