src/Controller/SearchController.php line 110

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Constant\SearchTypeConstant;
  4. use App\Repository\BandRepository;
  5. use App\Repository\FileRepository;
  6. use App\Repository\UserRepository;
  7. use App\Services\SeoManager;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use App\Constant\FileTypeConstant;
  12. use App\Entity\BandMember;
  13. use App\Entity\NewMemberSearch;
  14. use App\Entity\User;
  15. use App\Form\NewBandSearchFiltersType;
  16. use App\Form\SearchFiltersType;
  17. const MUSIC_STYLE 'musicStyles';
  18. class SearchController extends WhiplayController
  19. {
  20.     /**
  21.      * Show search page
  22.      *
  23.      * @param Request $request
  24.      * @param SeoManager $seoManager
  25.      * @param string $searchContent
  26.      * @return Response
  27.      */
  28.     public function show(Request $requestSeoManager $seoManagerstring $searchContent ''): Response
  29.     {
  30.         $seoManager
  31.             ->setTitleAndDescription('search.show.seo.title''search.show.seo.description')
  32.             ->useLogo();
  33.         $filterForm $this->createForm(SearchFiltersType::class);
  34.         $filterForm->handleRequest($request);
  35.         $filterFormData $filterForm->getData();
  36.         $selectedMusicStylesIds = [];
  37.         if (is_array($filterFormData) && isset($filterFormData[MUSIC_STYLE])) {
  38.             foreach ($filterFormData[MUSIC_STYLE] as $musicStyle) {
  39.                 $selectedMusicStylesIds[] = $musicStyle->getId();
  40.             }
  41.         }
  42.         $data = [];
  43.         $searchTerm htmlspecialchars(trim($searchContent));
  44.         foreach(SearchTypeConstant::getValues() as $searchType => $searchTypeInfos){
  45.             if ($searchTerm === '' && $searchType === 'user') {
  46.                 continue;
  47.             }
  48.             $data[$searchType] = $this->getSearchDataByType($searchType$selectedMusicStylesIds0$searchTerm);
  49.         }
  50.         return $this->render('Search/show.html.twig', array(
  51.             'searchTypes' => $data,
  52.             'selectedMusicStylesIds' => $selectedMusicStylesIds,
  53.             'searchTerm' => $searchTerm,
  54.             'filterForm' => $filterForm->createView()
  55.         ));
  56.     }
  57.     /**
  58.      * Show bands offers list page
  59.      *
  60.      * @param Request $request
  61.      * @param SeoManager $seoManager
  62.      * @return Response
  63.      */
  64.     public function bandsOffers(Request $requestSeoManager $seoManager): Response
  65.     {
  66.         $seoManager
  67.             ->setTitleAndDescription('search.bands_offers.seo.title''search.bands_offers.seo.description')
  68.             ->useLogo();
  69.         /** @var User $user */
  70.         $user $this->getUser();
  71.         /** @var BandMember $bandMember */
  72.         $bandMember $user $user->getBands()->get(0) : null;
  73.         $defaultBand $bandMember $bandMember->getBand() : null;
  74.         $filterForm $this->createForm(NewBandSearchFiltersType::class);
  75.         $filterForm->handleRequest($request);
  76.         $filters $request->request->get('new_band_search_filters');
  77.         $instrumentsIds $filters && isset($filters["instruments"]) ? $filters["instruments"] : [];
  78.         $musicStylesIds $filters && isset($filters[MUSIC_STYLE]) ? $filters[MUSIC_STYLE] : [];
  79.         $newMemberSearches $this->getDoctrine()
  80.             ->getRepository(NewMemberSearch::class)
  81.             ->findLastOrdered($instrumentsIds$musicStylesIds);
  82.         return $this->render('Search/bandOffers.html.twig', array(
  83.             'newMemberSearches' => $newMemberSearches,
  84.             'defaultBand' => $defaultBand,
  85.             'filterForm' => $filterForm->createView()
  86.         ));
  87.     }
  88.     /**
  89.      * Show musicians search page
  90.      *
  91.      * @param Request $request
  92.      * @param SeoManager $seoManager
  93.      * @return Response
  94.      */
  95.     public function musicians(Request $requestSeoManager $seoManager): Response
  96.     {
  97.         $seoManager
  98.             ->setTitleAndDescription('search.musicians.seo.title''search.musicians.seo.description')
  99.             ->useLogo();
  100.         $filterForm $this->createForm(NewBandSearchFiltersType::class);
  101.         $filterForm->handleRequest($request);
  102.         $filters $request->request->get('new_band_search_filters');
  103.         $instrumentsIds $filters && isset($filters["instruments"]) ? $filters["instruments"] : [];
  104.         $musicStylesIds $filters && isset($filters[MUSIC_STYLE]) ? $filters[MUSIC_STYLE] : [];
  105.         $musicians $this->getDoctrine()
  106.             ->getRepository(User::class)
  107.             ->findAvailableMusicians($instrumentsIds$musicStylesIds);
  108.         if ($this->getUser()) {
  109.             $musicians array_filter($musicians, function($musician) {
  110.                 return $musician !== $this->getUser();
  111.             });
  112.         }
  113.         return $this->render('Search/musicians.html.twig', array(
  114.             'musicians' => $musicians,
  115.             'filterForm' => $filterForm->createView()
  116.         ));
  117.     }
  118.     /**
  119.      * Api method to fetch searched content
  120.      * lastId get parameter define from which id actions will be fetched
  121.      * searchType get parameter define which type to search
  122.      *
  123.      * @param Request $request
  124.      * @return Response
  125.      */
  126.     public function api(Request $request): Response
  127.     {
  128.         if (!$request->isXmlHttpRequest()) {
  129.             return new Response('Forbidden'Response::HTTP_BAD_REQUEST);
  130.         }
  131.         $selectedMusicStylesIds = [];
  132.         if ($request->request->get(MUSIC_STYLE)) {
  133.             $selectedMusicStylesIds json_decode($request->request->get(MUSIC_STYLE));
  134.             if (!is_array($selectedMusicStylesIds)) {
  135.                 $selectedMusicStylesIds = [];
  136.             }
  137.         }
  138.         $lastId $request->get('lastId') ? $request->get('lastId') : 0;
  139.         $searchType $request->get('searchType') ? $request->get('searchType') : null;
  140.         $response = array('message' => 'no valid data');
  141.         if (isset(SearchTypeConstant::getValues()[$searchType])) {
  142.             $response = [];
  143.             $data[$searchType] = $this->getSearchDataByType($searchType$selectedMusicStylesIds$lastId);
  144.             foreach ($data[$searchType] as $entity) {
  145.                 $infos = array();
  146.                 $infos['id'] = $entity->getId();
  147.                 $infos['view'] = '<div class="content-boxes-container">'.$this->render('Item/' $searchType '.html.twig', array(
  148.                     $searchType => $entity,
  149.                 ))->getContent().'</div>';
  150.                 $response[$searchType][] = $infos;
  151.             }
  152.             $response['message'] = 'OK';
  153.             if (count($data[$searchType]) < SearchTypeConstant::getValues()[$searchType]['limit']) {
  154.                 $response['noMore'] = 'true';
  155.             }
  156.         }
  157.         return new JsonResponse($responseResponse::HTTP_OK);
  158.     }
  159.     /**
  160.      * Private: Get content from $searchType
  161.      *
  162.      * @param string $searchType
  163.      * @param array $selectedMusicStylesIds
  164.      * @param int $lastId
  165.      * @param string $searchTerm
  166.      * @return array
  167.      */
  168.     private function getSearchDataByType(
  169.         string $searchType,
  170.         array $selectedMusicStylesIds = [],
  171.         int $lastId 0,
  172.         string $searchTerm ''
  173.     ): array {
  174.         $limitNumber SearchTypeConstant::getValues()[$searchType]['limit'];
  175.         $data = [];
  176.         if (in_array($searchType, [FileTypeConstant::MUSICFileTypeConstant::VIDEO])) {
  177.             /** @var FileRepository $repository */
  178.             $repository $this->getDoctrine()->getRepository(SearchTypeConstant::getValues()[$searchType]['class']);
  179.             $data $repository
  180.                 ->findLastPublicFromType($searchType$limitNumber$lastId$selectedMusicStylesIds$searchTerm);
  181.         }
  182.         if (in_array($searchType, ['user''band'])) {
  183.             /** @var BandRepository|UserRepository $repository */
  184.             $repository $this->getDoctrine()->getRepository(SearchTypeConstant::getValues()[$searchType]['class']);
  185.             $data $repository
  186.                 ->findLastCreated($selectedMusicStylesIds$lastId$limitNumber$searchTerm);
  187.         }
  188.         return $data;
  189.     }
  190. }