<?php
namespace App\Form;
use App\Entity\MajorationTransport;
use App\Entity\SejourSession;
use App\Entity\Inscription;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
class InscriptionStartType extends AbstractType
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$data = $this->em->getRepository(SejourSession::class)->createQueryBuilder('ss')
->andWhere('ss.dateDebut > :now')
->andWhere('ss.sejour = :sejour')
->leftJoin('ss.inscriptions', 'i')
->andWhere('ss.placeDispo >= :zero')
->setParameter('sejour', $options['sejour'])
->setParameter('zero', 0)
->groupBy('ss.id')
->setParameter('now', (new \Datetime()))
->orderBy('ss.dateDebut', 'ASC')
->getQuery()
->getResult();
$output = [];
foreach ($data as $date) {
if ($date->getFreePlacesNumber() > 0) {
$output[] = $date;
}
}
$builder->add('sejourSession', EntityType::class, [
'class' => SejourSession::class,
'choice_label' => function ($el) {
$label = 'Du ' . $el->getDateDebut()->format('d/m/Y') . ' au ' . $el->getDateFin()->format('d/m/Y') . ' : ' . $el->getPrix() . ' € ';
return $label;
},
'choice_attr' => function($choice, $key, $value) {
return ['freePlace' => $choice->getFreePlacesNumber()];
},
'choices' => $output,
'required' => true,
'expanded' => true,
'multiple' => false
])
->add('submit', SubmitType::class, [
'attr' => ['class' => 'button bounce item-sejour__button']
]);
$formModifier = function (FormInterface $form, SejourSession $sejourSession = null) {
$form->add('majorationTransportAller', EntityType::class, [
'class' => MajorationTransport::class,
'attr' => ['class' => 'form-control'],
'choice_label' => function ($el)use ($sejourSession) {
$out = "";
foreach ($el->getSejourSessionMajorationTransports() as $key => $ssmt) {
if($ssmt->getSejourSession() == $sejourSession){
$out = $ssmt->getIsActive() == 1 ? $el->getPrice() . " €":"Complet";
break;
}
}
return $el->getVille() . " : " . $out;
},
'query_builder' => function (EntityRepository $er) use ($sejourSession) {
return $er->createQueryBuilder('mt')
->join('mt.sejourSessionMajorationTransports', 'ssmt')
->andWhere('ssmt.sejourSession = :session')
->andWhere('mt.isActive = :true')
->andWhere('ssmt.direction = :aller')
->orderBy('mt.ville', 'ASC')
->setParameter('true', true)
->setParameter('aller', 'aller')
->setParameter('session', $sejourSession);
},
'label' => 'Majoration transport Aller',
'required' => true,
'placeholder' => $sejourSession != null ? 'sur Place (' . $sejourSession->getSejour()->getLocation()->getCity() . ') : 0 €' : 'sur Place'
])
->add('majorationTransportRetour', EntityType::class, [
'class' => MajorationTransport::class,
'attr' => ['class' => 'form-control'],
'choice_label' => function ($el) use ($sejourSession) {
$out = "";
foreach ($el->getSejourSessionMajorationTransports() as $key => $ssmt) {
if($ssmt->getSejourSession() == $sejourSession){
$out = $ssmt->getIsActive() == 1 ? $el->getPrice() . " €":"Complet";
break;
}
}
return $el->getVille() . " : " . $out;
},
'query_builder' => function (EntityRepository $er) use ($sejourSession) {
$response = $er->createQueryBuilder('mt')
->join('mt.sejourSessionMajorationTransports', 'ssmt')
->andWhere('ssmt.sejourSession = :session')
->andWhere('ssmt.isActive = :true')
->andWhere('ssmt.direction = :aller')
->andWhere('mt.isActive = :true')
->orderBy('mt.ville', 'ASC')
->setParameter('true', true)
->setParameter('aller', 'retour')
->setParameter('session', $sejourSession);
return $response;
},
'label' => 'Majoration transport Retour',
'required' => true,
'placeholder' => $sejourSession != null ? 'sur Place (' . $sejourSession->getSejour()->getLocation()->getCity() . ') : 0 €' : 'sur Place'
]);
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
// this would be your entity, i.e. SportMeetup
$data = $event->getData();
$formModifier($event->getForm(), $data->getSejourSession());
}
);
$builder->get('sejourSession')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier) {
// It's important here to fetch $event->getForm()->getData(), as
// $event->getData() will get you the client data (that is, the ID)
$sejourSession = $event->getForm()->getData();
// since we've added the listener to the child, we'll have to pass on
// the parent to the callback function!
$formModifier($event->getForm()->getParent(), $sejourSession);
}
);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Inscription::class,
'sejour' => null
]);
}
}