From d5633e9292b76f06380f97b0918ef30e5b78fd7e Mon Sep 17 00:00:00 2001 From: Johannes Wachter Date: Wed, 25 Sep 2019 07:35:42 +0200 Subject: [PATCH] 06 - Add an event registration to the website --- .../Website/EventWebsiteController.php | 31 +++++ src/Entity/EventRegistration.php | 129 ++++++++++++++++++ src/Form/EventRegistrationType.php | 31 +++++ .../EventRegistrationRepository.php | 39 ++++++ templates/events/index.html.twig | 14 ++ .../Website/EventWebsiteControllerTest.php | 35 +++++ .../Traits/EventRegistrationTrait.php | 28 ++++ tests/Unit/Entity/EventRegistrationTest.php | 53 +++++++ 8 files changed, 360 insertions(+) create mode 100644 src/Entity/EventRegistration.php create mode 100644 src/Form/EventRegistrationType.php create mode 100644 src/Repository/EventRegistrationRepository.php create mode 100644 tests/Functional/Traits/EventRegistrationTrait.php create mode 100644 tests/Unit/Entity/EventRegistrationTest.php diff --git a/src/Controller/Website/EventWebsiteController.php b/src/Controller/Website/EventWebsiteController.php index 7653c16..1f47633 100644 --- a/src/Controller/Website/EventWebsiteController.php +++ b/src/Controller/Website/EventWebsiteController.php @@ -4,9 +4,12 @@ namespace App\Controller\Website; +use App\Form\EventRegistrationType; +use App\Repository\EventRegistrationRepository; use App\Repository\EventRepository; use Sulu\Bundle\WebsiteBundle\Resolver\TemplateAttributeResolverInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -20,11 +23,38 @@ public function indexAction(int $id, Request $request): Response throw new NotFoundHttpException(); } + $eventRegistrationRepository = $this->get(EventRegistrationRepository::class); + $registration = $eventRegistrationRepository->create($event); + $form = $this->createForm(EventRegistrationType::class, $registration); + $form->add( + 'submit', + SubmitType::class, + [ + 'label' => 'Create', + ] + ); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $eventRegistrationRepository->save($registration); + + return $this->redirectToRoute( + 'app.event', + [ + 'id' => $event->getId(), + 'success' => true, + ] + ); + } + return $this->render( 'events/index.html.twig', $this->get(TemplateAttributeResolverInterface::class)->resolve( [ 'event' => $event, + 'success' => $request->query->get('success'), + 'form' => $form->createView(), 'content' => ['title' => $event->getTitle()], ] ) @@ -40,6 +70,7 @@ public static function getSubscribedServices(): array parent::getSubscribedServices(), [ EventRepository::class, + EventRegistrationRepository::class, TemplateAttributeResolverInterface::class, ] ); diff --git a/src/Entity/EventRegistration.php b/src/Entity/EventRegistration.php new file mode 100644 index 0000000..db9338a --- /dev/null +++ b/src/Entity/EventRegistration.php @@ -0,0 +1,129 @@ +event = $event; + } + + public function getId(): ?int + { + return $this->id; + } + + public function getEvent(): Event + { + return $this->event; + } + + public function getFirstName(): ?string + { + return $this->firstName; + } + + public function setFirstName(string $firstName): self + { + $this->firstName = $firstName; + + return $this; + } + + public function getLastName(): ?string + { + return $this->lastName; + } + + public function setLastName(string $lastName): self + { + $this->lastName = $lastName; + + return $this; + } + + public function getEmail(): ?string + { + return $this->email; + } + + public function setEmail(string $email): self + { + $this->email = $email; + + return $this; + } + + public function getMessage(): ?string + { + return $this->message; + } + + public function setMessage(string $message): self + { + $this->message = $message; + + return $this; + } +} diff --git a/src/Form/EventRegistrationType.php b/src/Form/EventRegistrationType.php new file mode 100644 index 0000000..2f57fc1 --- /dev/null +++ b/src/Form/EventRegistrationType.php @@ -0,0 +1,31 @@ +add('firstName') + ->add('lastName') + ->add('email') + ->add('message'); + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults( + [ + 'data_class' => EventRegistration::class, + ] + ); + } +} diff --git a/src/Repository/EventRegistrationRepository.php b/src/Repository/EventRegistrationRepository.php new file mode 100644 index 0000000..cbf085b --- /dev/null +++ b/src/Repository/EventRegistrationRepository.php @@ -0,0 +1,39 @@ + + */ +class EventRegistrationRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, EventRegistration::class); + } + + public function create(Event $event): EventRegistration + { + $registration = new EventRegistration($event); + + return $registration; + } + + public function save(EventRegistration $registration): void + { + $this->getEntityManager()->persist($registration); + $this->getEntityManager()->flush(); + } +} diff --git a/templates/events/index.html.twig b/templates/events/index.html.twig index 8ad50f6..f31fde2 100644 --- a/templates/events/index.html.twig +++ b/templates/events/index.html.twig @@ -1,5 +1,7 @@ {% extends "base.html.twig" %} +{% form_theme form 'bootstrap_4_layout.html.twig' %} + {% block content %}
@@ -12,6 +14,18 @@ {{ event.description|raw }}
+
+ {% if success %} +
+ Thanks for your registration. +
+ {% else %} +

Register for this event:

+ + {{ form(form) }} + {% endif %} +
+ {% if event.image %}
{% set image = sulu_resolve_media(event.image, app.request.locale) %} diff --git a/tests/Functional/Controller/Website/EventWebsiteControllerTest.php b/tests/Functional/Controller/Website/EventWebsiteControllerTest.php index a05e48d..06c8103 100644 --- a/tests/Functional/Controller/Website/EventWebsiteControllerTest.php +++ b/tests/Functional/Controller/Website/EventWebsiteControllerTest.php @@ -4,6 +4,7 @@ namespace App\Tests\Functional\Controller\Website; +use App\Tests\Functional\Traits\EventRegistrationTrait; use App\Tests\Functional\Traits\EventTrait; use Sulu\Bundle\TestBundle\Testing\SuluTestCase; use Symfony\Bundle\FrameworkBundle\KernelBrowser; @@ -12,6 +13,7 @@ class EventWebsiteControllerTest extends SuluTestCase { use EventTrait; + use EventRegistrationTrait; /** * @var KernelBrowser @@ -37,4 +39,37 @@ public function testIndexAction(): void $this->assertStringContainsString('Sulu is awesome', $crawler->filter('h1')->html()); } + + public function testRegister(): void + { + $event = $this->createEvent('Sulu is awesome', 'en'); + + $crawler = $this->client->request('GET', '/en/event/' . $event->getId()); + + $response = $this->client->getResponse(); + $this->assertInstanceOf(Response::class, $response); + $this->assertHttpStatusCode(200, $response); + + $form = $crawler->filter('#event_registration_submit')->form( + [ + 'event_registration[firstName]' => 'Max', + 'event_registration[lastName]' => 'Mustermann', + 'event_registration[email]' => 'max@mustermann.at', + 'event_registration[message]' => 'I would love to see this.', + ] + ); + + $this->client->submit($form); + $crawler = $this->client->followRedirect(); + + $this->assertStringContainsString('Thanks for your registration', $crawler->filter('.success')->html()); + + $registrations = $this->findEventRegistrations($event); + + $this->assertCount(1, $registrations); + $this->assertSame('Max', $registrations[0]->getFirstName()); + $this->assertSame('Mustermann', $registrations[0]->getLastName()); + $this->assertSame('max@mustermann.at', $registrations[0]->getEmail()); + $this->assertSame('I would love to see this.', $registrations[0]->getMessage()); + } } diff --git a/tests/Functional/Traits/EventRegistrationTrait.php b/tests/Functional/Traits/EventRegistrationTrait.php new file mode 100644 index 0000000..9c0dd32 --- /dev/null +++ b/tests/Functional/Traits/EventRegistrationTrait.php @@ -0,0 +1,28 @@ +getEventRegistrationRepository()->findBy(['event' => $event]); + } + + protected function getEventRegistrationRepository(): EventRegistrationRepository + { + return $this->getEntityManager()->getRepository(EventRegistration::class); + } + + abstract protected function getEntityManager(): EntityManagerInterface; +} diff --git a/tests/Unit/Entity/EventRegistrationTest.php b/tests/Unit/Entity/EventRegistrationTest.php new file mode 100644 index 0000000..83bf8ef --- /dev/null +++ b/tests/Unit/Entity/EventRegistrationTest.php @@ -0,0 +1,53 @@ +event = $this->prophesize(Event::class); + $this->eventRegistration = new EventRegistration($this->event->reveal()); + } + + public function testFirstName(): void + { + $this->assertSame($this->eventRegistration, $this->eventRegistration->setFirstName('Max')); + $this->assertSame('Max', $this->eventRegistration->getFirstName()); + } + + public function testGetLastName(): void + { + $this->assertSame($this->eventRegistration, $this->eventRegistration->setLastName('Mustermann')); + $this->assertSame('Mustermann', $this->eventRegistration->getLastName()); + } + + public function testGetEmail(): void + { + $this->assertSame($this->eventRegistration, $this->eventRegistration->setEmail('max@mustermann.at')); + $this->assertSame('max@mustermann.at', $this->eventRegistration->getEmail()); + } + + public function testGetMessage(): void + { + $this->assertSame($this->eventRegistration, $this->eventRegistration->setMessage('I would live to see this.')); + $this->assertSame('I would live to see this.', $this->eventRegistration->getMessage()); + } +}