<?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\Entity\Typepaiement;
use App\Services\CountryCode;
use App\Repository\PaysRepository;
use App\Repository\UserRepository;
use App\Repository\VilleRepository;
use Symfony\Component\Form\FormEvent;
use App\Repository\QuartierRepository;
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\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
class PharmacieType extends AbstractType
{
private $repos;
private $countryCode;
private $appKernel;
private $ip;
private $villeRepo;
private $paysRepo;
private $quartierRepo;
private $em;
private $request;
public function __construct(EntityManagerInterface $em, UserRepository $repos, VilleRepository $villeRepo, PaysRepository $paysRepo, QuartierRepository $quartierRepo, CountryCode $countryCode, KernelInterface $appKernel, RequestStack $requestStack)
{
$this->repos = $repos;
$this->countryCode = $countryCode;
$this->appKernel = $appKernel;
$this->ip = $requestStack->getCurrentRequest()->getClientIp();
$this->villeRepo = $villeRepo;
$this->paysRepo = $paysRepo;
$this->quartierRepo = $quartierRepo;
$this->em = $em;
$this->request = $requestStack->getCurrentRequest();
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$location_lang = $this->request->getLocale();
$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');
}
//dd($options);
$designation = '["ROLE_GROSSISTE"]';
$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],//['MG'],//[$this->countryCode->getCode()],
'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('ville')
/*->add('quartier', null, [
'label' => false
])*/
/** */
->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('grossiste', EntityType::class, [
'class' => User::class,
'label' => false,
'choice_label' => 'designation',
'required' => true,
//'expanded' => true,
'query_builder' => function (UserRepository $er) use ($designation) {
return $er->findUserGrossist($designation);
},
])
->add('typepaiements', EntityType::class, [
'class' => Typepaiement::class,
'label' => false,
'choice_label' => $location_lang == 'fr' ? 'nom' : 'name_en',
'multiple' => true,
'attr' =>[
'class' => 'select2'
],
'mapped' => false
])
/*->add('is_acceptcgv', CheckboxType::class, [
'label' => false,
'required' => true,
'attr' => [
'class' => 'custom-control custom-checkbox',
],
'constraints' => array(
new NotBlank(array(
'message' => 'Formulaire obligtoire',
)),
),
])*/->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');
}*/
]);
;
$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,
]);
}
public function getGrossistes()
{
// return $choices[0]->getDesignation();
// = Property::HEAT;
$choices = $this->repos->findUserGrossist();
$output = [];
foreach ($choices as $key => $value) {
$output[$value] = $value->getDesignation();
}
return $output;
/*$output = '';
foreach($choices as $val){
$output = $val->getDesignation();
}
return $output;*/
}
}