<?php
/**
* Created by PhpStorm.
* User: Jozef Môstka
* Date: 9/22/2019
* Time: 11:24
*/
namespace App\Controller;
use App\Entity\Card;
use App\Entity\Player;
use App\Entity\Series;
use App\Entity\Team;
use App\Form\CardFilterEntity;
use App\Form\Type\CardFilterType;
use Doctrine\ORM\EntityManager;
use Knp\Component\Pager\PaginatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
class PageController extends AbstractController {
/**
* @Route("/", name="cards.list")
* @Route("/hrac/{playerUrl}", name="cards.search.player")
* @Route("/tym/{teamUrl}", name="cards.search.team")
* @Route("/vlastnost/{property}", name="cards.search.property")
*
* @ParamConverter("player", class="App\Entity\Player", isOptional="true", options={"mapping":{"playerUrl":"url"}})
* @ParamConverter("team", class="App\Entity\Team", isOptional="true", options={"mapping":{"teamUrl":"url"}})
*/
public function cardList(Request $request, PaginatorInterface $paginator, Session $session) {
$displayType = $request->query->get('displayType', $session->get("displayType","grid"));
$sortBy = $request->query->get('sortBy', $session->get("sortBy","date.desc"));
$limit = $request->query->get('limit', $session->get("limit",9));
$request->query->set('displayType', $displayType);
$request->query->set('sortBy', $sortBy);
$request->query->set('limit', $limit);
$session->set('displayType', $displayType);
$session->set('sortBy', $sortBy);
$session->set('limit', $limit);
$limitOptions = [9, 18, 36,99];
$sorts = ["date.desc", "price.asc", "price.desc", "date.asc"];
if (!in_array($limit, $limitOptions)) {
$limit = $limitOptions[0];
}
if (!in_array($sortBy, $sorts)) {
$sortBy = $sorts[0];
}
$sortForm = $this->createSortOption($sortBy);
$limitForm = $this->createPerPageOption($limit);
/** @var EntityManager $em */
$em = $this->getDoctrine()->getManager();
$query = $em->createQueryBuilder()
->select('card')
->from(Card::class, 'card')
->where('card.active = 1');
$player = null;
$series = null;
$team = null;
switch ($request->get('_route')) {
case "cards.search.player":
$player = $request->get("player");
if ($player == null) {
throw $this->createNotFoundException("Hráč nebol nájdený");
}
$request->query->set('player',$player->getId());
break;
case "cards.search.team":
$team = $request->get("team");
if ($team == null) {
throw $this->createNotFoundException("Tým nebol nájdený");
}
$request->query->set('team',$team->getId());
break;
case "cards.search.property":
$property = $request->get("property");
$properties = ["memorabilia","autogram","limit","rc","insert","base","goalie","svk","cze"];
if (!in_array($property,$properties)){
throw $this->createNotFoundException("Takáto vlastnosť neexistuje");
}
$request->query->set($property,true);
break;
}
$filter = new CardFilterEntity();
$filterForm = $this->createForm(CardFilterType::class, $filter, [
'player' => $player,
'team' => $team,
'action'=> $this->generateUrl("cards.list")
]);
$filterForm->handleRequest($request);
if ($filterForm->isSubmitted() && $filterForm->isValid()) {
$this->manageFilter($filter, $query);
}
// $sorts = ["date.desc", "price.asc", "price.desc", "date.asc"];
$parts = explode('.', $sortBy);
switch ($parts[0]) {
case "date":
$query->join('card.season', 'season');
$query->join('card.series', 'series');
$query->orderBy('season.name', $parts[1]);
$query->addOrderBy("series.name","asc");
$query->addOrderBy("card.num","asc");
break;
case "price":
$query->join('card.season', 'season');
$query->join('card.series', 'series');
$query->orderBy('card.price', $parts[1]);
$query->addOrderBy("series.name","asc");
$query->addOrderBy("card.num","asc");
break;
default:
throw new \Exception("unssuported sort {$sortBy}");
}
// $paginator = $this->get('knp_paginator');
$page = $request->query->get('page', 1);
if (!$page) {
$page = 1;
}
/** @var Card[] $cards */
$cards = $paginator->paginate(
$query->getQuery(),
$page,
$limit
);
return $this->render("page/cards_list.html.twig", [
'cards' => $cards,
"filter" => $filterForm->createView(),
"displayType" => $displayType,
"sortBy" => $sortBy,
"limit" => $limit,
'limitOptions' => $limitOptions,
'sortForm' => $sortForm->createView(),
'limitForm' => $limitForm->createView()
]);
}
/**
* @Route("/karta/{url}", name="cards.detail")
*/
public function cardDetail(Card $card) {
return $this->render('page/card_detail.html.twig', [
"card" => $card
]);
}
/**
* @param CardFilterEntity $filter
* @param \Doctrine\ORM\QueryBuilder $query
*/
protected function manageFilter(CardFilterEntity $filter, \Doctrine\ORM\QueryBuilder $query): void {
if ($filter->getMemorabilita()) {
$query->andWhere('card.memorabilia = 1');
}
if ($filter->getAutogram()) {
$query->andWhere('card.autogram = 1');
}
if ($filter->getRc()) {
$query->andWhere('card.rc = 1');
}
if ($filter->getInsert()) {
$query->andWhere('card.insert = 1');
}
if ($filter->getBase()) {
$query->andWhere('card.base = 1');
}
if ($filter->getGoalie()) {
$query->andWhere('card.goalie = 1');
}
if ($filter->getSvk()) {
$query->andWhere('card.svk = 1');
}
if ($filter->getCze()) {
$query->andWhere('card.cze = 1');
}
if ($player = $filter->getPlayer()) {
$query->join('card.players', 'players')
->andWhere('players.id = :playerId')
->setParameter("playerId", $player->getId());
}
if ($team = $filter->getTeam()) {
$query->join('card.teams', 'teams')
->andWhere('teams.id = :teamId')
->setParameter("teamId", $team->getId());
}
if ($season = $filter->getSeason()) {
$query->andWhere('card.season = :season')
->setParameter('season', $season);
}
if ($series = $filter->getSeries()) {
$query->andWhere('card.series = :series')
->setParameter('series', $series);
}
if ($search = $filter->getSearch()) {
$query->join('card.players', 'players')
->join('card.teams', 'teams')
->andWhere("(card.title LIKE :search OR players.name LIKE :search OR teams.name LIKE :search)")
->setParameter('search', "%{$search}%");
}
}
/**
* @param $value
*
* @return \Symfony\Component\Form\FormInterface
*/
private function createSortOption($value) {
return $this->createFormBuilder()
->add("sorting", ChoiceType::class, [
"label" => false,
"choices" => [
"Najiacnejšie" => "price.asc",
"Najdrahšie" => "price.desc",
"Najnovšie" => "date.desc",
"Najstaršie" => "date.asc",
],
'data' => $value,
'attr' => [
"onchange" => "changeSorting(this)"
]
])->getForm();
}
/**
* @param $value
*
* @return \Symfony\Component\Form\FormInterface
*/
private function createPerPageOption($value) {
return $this->createFormBuilder()
->add("perPage", ChoiceType::class, [
"label" => false,
"choices" => [
"9" => 9,
"18" => 18,
"36" => 36,
"99" => 99
],
'data' => $value,
'attr' => [
"onchange" => "changePerPAge(this)"
]
])->getForm();
}
}