<?php
namespace App\Form;
use App\Entity\Pays;
use App\Entity\User;
use App\Entity\Ville;
use App\Entity\Quartier;
use GeoIp2\Database\Reader;
use App\Services\CountryCode;
use App\Repository\VilleRepository;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use GeoIp2\Exception\AddressNotFoundException;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\CountryType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
class GrossisteType extends AbstractType
{
private $countryCode;
private $appKernel;
private $ip;
private $em;
public function __construct(EntityManagerInterface $em, CountryCode $countryCode, KernelInterface $appKernel, RequestStack $requestStack){
$this->countryCode = $countryCode;
$this->appKernel = $appKernel;
$this->ip = $requestStack->getCurrentRequest()->getClientIp();
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$GeoLiteDatabasePath = $this->appKernel->getProjectDir() . '/src/db/GeoLite2-City.mmdb';
$reader = new Reader($GeoLiteDatabasePath);
try {
$record = $reader->city($this->ip);
} catch (AddressNotFoundException $ex) {
$record = $reader->city('154.126.115.219');
}
$builder
->add('designation', TextType::class, [
'label' => false,
'required' => true,
'attr' => [
'class' =>'form-control form-sm'
],
'constraints' => array(
new NotBlank(array(
'message' => 'Formulaire obligtoire',
)),
)
])
->add('address', TextType::class, [
'label' => false,
'required' => true,
'attr' => [
'class' =>'form-control form-sm'
],
'constraints' => array(
new NotBlank(array(
'message' => 'Formulaire obligtoire',
)),
)
])
/*->add('pays', CountryType::class, [
'label' => false,
//'disabled' => true,
'preferred_choices' => [$record->country->isoCode],//[$this->countryCode->getCode()],//['MG'],
'required' => true,
'attr' => [
'class' =>'form-control form-sm'
],
'constraints' => array(
new NotBlank(array(
'message' => 'Formulaire obligtoire',
)),
)
])->add('ville', EntityType::class, [
'label' => false,
'class' => Ville::class,
'choice_label' => 'name',
'multiple' => false,
'required' => true,
'attr' => [
'class' =>'form-control form-sm'
],
'constraints' => array(
new NotBlank(array(
'message' => 'Formulaire obligtoire',
)),
),
'query_builder' => function(VilleRepository $ville_repo) {
return $ville_repo->getListVille();
}
])
->add('quartier')*/
->add('payslocalisation', EntityType::class, [
'label' => false,
'class' => Pays::class,
'preferred_choices' => [$record->country->isoCode],//['MG'],//[$this->countryCode->getCode()],
'choice_label' => 'name',
//'data' => $pay,
'required' => true,
'attr' => [
'class' =>'form-control form-sm'
],
'constraints' => array(
new NotBlank(array(
'message' => 'Formulaire obligtoire',
)),
),
/*'query_builder' => function (PaysRepository $prepo) {
return $prepo->createQueryBuilder('p')->orderBy('p.name', 'ASC');
}*/
])
->add('email', EmailType::class, [
'label' => false,
'required' => true,
'attr' => [
'class' =>'form-control form-sm'
],
'constraints' => array(
new NotBlank(array(
'message' => 'Formulaire obligtoire',
)),
)
])
->add('password', PasswordType::class, [
'label' => false,
'required' => true,
'attr' => [
'class' =>'form-control form-sm'
],
'constraints' => array(
new NotBlank(array(
'message' => 'Formulaire obligtoire',
)),
)
])
->add('confirm_password', PasswordType::class, [
'label' => false,
'required' => true,
'attr' => [
'class' =>'form-control form-sm'
],
'constraints' => array(
new NotBlank(array(
'message' => 'Formulaire obligtoire',
)),
)
])
->add('phone', TextType::class, [
'label' => false,
'required' => true,
'attr' => [
'class' =>'form-control form-sm telephone'
],
'constraints' => array(
new NotBlank(array(
'message' => 'Formulaire obligtoire',
)),
)
])
/* ->add('phonetwo', TextType::class, [
'label' => false,
'required' => false,
'attr' => [
'class' =>'form-control form-sm'
]
])
->add('phonethree', TextType::class, [
'label' => false,
'required' => false,
'attr' => [
'class' =>'form-control form-sm'
]
])*/
/*->add('is_acceptcgv', CheckboxType::class, [
'label' => false,
'required' => true,
'attr' => [
'class' => 'custom-control custom-checkbox',
]
])*/;
$formModifierPays = function (FormInterface $form, Pays $pays = null) {
$villes = null === $pays ? array() : $pays->getVilles();
$form->add('ville', EntityType::class, array(
'class' => Ville::class,
'label' => false,
'placeholder' => 'Selectionner un ville',
'choices' => $villes,
'choice_label'=> 'name',
'multiple' => false,
));
};
$formModifierVille = function (FormInterface $form, Ville $ville = null) {
$quartiers = null === $ville ? array() : $ville->getQuartiers();
$form->add('quartier', EntityType::class, array(
'class' => Quartier::class,
'label' => false,
'placeholder' => 'Selectionner un quartier',
'choices' => $quartiers,
'choice_label'=> 'name',
'multiple' => false,
));
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifierPays, $formModifierVille) {
$data = $event->getData();
$pays = null;
$ville = null;
if ($data instanceof Result){
if (null !== $data->getPays() && null !== $data->getVille()->getId()) {
$pays = $data->getPays();
}
if (null !== $data->getVille() && null !== $data->getVille()->getId()) {
$ville = $data->getVille();
$form;
}
}
$formModifierPays($event->getForm(), $pays);
$formModifierVille($event->getForm(), $ville);
}
);
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) use ($formModifierPays, $formModifierVille) {
$form = $event->getForm();
$data = $event->getData();
if (isset($data['payslocalisation']) && !empty($data['payslocalisation'])){
$repository = $this->em->getRepository(Pays::class);
$pays = $repository->find($data['payslocalisation']);
$formModifierPays($form, $pays);
}
if (isset($data['ville']) && !empty($data['ville'])){
$repository = $this->em->getRepository(Ville::class);
$ville = $repository->find($data['ville']);
$formModifierVille($form, $ville);
}
}
);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}