src/Form/Frontend/InscripcionEquipoType.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\Form\Frontend;
  3. use Symfony\Component\Form\AbstractType;
  4. use Symfony\Component\Form\FormBuilderInterface;
  5. use Symfony\Component\Form\FormEvents;
  6. use Doctrine\ORM\EntityRepository;
  7. use App\DBAL\Backend\EnumTurnoHorarioType as EnumTurnoHorarioType;
  8. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  9. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  10. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  11. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  12. use Symfony\Component\Validator\Constraints as Assert;
  13. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  14. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  15. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  16. use Symfony\Component\Form\Extension\Core\Type\TextType;
  17. use Doctrine\Persistence\ManagerRegistry;
  18. use App\Entity\Backend\Tarifa;
  19. use App\Entity\Backend\Categoria;
  20. use App\Util\UtilInscritos;
  21. class InscripcionEquipoType extends AbstractType {
  22. private $em;
  23. private $utilInscritos;
  24. //Añadimos el EntityManager para poder ir a la BD y traernos las barra-categorias disponibles de esa competicion, para evitar fallos de validacion en el formulario
  25. public function __construct(ManagerRegistry $em, UtilInscritos $utilInscritos, private readonly ValidateInscriptionRates $validateInscriptionRates){
  26. $this->em = $em;
  27. $this->utilInscritos = $utilInscritos;
  28. }
  29. public function buildForm(FormBuilderInterface $builder, array $options) {
  30. $builder->addEventListener(FormEvents::POST_SUBMIT, $this->validateInscriptionRates);
  31. $idc = $options['attr']['competicion']->getId();
  32. $permitirExtranjeros = $options['attr']['competicion']->getpermitirExtranjeros() ? "-andEnglish" : "";
  33. $builder
  34. ->add('save', SubmitType::class, array('label' => 'Continuar', 'attr' => array('class' => 'ui big blue fluid circular disabled button')))
  35. ->add('email', EmailType::class, array('label' => 'E-mail', 'mapped' => false, 'required' => true, 'attr' => array('data-help' => 'Se activa tras añadir licencias correctas.', 'disabled' => 'disabled', 'class' => 'form_email')))
  36. ->add('observaciones', TextareaType::class, array('label' => 'competicion.inscritos.annotation' . $permitirExtranjeros, 'translation_domain' => 'FrontendBundle', 'required' => false, 'attr' => array('maxlength' => 100, 'rows' => 7)))
  37. ->add("teamname", TextType::class, array('required' => false, 'mapped' => false, 'label' => 'competicion.inscritos.teamname' . $permitirExtranjeros, 'translation_domain' => 'FrontendBundle'))
  38. ;
  39. if (count(($options['attr']['competicion']->getVouchers())) > 0) {
  40. $builder->add('voucher', TextType::class, array('mapped' => false, 'required' => false, 'attr' => array('class' => 'form-control')));
  41. }
  42. for ($i = 1; $i <= $options["attr"]["jugadores"]; $i++) {
  43. $required = true;
  44. if (!$options["attr"]['competicion']->getEstricto() && ($i == $options["attr"]["competicion"]->getJugadores())) {
  45. $required = false;
  46. }
  47. $builder
  48. ->add("nombre_jugador$i", TextType::class, array('required' => $required, 'mapped' => false, 'label' => 'competicion.inscritos.name' . $permitirExtranjeros, 'translation_domain' => 'FrontendBundle', 'attr' => array('class' => 'jugador', 'disabled' => 'disabled')))
  49. ->add("licencia$i", TextType::class, array('required' => $required, 'mapped' => false, 'attr' => array('placeholder' => "Licencia", 'class' => 'prompt licencia', 'autocomplete' => 'off'), 'label' => 'competicion.inscritos.licencia' . $permitirExtranjeros, 'translation_domain' => 'FrontendBundle'))
  50. ->add("tarifa_select$i", EntityType::class, array('attr' => array('class' => "tarifa tarifa$i", 'disabled' => 'disabled'),
  51. 'label' => 'competicion.inscritos.fare' . $permitirExtranjeros,
  52. 'translation_domain' => 'FrontendBundle',
  53. 'required' => $required,
  54. 'mapped' => false,
  55. 'class' => Tarifa::class,
  56. 'placeholder' => 'competicion.inscritos.fare-empty' . $permitirExtranjeros,
  57. 'query_builder' => function (EntityRepository $e) use ($idc) {
  58. $now = new \DateTime('now');
  59. return $e->createQueryBuilder('a')
  60. ->innerJoin('Backend:Competicion', 'c', 'WITH', 'c.id = a.competicion')
  61. ->innerJoin('Backend:Club', 'cl', 'WITH', 'c.club = cl.id')
  62. ->innerJoin('Backend:Timezone', 't', 'WITH', 't.id = cl.timezone')
  63. ->where('a.competicion = :competicion')
  64. ->andWhere("a.inicio IS NULL OR CONVERT_TZ(a.inicio, t.nombre, '" . date_default_timezone_get() . "') <= :now")
  65. ->andWhere("a.fin IS NULL OR CONVERT_TZ(a.fin, t.nombre, '". date_default_timezone_get() . "') >= :now")
  66. ->setParameter('now', $now)
  67. ->setParameter('competicion', $idc);
  68. }
  69. ))
  70. ->add("id$i", HiddenType::class, array('mapped' => false))
  71. ->add("categoria$i", HiddenType::class, array('mapped' => false))
  72. ->add("tarifa$i", HiddenType::class, array('mapped' => false))
  73. ->add("telefono_jugador$i", TextType::class, array('required' => false, 'mapped' => false, 'label' => 'Teléfono', 'attr' => array('class' => 'tlfnJug phone-input', 'data-help' => "Se usará para informarle sobre el campeonato")))
  74. ->add("tlfnPrefix$i", HiddenType::class, array('mapped' => false, 'attr' => array('class' => 'phone-prefix-input')))
  75. ;
  76. if (!$options['attr']['competicion']->getBarraSalida()) {
  77. $builder->add("categoria_select$i", EntityType::class, array('attr' => array('class' => 'categoria', 'disabled' => 'disabled'),
  78. 'label' => 'competicion.inscritos.category' . $permitirExtranjeros,
  79. 'translation_domain' => 'FrontendBundle',
  80. 'mapped' => false,
  81. 'required' => $required,
  82. 'class' => Categoria::class,
  83. 'placeholder' => 'competicion.inscritos.category-empty' . $permitirExtranjeros,
  84. 'query_builder' => function (EntityRepository $e) use ($idc) {
  85. return $e->createQueryBuilder('a')
  86. ->where('a.competicion = :competicion')
  87. ->setParameter('competicion', $idc);
  88. }
  89. ));
  90. } else {
  91. $builder
  92. ->add("barra$i", ChoiceType::class, array('attr' => ['class' => "barraSalida barraSalida$i "], //el espacio posterior es necesario
  93. 'label' => 'competicion.inscritos.tee' . $permitirExtranjeros,
  94. 'translation_domain' => 'FrontendBundle',
  95. 'mapped' => false,
  96. 'required' => true,
  97. 'empty_data' => 'competicion.inscritos.tee-empty' . $permitirExtranjeros,
  98. 'placeholder' => 'competicion.inscritos.tee-empty' . $permitirExtranjeros,
  99. 'choices' => $this->utilInscritos->barrasCategorias($idc) //nos traemos los barra-categoria de la competicion
  100. ));
  101. }
  102. }
  103. //solo mostramos turno si hay plazas definidas
  104. if (($options['attr']['competicion']->getPlazasManana() > 0) || ($options['attr']['competicion']->getPlazasTarde() > 0)) {
  105. $dispManana = $options['attr']['dispManana']; //las plazas que hay vacantes aun (totales menos las usadas)
  106. $dispTarde = $options['attr']['dispTarde'];
  107. if (($dispManana >= $options["attr"]["jugadores"]) && ($dispTarde >= $options["attr"]["jugadores"])) {
  108. $builder->add('turno', ChoiceType::class, array('choices' => EnumTurnoHorarioType::getSmallChoices(), 'expanded' => false, 'mapped' => false, 'required' => true, 'attr' => array('class' => 'form-control')));
  109. } elseif (($dispManana >= $options["attr"]["jugadores"]) && ($dispTarde < 1)) {
  110. $builder->add('turno', ChoiceType::class, array('choices' => EnumTurnoHorarioType::getMananaChoices(), 'expanded' => false, 'mapped' => false, 'required' => true, 'attr' => array('class' => 'form-control')));
  111. } elseif (($dispManana < 1) && ($dispTarde >= $options["attr"]["jugadores"])) {
  112. $builder->add('turno', ChoiceType::class, array('choices' => EnumTurnoHorarioType::getTardeChoices(), 'expanded' => false, 'mapped' => false, 'required' => true, 'attr' => array('class' => 'form-control')));
  113. }
  114. }
  115. // ->add('captcha', 'captcha', array('width' => 240, 'height' => 60, 'max_front_lines' => 1, 'max_behind_lines' => 3, 'distortion' => true, 'quality' => 150, 'length' => 6, 'interpolation' => true, 'background_color' => [245, 245, 245]));
  116. }
  117. public function getDefaultOptions() {
  118. return array(
  119. 'data_class' => 'App\Entity\Backend\Competicion',
  120. 'id' => null
  121. );
  122. }
  123. public function getName() {
  124. return $this->getBlockPrefix();
  125. }
  126. public function getBlockPrefix(): string {
  127. return 'inscripcion_equipo';
  128. }
  129. }