src/Form/InscriptionStartType.php line 74

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\MajorationTransport;
  4. use App\Entity\SejourSession;
  5. use App\Entity\Inscription;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Component\Form\AbstractType;
  8. use Symfony\Component\Form\FormBuilderInterface;
  9. use Doctrine\ORM\EntityRepository;
  10. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  11. use Symfony\Component\OptionsResolver\OptionsResolver;
  12. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  13. use Symfony\Component\Form\FormEvent;
  14. use Symfony\Component\Form\FormEvents;
  15. use Symfony\Component\Form\FormInterface;
  16. class InscriptionStartType extends AbstractType
  17. {
  18. private $em;
  19. public function __construct(EntityManagerInterface $em)
  20. {
  21. $this->em = $em;
  22. }
  23. public function buildForm(FormBuilderInterface $builder, array $options): void
  24. {
  25. $data = $this->em->getRepository(SejourSession::class)->createQueryBuilder('ss')
  26. ->andWhere('ss.dateDebut > :now')
  27. ->andWhere('ss.sejour = :sejour')
  28. ->leftJoin('ss.inscriptions', 'i')
  29. ->andWhere('ss.placeDispo >= :zero')
  30. ->setParameter('sejour', $options['sejour'])
  31. ->setParameter('zero', 0)
  32. ->groupBy('ss.id')
  33. ->setParameter('now', (new \Datetime()))
  34. ->orderBy('ss.dateDebut', 'ASC')
  35. ->getQuery()
  36. ->getResult();
  37. $output = [];
  38. foreach ($data as $date) {
  39. if ($date->getFreePlacesNumber() > 0) {
  40. $output[] = $date;
  41. }
  42. }
  43. $builder->add('sejourSession', EntityType::class, [
  44. 'class' => SejourSession::class,
  45. 'choice_label' => function ($el) {
  46. $label = 'Du ' . $el->getDateDebut()->format('d/m/Y') . ' au ' . $el->getDateFin()->format('d/m/Y') . ' : ' . $el->getPrix() . ' € ';
  47. return $label;
  48. },
  49. 'choice_attr' => function($choice, $key, $value) {
  50. return ['freePlace' => $choice->getFreePlacesNumber()];
  51. },
  52. 'choices' => $output,
  53. 'required' => true,
  54. 'expanded' => true,
  55. 'multiple' => false
  56. ])
  57. ->add('submit', SubmitType::class, [
  58. 'attr' => ['class' => 'button bounce item-sejour__button']
  59. ]);
  60. $formModifier = function (FormInterface $form, SejourSession $sejourSession = null) {
  61. $form->add('majorationTransportAller', EntityType::class, [
  62. 'class' => MajorationTransport::class,
  63. 'attr' => ['class' => 'form-control'],
  64. 'choice_label' => function ($el)use ($sejourSession) {
  65. $out = "";
  66. foreach ($el->getSejourSessionMajorationTransports() as $key => $ssmt) {
  67. if($ssmt->getSejourSession() == $sejourSession){
  68. $out = $ssmt->getIsActive() == 1 ? $el->getPrice() . " €":"Complet";
  69. break;
  70. }
  71. }
  72. return $el->getVille() . " : " . $out;
  73. },
  74. 'query_builder' => function (EntityRepository $er) use ($sejourSession) {
  75. return $er->createQueryBuilder('mt')
  76. ->join('mt.sejourSessionMajorationTransports', 'ssmt')
  77. ->andWhere('ssmt.sejourSession = :session')
  78. ->andWhere('mt.isActive = :true')
  79. ->andWhere('ssmt.direction = :aller')
  80. ->orderBy('mt.ville', 'ASC')
  81. ->setParameter('true', true)
  82. ->setParameter('aller', 'aller')
  83. ->setParameter('session', $sejourSession);
  84. },
  85. 'label' => 'Majoration transport Aller',
  86. 'required' => true,
  87. 'placeholder' => $sejourSession != null ? 'sur Place (' . $sejourSession->getSejour()->getLocation()->getCity() . ') : 0 €' : 'sur Place'
  88. ])
  89. ->add('majorationTransportRetour', EntityType::class, [
  90. 'class' => MajorationTransport::class,
  91. 'attr' => ['class' => 'form-control'],
  92. 'choice_label' => function ($el) use ($sejourSession) {
  93. $out = "";
  94. foreach ($el->getSejourSessionMajorationTransports() as $key => $ssmt) {
  95. if($ssmt->getSejourSession() == $sejourSession){
  96. $out = $ssmt->getIsActive() == 1 ? $el->getPrice() . " €":"Complet";
  97. break;
  98. }
  99. }
  100. return $el->getVille() . " : " . $out;
  101. },
  102. 'query_builder' => function (EntityRepository $er) use ($sejourSession) {
  103. $response = $er->createQueryBuilder('mt')
  104. ->join('mt.sejourSessionMajorationTransports', 'ssmt')
  105. ->andWhere('ssmt.sejourSession = :session')
  106. ->andWhere('ssmt.isActive = :true')
  107. ->andWhere('ssmt.direction = :aller')
  108. ->andWhere('mt.isActive = :true')
  109. ->orderBy('mt.ville', 'ASC')
  110. ->setParameter('true', true)
  111. ->setParameter('aller', 'retour')
  112. ->setParameter('session', $sejourSession);
  113. return $response;
  114. },
  115. 'label' => 'Majoration transport Retour',
  116. 'required' => true,
  117. 'placeholder' => $sejourSession != null ? 'sur Place (' . $sejourSession->getSejour()->getLocation()->getCity() . ') : 0 €' : 'sur Place'
  118. ]);
  119. };
  120. $builder->addEventListener(
  121. FormEvents::PRE_SET_DATA,
  122. function (FormEvent $event) use ($formModifier) {
  123. // this would be your entity, i.e. SportMeetup
  124. $data = $event->getData();
  125. $formModifier($event->getForm(), $data->getSejourSession());
  126. }
  127. );
  128. $builder->get('sejourSession')->addEventListener(
  129. FormEvents::POST_SUBMIT,
  130. function (FormEvent $event) use ($formModifier) {
  131. // It's important here to fetch $event->getForm()->getData(), as
  132. // $event->getData() will get you the client data (that is, the ID)
  133. $sejourSession = $event->getForm()->getData();
  134. // since we've added the listener to the child, we'll have to pass on
  135. // the parent to the callback function!
  136. $formModifier($event->getForm()->getParent(), $sejourSession);
  137. }
  138. );
  139. }
  140. public function configureOptions(OptionsResolver $resolver): void
  141. {
  142. $resolver->setDefaults([
  143. 'data_class' => Inscription::class,
  144. 'sejour' => null
  145. ]);
  146. }
  147. }