<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\Form\FormError;
use App\Entity\Event;
use App\Entity\Competition;
use App\Entity\Participant;
use App\Form\Type\CompetitionFormType;
class DashboardCompetitionController extends AbstractController {
/**
* @Route("/dashboard/event/{slug}/competitions", name="dashboard_competition_index")
*/
public function index(EntityManagerInterface $em, $slug) {
$event = $em->getRepository(Event::class)->findOneBy(['slug' => $slug]);
if (null === $event) {
return $this->redirectToRoute('dashboard_index');
}
return $this->render('dashboard/competition/index.html.twig', [
'event' => $event
]);
}
/**
* @Route("/dashboard/event/{slug}/competition/add", name="dashboard_competition_create")
*/
public function create(Request $request, EntityManagerInterface $em, $slug) {
$event = $em->getRepository(Event::class)->findOneBy(['slug' => $slug]);
if (null === $event) {
return $this->redirectToRoute('dashboard_index');
}
$competition = new Competition();
$form = $this->createForm(CompetitionFormType::class, $competition);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$image = $form->get('image')->getData();
if ($image) {
$newFilename = uniqid() . '.' . $image->guessExtension();
try {
$image->move(
$this->getParameter('upload_directory'), $newFilename
);
} catch (FileException $e) {
$form->get('image')->addError(new FormError($e->getMessage()));
return $this->render('dashboard/competition/create.html.twig', [
'event' => $event,
'competition' => $competition,
'form' => $form->createView()
]);
}
$competition->setPicture($newFilename);
}
// save changes to db
$competition->setEvent($event);
$em->persist($competition);
$em->flush();
// set success flash message
$this->get('session')->getFlashBag()->set('success', 'Competition successfully created!');
// redirect to listing page
return $this->redirectToRoute('dashboard_competition_index', ['slug' => $slug]);
}
return $this->render('dashboard/competition/create.html.twig', [
'event' => $event,
'competition' => $competition,
'form' => $form->createView()
]);
}
/**
* @Route("/dashboard/event/{slug}/competition/{competitionSlug}/edit", name="dashboard_competition_edit")
*/
public function edit(Request $request, EntityManagerInterface $em, $slug, $competitionSlug) {
$event = $em->getRepository(Event::class)->findOneBy(['slug' => $slug]);
if (null === $event) {
return $this->redirectToRoute('dashboard_index');
}
$competition = $em->getRepository(Competition::class)->findOneBy(['slug' => $competitionSlug]);
if (null === $competition) {
return $this->redirectToRoute('dashboard_competition_index', ['slug' => $slug]);
}
$form = $this->createForm(CompetitionFormType::class, $competition);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$image = $form->get('image')->getData();
if ($image) {
$newFilename = uniqid() . '.' . $image->guessExtension();
try {
$image->move(
$this->getParameter('upload_directory'), $newFilename
);
} catch (FileException $e) {
$form->get('image')->addError(new FormError($e->getMessage()));
return $this->render('dashboard/competition/create.html.twig', [
'event' => $event,
'competition' => $competition,
'form' => $form->createView()
]);
}
$competition->setPicture($newFilename);
}
$em->persist($competition);
$em->flush();
// set success flash message
$this->get('session')->getFlashBag()->set('success', 'Competition successfully updated!');
// redirect to homepage
return $this->redirectToRoute('dashboard_competition_index', ['slug' => $slug]);
}
return $this->render('dashboard/competition/edit.html.twig', [
'event' => $event,
'competition' => $competition,
'form' => $form->createView()
]);
}
/**
* @Route("/dashboard/competition/{slug}/update/status", name="dashboard_competition_update_status")
*/
public function updateStatus(EntityManagerInterface $em, $slug) {
$competition = $em->getRepository(Competition::class)->findOneBy(['slug' => $slug]);
if (null !== $competition) {
// check current event status
if ($competition->isActive()) {
$active = false;
} else {
$active = true;
}
// save new status to DB
$competition->setActive($active);
$em->persist($competition);
$em->flush();
// set flash message
$this->get('session')->getFlashBag()->set('success', sprintf('Competition successfully %s!', $active ? 'enabled' : 'disabled'));
}
return $this->redirectToRoute('dashboard_index');
}
/**
* @Route("/dashboard/event/{slug}/competition/{competitionSlug}/delete", name="dashboard_competition_delete")
*/
public function delete(EntityManagerInterface $em, $slug, $competitionSlug) {
$event = $em->getRepository(Event::class)->findOneBy(['slug' => $slug]);
if (null === $event) {
return $this->redirectToRoute('dashboard_index');
}
$competition = $em->getRepository(Competition::class)->findOneBy(['slug' => $competitionSlug]);
if (null === $competition) {
return $this->redirectToRoute('dashboard_competition_index', ['slug' => $slug]);
}
$em->remove($competition);
$em->flush();
// set flash message
$this->get('session')->getFlashBag()->set('success', 'Competition successfully deleted!');
return $this->redirectToRoute('dashboard_competition_index', ['slug' => $slug]);
}
/**
* @Route("/dashboard/event/{slug}/competition/{competitionSlug}/participants", name="dashboard_competition_participants")
*/
public function participants(EntityManagerInterface $em, $slug, $competitionSlug) {
$event = $em->getRepository(Event::class)->findOneBy(['slug' => $slug]);
if (null === $event) {
return $this->redirectToRoute('dashboard_index');
}
$competition = $em->getRepository(Competition::class)->findOneBy(['slug' => $competitionSlug]);
if (null === $competition) {
return $this->redirectToRoute('dashboard_competition_index', ['slug' => $slug]);
}
return $this->render('dashboard/competition/participants.html.twig', [
'event' => $event,
'competition' => $competition
]);
}
/**
* @Route("/dashboard/event/{slug}/competition/{competitionSlug}/participant/{hash}/delete", name="dashboard_competition_participant_delete")
*/
public function deleteParticipant(EntityManagerInterface $em, $slug, $competitionSlug, $hash) {
$event = $em->getRepository(Event::class)->findOneBy(['slug' => $slug]);
if (null === $event) {
return $this->redirectToRoute('dashboard_index');
}
$competition = $em->getRepository(Competition::class)->findOneBy(['slug' => $competitionSlug]);
if (null === $competition) {
return $this->redirectToRoute('dashboard_competition_index', ['slug' => $slug]);
}
$participant = $em->getRepository(Participant::class)->findOneBy(['hash' => $hash]);
if (null === $participant) {
return $this->redirectToRoute('dashboard_competition_participants', ['slug' => $slug, 'competitionSlug' => $competitionSlug]);
}
$em->remove($participant);
$em->flush();
// set flash message
$this->get('session')->getFlashBag()->set('success', 'Participant successfully deleted!');
return $this->redirectToRoute('dashboard_competition_participants', ['slug' => $slug, 'competitionSlug' => $competitionSlug]);
}
}