<?php
namespace App\Core\Controller\Admin;
use AndreaSprega\Bundle\BreadcrumbBundle\Annotation\Breadcrumb;
use App\Core\Entity\Competition;
use App\Core\Entity\Team;
use App\Core\Entity\Tournament;
use App\Core\Form\Type\TeamFormType;
use App\Core\Repository\TeamRepository;
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/{competition}/team", name="app_admin_team_")
*/
class TeamAdminController extends AbstractAdminController
{
private TeamRepository $teamRepository;
private EntityManagerInterface $entityManager;
public function __construct(TeamRepository $teamRepository, EntityManagerInterface $entityManager)
{
$this->teamRepository = $teamRepository;
$this->entityManager = $entityManager;
}
/**
* @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", "route" = "app_admin_competition_list", "params" = {"tournament" = "$tournament.id"} },
* { "label" = "$competition.name" },
* { "label" = "Teams list" }
* })
*
* @param Request $request
* @param Tournament $tournament
* @param Competition $competition
* @return Response
*/
public function index(Request $request, Tournament $tournament, Competition $competition): Response
{
//TODO: fetch all competitions - show a list. Include action buttons for easier access. Think of CRUD actions.
$teamList = $this->teamRepository->findTeamsByCompetition($competition);
//TODO: what if competition is null
return $this->render(
'admin/Team/list.html.twig',
[
'user' => $this->getUser(),
'team_list' => $teamList,
'competition' => $competition,
'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" = "$competition.name" },
* { "label" = "Teams list", "route" = "app_admin_team_list", "params" = {"tournament" = "$tournament.id", "competition" = "$competition.id"} },
* { "label" = "Add team" }
* })
*
* @param Request $request
* @param Tournament $tournament
* @param Competition $competition
* @return Response
*/
public function add(Request $request, Tournament $tournament, Competition $competition): Response
{
$redirectIfEditIsDisabled = $this->disableEditIfTournamentActive($tournament);
if ($redirectIfEditIsDisabled) {
return $redirectIfEditIsDisabled;
}
$team = new Team();
$form = $this->createForm(TeamFormType::class, $team);
$form->handleRequest($request);
$addProcessResponse = $this->processTeam($form, $competition);
if ($addProcessResponse !== null) {
return $addProcessResponse;
}
return $this->render(
'admin/Team/add.html.twig',
[
'form' => $form->createView(),
'tournament' => $tournament,
'competition' => $competition,
]
);
}
/**
* @Route("/{team}/delete", name="delete", methods={"GET"})
*
* @param Request $request
* @param Tournament $tournament
* @param Competition $competition
* @param Team $team
* @return Response
*/
public function delete(Request $request, Tournament $tournament, Competition $competition, Team $team): Response
{
$redirectIfEditIsDisabled = $this->disableEditIfTournamentActive($tournament);
if ($redirectIfEditIsDisabled) {
return $redirectIfEditIsDisabled;
}
$this->entityManager->remove($team);
$this->entityManager->flush();
return $this->redirectToRoute(
'app_admin_team_list',
['tournament' => $tournament->getId(), 'competition' => $competition->getId()]
);
}
/**
* @Route("/{team}/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" = "$competition.name" },
* { "label" = "Teams list", "route" = "app_admin_team_list", "params" = {"tournament" = "$tournament.id", "competition" = "$competition.id"} },
* { "label" = "Add team" }
* })
*
* @param Request $request
* @param Tournament $tournament
* @param Competition $competition
* @param Team $team
* @return Response
*/
public function edit(Request $request, Tournament $tournament, Competition $competition, Team $team): Response
{
$redirectIfEditIsDisabled = $this->disableEditIfTournamentActive($tournament);
if ($redirectIfEditIsDisabled) {
return $redirectIfEditIsDisabled;
}
$form = $this->createForm(TeamFormType::class, $team);
$form->handleRequest($request);
$editProcessResponse = $this->processTeam($form, $competition);
if ($editProcessResponse !== null) {
return $editProcessResponse;
}
return $this->render(
'admin/Team/edit.html.twig',
[
'form' => $form->createView(),
'tournament' => $tournament,
'competition' => $competition,
'team' => $team,
]
);
}
private function processTeam(FormInterface $form, Competition $competition): ?Response
{
if ($form->isSubmitted() && $form->isValid()) {
/** @var Team $team */
$team = $form->getData();
$team->addCompetition($competition);
$this->entityManager->persist($team);
$this->entityManager->flush();
$this->addFlash(
'notice',
"Your have saved a team: {$team->getId()} {$team->getName()}"
);
return $this->redirectToRoute(
'app_admin_team_list',
[
'tournament' => $competition->getTournament()->getId(),
'competition' => $competition->getId(),
]
);
}
return null;
}
}