<?php
namespace App\Form;
use App\Entity\BusinessSubscription;
use App\Entity\City;
use App\Entity\Country;
use App\Repository\CityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Contracts\Translation\TranslatorInterface;
class BusinessSubscriptionType extends AbstractType
{
public function __construct(
private readonly TranslatorInterface $translator,
private readonly CityRepository $cityRepository
){}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name', TextType::class, [
'label' => $this->translator->trans('Pages.SignUp.Fields.Society', [], 'messages_front')
])
->add('email', EmailType::class, [
'label' => $this->translator->trans('Pages.SignUp.Fields.Email', [], 'messages_front'),
])
->add('country', EntityType::class, [
'mapped' => false,
'class' => Country::class,
'placeholder' => $this->translator->trans('Entities.Country.Label'),
'label' => $this->translator->trans('Entities.Country.Label'),
'data' => $options['data']->getCity() ? $options['data']->getCity()->getCountry() : null,
])
->add('city', EntityType::class, [
'class' => City::class,
'label' => $this->translator->trans('Pages.SignUp.Fields.City', [], 'messages_front'),
'choices' => $options['data']->getCity() != null ? $this->cityRepository->findBy(['country' => $options['data']->getCity()->getCountry()]) : [],
])
->add('phone', TelType::class, [
'label' => $this->translator->trans('Pages.SignUp.Fields.Phone', [], 'messages_front')
])
->add('address', TextareaType::class, [
'label' => $this->translator->trans('Pages.SignUp.Fields.Address', [], 'messages_front'),
'empty_data' => ""
]);
$builder->get('country')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) {
$form = $event->getForm();
$country = $form->getData();
$cities = $country === null ? [] : $this->cityRepository->findBy(['country' => $country]);
$form->getParent()->add('city', EntityType::class, [
'class' => City::class,
'choices' => $cities,
]);
}
);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => BusinessSubscription::class,
]);
}
}