src/Controller/PageController.php line 82

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: Jozef Môstka
  5.  * Date: 9/22/2019
  6.  * Time: 11:24
  7.  */
  8. namespace App\Controller;
  9. use App\Entity\Card;
  10. use App\Entity\Player;
  11. use App\Entity\Series;
  12. use App\Entity\Team;
  13. use App\Form\CardFilterEntity;
  14. use App\Form\Type\CardFilterType;
  15. use Doctrine\ORM\EntityManager;
  16. use Knp\Component\Pager\PaginatorInterface;
  17. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Session\Session;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. class PageController extends AbstractController {
  24.     /**
  25.      * @Route("/", name="cards.list")
  26.      * @Route("/hrac/{playerUrl}", name="cards.search.player")
  27.      * @Route("/tym/{teamUrl}", name="cards.search.team")
  28.      * @Route("/vlastnost/{property}", name="cards.search.property")
  29.      *
  30.      * @ParamConverter("player", class="App\Entity\Player", isOptional="true", options={"mapping":{"playerUrl":"url"}})
  31.      * @ParamConverter("team", class="App\Entity\Team", isOptional="true", options={"mapping":{"teamUrl":"url"}})
  32.      */
  33.     public function cardList(Request $requestPaginatorInterface $paginatorSession $session) {
  34.         $displayType $request->query->get('displayType'$session->get("displayType","grid"));
  35.         $sortBy      $request->query->get('sortBy'$session->get("sortBy","date.desc"));
  36.         $limit       $request->query->get('limit'$session->get("limit",9));
  37.         $request->query->set('displayType'$displayType);
  38.         $request->query->set('sortBy'$sortBy);
  39.         $request->query->set('limit'$limit);
  40.         $session->set('displayType'$displayType);
  41.         $session->set('sortBy'$sortBy);
  42.         $session->set('limit'$limit);
  43.         $limitOptions = [91836,99];
  44.         $sorts        = ["date.desc""price.asc""price.desc""date.asc"];
  45.         if (!in_array($limit$limitOptions)) {
  46.             $limit $limitOptions[0];
  47.         }
  48.         if (!in_array($sortBy$sorts)) {
  49.             $sortBy $sorts[0];
  50.         }
  51.         $sortForm  $this->createSortOption($sortBy);
  52.         $limitForm $this->createPerPageOption($limit);
  53.         /** @var EntityManager $em */
  54.         $em $this->getDoctrine()->getManager();
  55.         $query $em->createQueryBuilder()
  56.             ->select('card')
  57.             ->from(Card::class, 'card')
  58.             ->where('card.active = 1');
  59.         $player null;
  60.         $series null;
  61.         $team   null;
  62.         switch ($request->get('_route')) {
  63.             case "cards.search.player":
  64.                 $player   $request->get("player");
  65.                 if ($player == null) {
  66.                     throw $this->createNotFoundException("Hráč nebol nájdený");
  67.                 }
  68.                 $request->query->set('player',$player->getId());
  69.                 break;
  70.             case "cards.search.team":
  71.                 $team  $request->get("team");
  72.                 if ($team == null) {
  73.                     throw $this->createNotFoundException("Tým nebol nájdený");
  74.                 }
  75.                 $request->query->set('team',$team->getId());
  76.                 break;
  77.             case "cards.search.property":
  78.                 $property $request->get("property");
  79.                 $properties = ["memorabilia","autogram","limit","rc","insert","base","goalie","svk","cze"];
  80.                 if (!in_array($property,$properties)){
  81.                     throw $this->createNotFoundException("Takáto vlastnosť neexistuje");
  82.                 }
  83.                 $request->query->set($property,true);
  84.                 break;
  85.         }
  86.         $filter     = new CardFilterEntity();
  87.         $filterForm $this->createForm(CardFilterType::class, $filter, [
  88.             'player' => $player,
  89.             'team'   => $team,
  90.             'action'=> $this->generateUrl("cards.list")
  91.         ]);
  92.         $filterForm->handleRequest($request);
  93.         if ($filterForm->isSubmitted() && $filterForm->isValid()) {
  94.             $this->manageFilter($filter$query);
  95.         }
  96. //        $sorts = ["date.desc", "price.asc", "price.desc", "date.asc"];
  97.         $parts explode('.'$sortBy);
  98.         switch ($parts[0]) {
  99.             case "date":
  100.                 $query->join('card.season''season');
  101.                 $query->join('card.series''series');
  102.                 $query->orderBy('season.name'$parts[1]);
  103.                 $query->addOrderBy("series.name","asc");
  104.                 $query->addOrderBy("card.num","asc");
  105.                 break;
  106.             case "price":
  107.                 $query->join('card.season''season');
  108.                 $query->join('card.series''series');
  109.                 $query->orderBy('card.price'$parts[1]);
  110.                 $query->addOrderBy("series.name","asc");
  111.                 $query->addOrderBy("card.num","asc");
  112.                 break;
  113.             default:
  114.                 throw new \Exception("unssuported sort {$sortBy}");
  115.         }
  116. //        $paginator = $this->get('knp_paginator');
  117.         $page $request->query->get('page'1);
  118.         if (!$page) {
  119.             $page 1;
  120.         }
  121.         /** @var Card[] $cards */
  122.         $cards $paginator->paginate(
  123.             $query->getQuery(),
  124.             $page,
  125.             $limit
  126.         );
  127.         return $this->render("page/cards_list.html.twig", [
  128.             'cards'        => $cards,
  129.             "filter"       => $filterForm->createView(),
  130.             "displayType"  => $displayType,
  131.             "sortBy"       => $sortBy,
  132.             "limit"        => $limit,
  133.             'limitOptions' => $limitOptions,
  134.             'sortForm'     => $sortForm->createView(),
  135.             'limitForm'    => $limitForm->createView()
  136.         ]);
  137.     }
  138.     /**
  139.      * @Route("/karta/{url}", name="cards.detail")
  140.      */
  141.     public function cardDetail(Card $card) {
  142.         return $this->render('page/card_detail.html.twig', [
  143.             "card" => $card
  144.         ]);
  145.     }
  146.     /**
  147.      * @param CardFilterEntity           $filter
  148.      * @param \Doctrine\ORM\QueryBuilder $query
  149.      */
  150.     protected function manageFilter(CardFilterEntity $filter\Doctrine\ORM\QueryBuilder $query): void {
  151.         if ($filter->getMemorabilita()) {
  152.             $query->andWhere('card.memorabilia = 1');
  153.         }
  154.         if ($filter->getAutogram()) {
  155.             $query->andWhere('card.autogram = 1');
  156.         }
  157.         if ($filter->getRc()) {
  158.             $query->andWhere('card.rc = 1');
  159.         }
  160.         if ($filter->getInsert()) {
  161.             $query->andWhere('card.insert = 1');
  162.         }
  163.         if ($filter->getBase()) {
  164.             $query->andWhere('card.base = 1');
  165.         }
  166.         if ($filter->getGoalie()) {
  167.             $query->andWhere('card.goalie = 1');
  168.         }
  169.         if ($filter->getSvk()) {
  170.             $query->andWhere('card.svk = 1');
  171.         }
  172.         if ($filter->getCze()) {
  173.             $query->andWhere('card.cze = 1');
  174.         }
  175.         if ($player $filter->getPlayer()) {
  176.             $query->join('card.players''players')
  177.                 ->andWhere('players.id = :playerId')
  178.                 ->setParameter("playerId"$player->getId());
  179.         }
  180.         if ($team $filter->getTeam()) {
  181.             $query->join('card.teams''teams')
  182.                 ->andWhere('teams.id = :teamId')
  183.                 ->setParameter("teamId"$team->getId());
  184.         }
  185.         if ($season $filter->getSeason()) {
  186.             $query->andWhere('card.season = :season')
  187.                 ->setParameter('season'$season);
  188.         }
  189.         if ($series $filter->getSeries()) {
  190.             $query->andWhere('card.series = :series')
  191.                 ->setParameter('series'$series);
  192.         }
  193.         if ($search $filter->getSearch()) {
  194.             $query->join('card.players''players')
  195.                 ->join('card.teams''teams')
  196.                 ->andWhere("(card.title LIKE :search OR players.name LIKE :search OR teams.name LIKE :search)")
  197.                 ->setParameter('search'"%{$search}%");
  198.         }
  199.     }
  200.     /**
  201.      * @param $value
  202.      *
  203.      * @return \Symfony\Component\Form\FormInterface
  204.      */
  205.     private function createSortOption($value) {
  206.         return $this->createFormBuilder()
  207.             ->add("sorting"ChoiceType::class, [
  208.                 "label"   => false,
  209.                 "choices" => [
  210.                     "Najiacnejšie" => "price.asc",
  211.                     "Najdrahšie"   => "price.desc",
  212.                     "Najnovšie"    => "date.desc",
  213.                     "Najstaršie"   => "date.asc",
  214.                 ],
  215.                 'data'    => $value,
  216.                 'attr'    => [
  217.                     "onchange" => "changeSorting(this)"
  218.                 ]
  219.             ])->getForm();
  220.     }
  221.     /**
  222.      * @param $value
  223.      *
  224.      * @return \Symfony\Component\Form\FormInterface
  225.      */
  226.     private function createPerPageOption($value) {
  227.         return $this->createFormBuilder()
  228.             ->add("perPage"ChoiceType::class, [
  229.                 "label"   => false,
  230.                 "choices" => [
  231.                     "9"  => 9,
  232.                     "18" => 18,
  233.                     "36" => 36,
  234.                     "99" => 99
  235.                 ],
  236.                 'data'    => $value,
  237.                 'attr'    => [
  238.                     "onchange" => "changePerPAge(this)"
  239.                 ]
  240.             ])->getForm();
  241.     }
  242. }