<?php
namespace App\Core\Controller\Admin;
use AndreaSprega\Bundle\BreadcrumbBundle\Annotation\Breadcrumb;
use App\Core\Entity\Competition;
use App\Core\Entity\Tournament;
use App\Core\Form\Type\CompetitionFromType;
use App\Core\Repository\CompetitionRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/{_locale}/admin/tournament/{tournament}/competition", name="app_admin_competition_")
*/
class CompetitionAdminController extends AbstractAdminController
{
private EntityManagerInterface $entityManager;
private CompetitionRepository $competitionRepository;
public function __construct(EntityManagerInterface $entityManager, CompetitionRepository $competitionRepository)
{
$this->entityManager = $entityManager;
$this->competitionRepository = $competitionRepository;
}
/**
* @Route("/list", name="list", methods={"GET"})
* @Breadcrumb({
* { "label" = "Home", "route" = "app_admin_home" },
* { "label" = "Tournaments list", "route" = "app_admin_tournament_list" },
* { "label" = "$tournament.name" },
* { "label" = "Competitions list" }
* })
*
* @param Request $request
* @param Tournament $tournament
* @return Response
*/
public function index(Request $request, Tournament $tournament): Response
{
//TODO: fetch all competitions - show a list. Include action buttons for easier access. Think of CRUD actions.
$competitions = $this->competitionRepository->findBy(['tournament' => $tournament]);
//TODO: what if competition is null
return $this->render(
'admin/Competition/list.html.twig',
[
'user' => $this->getUser(),
'competition_list' => $competitions,
'tournament' => $tournament,
]
);
}
/**
* @Route("/add", name="add", methods={"GET", "POST"})
* @Breadcrumb({
* { "label" = "Home", "route" = "app_admin_home" },
* { "label" = "Tournaments list", "route" = "app_admin_tournament_list" },
* { "label" = "$tournament.name" },
* { "label" = "Competitions list", "route" = "app_admin_competition_list", "params" = {"tournament" = "$tournament.id"} },
* { "label" = "Add competition" }
* })
*
* @param Request $request
* @param Tournament $tournament
* @return Response
*/
public function add(Request $request, Tournament $tournament): Response
{
$redirectIfEditIsDisabled = $this->disableEditIfTournamentActive($tournament);
if ($redirectIfEditIsDisabled) {
return $redirectIfEditIsDisabled;
}
$form = $this->createForm(CompetitionFromType::class);
$form->handleRequest($request);
$addProcessResponse = $this->processCompetition($form, $tournament);
if ($addProcessResponse !== null) {
return $addProcessResponse;
}
return $this->render(
'admin/Competition/add.html.twig',
[
'form' => $form->createView(),
'tournament' => $tournament,
]
);
}
/**
* @Route("/{competition}/delete", name="delete", methods={"GET"})
*
* @param Request $request
* @param Tournament $tournament
* @param Competition $competition
* @return Response
*/
public function delete(Request $request, Tournament $tournament, Competition $competition): Response
{
$redirectIfEditIsDisabled = $this->disableEditIfTournamentActive($tournament);
if ($redirectIfEditIsDisabled) {
return $redirectIfEditIsDisabled;
}
$this->entityManager->remove($competition);
$this->entityManager->flush();
return $this->redirectToRoute('app_admin_competition_list', ['tournament' => $tournament->getId()]);
}
/**
* @Route("/{competition}/edit", name="edit", methods={"GET", "POST"})
* @Breadcrumb({
* { "label" = "Home", "route" = "app_admin_home" },
* { "label" = "Tournaments list", "route" = "app_admin_tournament_list" },
* { "label" = "$tournament.name" },
* { "label" = "Competitions list", "route" = "app_admin_competition_list", "params" = {"tournament" = "$tournament.id"} },
* { "label" = "Edit competition" }
* })
*
* @param Request $request
* @param Tournament $tournament
* @param Competition $competition
* @return Response
*/
public function edit(Request $request, Tournament $tournament, Competition $competition): Response
{
$redirectIfEditIsDisabled = $this->disableEditIfTournamentActive($tournament);
if ($redirectIfEditIsDisabled) {
return $redirectIfEditIsDisabled;
}
$form = $this->createForm(CompetitionFromType::class, $competition);
$form->handleRequest($request);
$addProcessResponse = $this->processCompetition($form, $tournament);
if ($addProcessResponse !== null) {
return $addProcessResponse;
}
return $this->render(
'admin/Competition/edit.html.twig',
[
'form' => $form->createView(),
'competition' => $competition,
'tournament' => $tournament,
]
);
}
private function processCompetition(FormInterface $form, Tournament $tournament): ?Response
{
if ($form->isSubmitted() && $form->isValid()) {
/** @var Competition $competition */
$competition = $form->getData();
$competition->setTournament($tournament);
$this->entityManager->persist($competition);
$this->entityManager->flush();
$this->addFlash(
'notice',
"Your have saved a competition: {$competition->getId()} {$competition->getName()}"
);
return $this->redirectToRoute(
'app_admin_competition_list',
[
'tournament' => $tournament->getId(),
]
);
}
return null;
}
}