From 3534d8473cd61b6271479ead73bab717c93d2324 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 | 30 ++++++ src/Entity/EventRegistration.php | 100 ++++++++++++++++++ src/Form/EventRegistrationType.php | 31 ++++++ .../EventRegistrationRepository.php | 32 ++++++ templates/events/index.html.twig | 14 +++ .../Website/EventWebsiteControllerTest.php | 35 ++++++ .../Traits/EventRegistrationTrait.php | 28 +++++ tests/Unit/Entity/EventRegistrationTest.php | 53 ++++++++++ 8 files changed, 323 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 643730b..ef8b603 100644 --- a/src/Controller/Website/EventWebsiteController.php +++ b/src/Controller/Website/EventWebsiteController.php @@ -5,9 +5,12 @@ namespace App\Controller\Website; use App\Entity\Event; +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; @@ -18,6 +21,7 @@ class EventWebsiteController extends AbstractController public function __construct( private readonly EventRepository $eventRepository, private readonly TemplateAttributeResolverInterface $templateAttributeResolver, + private readonly EventRegistrationRepository $eventRegistrationRepository, ) { } @@ -29,11 +33,37 @@ public function indexAction(int $id, Request $request): Response throw new NotFoundHttpException(); } + $registration = $this->eventRegistrationRepository->create($event); + $form = $this->createForm(EventRegistrationType::class, $registration); + $form->add( + 'submit', + SubmitType::class, + [ + 'label' => 'Create', + ], + ); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $this->eventRegistrationRepository->save($registration); + + return $this->redirectToRoute( + 'app.event', + [ + 'id' => $event->getId(), + 'success' => true, + ], + ); + } + return $this->render( 'events/index.html.twig', $this->templateAttributeResolver->resolve( [ 'event' => $event, + 'success' => $request->query->get('success'), + 'form' => $form->createView(), 'content' => ['title' => $event->getTitle()], ], ), diff --git a/src/Entity/EventRegistration.php b/src/Entity/EventRegistration.php new file mode 100644 index 0000000..de620a2 --- /dev/null +++ b/src/Entity/EventRegistration.php @@ -0,0 +1,100 @@ +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..42d7741 --- /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..3d32311 --- /dev/null +++ b/src/Repository/EventRegistrationRepository.php @@ -0,0 +1,32 @@ + + */ +class EventRegistrationRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, EventRegistration::class); + } + + public function create(Event $event): EventRegistration + { + return new EventRegistration($event); + } + + 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 1384c27..c7249f8 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; @@ -11,6 +12,7 @@ class EventWebsiteControllerTest extends SuluTestCase { + use EventRegistrationTrait; use EventTrait; private KernelBrowser $client; @@ -34,4 +36,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..895fd07 --- /dev/null +++ b/tests/Functional/Traits/EventRegistrationTrait.php @@ -0,0 +1,28 @@ +getEventRegistrationRepository()->findBy(['event' => $event]); + } + + protected function getEventRegistrationRepository(): EventRegistrationRepository + { + return static::getEntityManager()->getRepository(EventRegistration::class); + } + + abstract protected static function getEntityManager(): EntityManagerInterface; +} diff --git a/tests/Unit/Entity/EventRegistrationTest.php b/tests/Unit/Entity/EventRegistrationTest.php new file mode 100644 index 0000000..b714970 --- /dev/null +++ b/tests/Unit/Entity/EventRegistrationTest.php @@ -0,0 +1,53 @@ + + */ + private ObjectProphecy $event; + + private EventRegistration $eventRegistration; + + protected function setUp(): void + { + $this->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()); + } +}