diff --git a/config/packages/backoffice_menu.yaml b/config/packages/backoffice_menu.yaml index 89e958398..b713708e1 100644 --- a/config/packages/backoffice_menu.yaml +++ b/config/packages/backoffice_menu.yaml @@ -165,6 +165,7 @@ parameters: url: '/admin/event/billeterie-privee' extra_routes: - admin_event_billeterie_privee + - admin_event_billeterie_privee_add - admin_event_billeterie_privee_edit - admin_event_billeterie_privee_delete admin_event_prices: diff --git a/config/routing/admin_event.yml b/config/routing/admin_event.yml index cffc10dc8..a586f8370 100644 --- a/config/routing/admin_event.yml +++ b/config/routing/admin_event.yml @@ -91,6 +91,10 @@ admin_event_billeterie_privee: path: /billeterie-privee defaults: {_controller: AppBundle\Controller\Admin\Event\BilleteriePriveeAction} +admin_event_billeterie_privee_add: + path: /billeterie-privee/add + defaults: {_controller: AppBundle\Controller\Admin\Event\AddBilleteriePriveeAction} + admin_event_billeterie_privee_edit: path: /billeterie-privee/edit/{event}/{id} defaults: {_controller: AppBundle\Controller\Admin\Event\EditBilleteriePriveeAction} diff --git a/sources/AppBundle/Controller/Admin/Event/AddBilleteriePriveeAction.php b/sources/AppBundle/Controller/Admin/Event/AddBilleteriePriveeAction.php new file mode 100644 index 000000000..1affaadef --- /dev/null +++ b/sources/AppBundle/Controller/Admin/Event/AddBilleteriePriveeAction.php @@ -0,0 +1,67 @@ +event; + + $billeteriePrivee = new BilleteriePrivee(); + $billeteriePrivee->token = base64_encode(random_bytes(30)); + $billeteriePrivee->eventId = (int) $event->getId(); + $billeteriePrivee->dateDebut = new DateTimeImmutable(); + $billeteriePrivee->dateFin = DateTimeImmutable::createFromMutable($event->getDateEndSales()); + $billeteriePrivee->createdOn = new DateTimeImmutable(); + + $form = $this->createForm(BilleteriePriveeType::class, $billeteriePrivee, [ + 'ticketTypes' => $this->ticketTypeRepository->getAll(), + ]); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $motDePasse = $form->get('plainMotDePasse')->getData(); + if (is_string($motDePasse) && $motDePasse !== '') { + $billeteriePrivee->motDePasse = password_hash($motDePasse, PASSWORD_DEFAULT); + } + + $this->billeteriePriveeRepository->save($billeteriePrivee); + + $this->addFlash('notice', 'La billeterie privée a été enregistrée'); + + return $this->redirectToRoute('admin_event_billeterie_privee', [ + 'id' => (int) $event->getId(), + ]); + } + + return $this->render('admin/event/billeterie_privee_edit.html.twig', [ + 'is_new' => true, + 'billeterie_privee' => $billeteriePrivee, + 'places_prises' => null, + 'event' => $event, + 'title' => 'Billeteries privées - Nouvelle', + 'edit_title' => 'Nouvelle billeterie privée', + 'button_label' => 'Créer', + 'form' => $form->createView(), + ]); + } +} diff --git a/sources/AppBundle/Controller/Admin/Event/BilleteriePriveeAction.php b/sources/AppBundle/Controller/Admin/Event/BilleteriePriveeAction.php index c8a298d60..8dea5aff8 100644 --- a/sources/AppBundle/Controller/Admin/Event/BilleteriePriveeAction.php +++ b/sources/AppBundle/Controller/Admin/Event/BilleteriePriveeAction.php @@ -5,13 +5,9 @@ namespace AppBundle\Controller\Admin\Event; use AppBundle\Event\AdminEventSelection; -use AppBundle\Event\Entity\BilleteriePrivee; use AppBundle\Event\Entity\Repository\BilleteriePriveeRepository; -use AppBundle\Event\Form\BilleteriePriveeType; use AppBundle\Event\Model\Repository\TicketTypeRepository; -use DateTimeImmutable; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; class BilleteriePriveeAction extends AbstractController @@ -21,38 +17,10 @@ public function __construct( private readonly TicketTypeRepository $ticketTypeRepository, ) {} - public function __invoke(Request $request, AdminEventSelection $eventSelection): Response + public function __invoke(AdminEventSelection $eventSelection): Response { $event = $eventSelection->event; - $billeteriePrivee = new BilleteriePrivee(); - $billeteriePrivee->token = base64_encode(random_bytes(30)); - $billeteriePrivee->eventId = (int) $event->getId(); - $billeteriePrivee->dateDebut = new DateTimeImmutable(); - $billeteriePrivee->dateFin = DateTimeImmutable::createFromMutable($event->getDateEndSales()); - $billeteriePrivee->createdOn = new DateTimeImmutable(); - - $form = $this->createForm(BilleteriePriveeType::class, $billeteriePrivee, [ - 'ticketTypes' => $this->ticketTypeRepository->getAll(), - ]); - - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $motDePasse = $form->get('plainMotDePasse')->getData(); - if (is_string($motDePasse) && $motDePasse !== '') { - $billeteriePrivee->motDePasse = password_hash($motDePasse, PASSWORD_DEFAULT); - } - - $this->billeteriePriveeRepository->save($billeteriePrivee); - - $this->addFlash('notice', 'La billeterie privée a été enregistrée'); - - return $this->redirectToRoute('admin_event_billeterie_privee', [ - 'id' => (int) $event->getId(), - ]); - } - $billeteries = []; foreach ($this->billeteriePriveeRepository->findByEvent((int) $event->getId()) as $billeterie) { $ticketType = $this->ticketTypeRepository->get($billeterie->ticketTypeId); @@ -67,7 +35,6 @@ public function __invoke(Request $request, AdminEventSelection $eventSelection): 'billeteries_privees' => $billeteries, 'event' => $event, 'title' => 'Billeteries privées', - 'form' => $form->createView(), 'event_select_form' => $eventSelection->selectForm(), ]); } diff --git a/sources/AppBundle/Controller/Admin/Event/EditBilleteriePriveeAction.php b/sources/AppBundle/Controller/Admin/Event/EditBilleteriePriveeAction.php index 84dd6251e..83d4f8750 100644 --- a/sources/AppBundle/Controller/Admin/Event/EditBilleteriePriveeAction.php +++ b/sources/AppBundle/Controller/Admin/Event/EditBilleteriePriveeAction.php @@ -78,10 +78,12 @@ public function __invoke(Request $request, int $event, int $id): Response } return $this->render('admin/event/billeterie_privee_edit.html.twig', [ + 'is_new' => false, 'billeterie_privee' => $billeteriePrivee, 'places_prises' => $placesPrises, 'event' => $event, 'title' => 'Billeteries privées - Modifier', + 'edit_title' => $billeteriePrivee->nom, 'form' => $form->createView(), ]); } diff --git a/sources/AppBundle/Event/Form/BilleteriePriveeType.php b/sources/AppBundle/Event/Form/BilleteriePriveeType.php index 842a719b7..8ff95b0bb 100644 --- a/sources/AppBundle/Event/Form/BilleteriePriveeType.php +++ b/sources/AppBundle/Event/Form/BilleteriePriveeType.php @@ -26,8 +26,8 @@ class BilleteriePriveeType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options): void { $ticketTypes = $options['ticketTypes']; - if (!is_array($ticketTypes)) { - throw new \RuntimeException('L\'option ticketTypes doit être un tableau.'); + if (!is_iterable($ticketTypes)) { + throw new \RuntimeException('L\'option ticketTypes doit être un itérable.'); } $builder @@ -40,7 +40,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void ->add('ticketTypeId', ChoiceType::class, [ 'label' => 'Type de place', 'choices' => $this->ticketTypesToChoices($ticketTypes), - 'choice_value' => 'id', 'constraints' => [ new NotBlank(), ], @@ -97,20 +96,19 @@ public function configureOptions(OptionsResolver $resolver): void $resolver->setRequired([ 'ticketTypes', ]); - $resolver->setAllowedTypes('ticketTypes', 'array'); } /** - * @param array $ticketTypes - * @return array + * @param iterable $ticketTypes + * @return array */ - private function ticketTypesToChoices(array $ticketTypes): array + private function ticketTypesToChoices(iterable $ticketTypes): array { $choices = []; foreach ($ticketTypes as $ticketType) { if ($ticketType instanceof TicketType) { - $choices[$ticketType->getLabel()] = $ticketType; + $choices[$ticketType->getLabel()] = $ticketType->getId(); } } diff --git a/templates/admin/event/billeterie_privee.html.twig b/templates/admin/event/billeterie_privee.html.twig index 155f6ad8e..25747ef4a 100644 --- a/templates/admin/event/billeterie_privee.html.twig +++ b/templates/admin/event/billeterie_privee.html.twig @@ -1,7 +1,12 @@ {% extends 'admin/base_with_header.html.twig' %} {% block content %} -

Billeteries privées

+
+
+

Billeteries privées

+ Nouvelle billeterie privée +
+
{% include 'admin/event/change_event.html.twig' with {form: event_select_form} only %} {% if billeteries_privees|length > 0 %} @@ -57,78 +62,4 @@ {% endif %} - -
-

Nouvelle billeterie privée

- -
- - {{ form_start(form) }} - - - - - - - - - - - - - - - - - - - - - - - - -
{{ form_label(form.nom) }}{{ form_label(form.ticketTypeId) }}{{ form_label(form.prix) }}{{ form_label(form.maxPlaces) }}{{ form_label(form.dateDebut) }}{{ form_label(form.dateFin) }}{{ form_label(form.plainMotDePasse) }}
-
- {{ form_errors(form.nom) }} - {{ form_widget(form.nom) }} -
-
-
- {{ form_errors(form.ticketTypeId) }} - {{ form_widget(form.ticketTypeId) }} -
-
-
- {{ form_errors(form.prix) }} - {{ form_widget(form.prix) }} -
-
-
- {{ form_errors(form.maxPlaces) }} - {{ form_widget(form.maxPlaces) }} -
-
-
- {{ form_errors(form.dateDebut) }} - {{ form_widget(form.dateDebut) }} -
-
-
- {{ form_errors(form.dateFin) }} - {{ form_widget(form.dateFin) }} -
-
-
- {{ form_errors(form.plainMotDePasse) }} - {{ form_widget(form.plainMotDePasse) }} -
-
- -
- - {{ form_errors(form) }} - - {{ form_end(form) }} -
{% endblock %} diff --git a/templates/admin/event/billeterie_privee_edit.html.twig b/templates/admin/event/billeterie_privee_edit.html.twig index 9154e9e59..2dd55cdfe 100644 --- a/templates/admin/event/billeterie_privee_edit.html.twig +++ b/templates/admin/event/billeterie_privee_edit.html.twig @@ -6,13 +6,15 @@

{{ title }}

{{ form_start(form) }} -

{{ billeterie_privee.nom }}

+

{{ edit_title }}

+ {% if not is_new|default(false) %}

Token : {{ billeterie_privee.token }}
{% if places_prises is not null %} Places déjà prises : {{ places_prises }} {% endif %}

+ {% endif %}
{{ form_row(form.nom) }} @@ -28,7 +30,7 @@
- + Annuler