<?php
namespace App\EventSubscriber\Form;
use App\Entity\Profil;
use App\Entity\Reseau;
use App\Entity\Secteur;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\EntityFilterType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Validator\Constraints\NotNull;
class AddSecteurUtilisateurTypeSubscriber implements EventSubscriberInterface
{
/**
* @var EntityManagerInterface
*/
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents(): array
{
return [
FormEvents::PRE_SET_DATA => 'preSetData',
FormEvents::PRE_SUBMIT => 'preSubmit',
];
}
public function preSetData(FormEvent $event): void
{
$form = $event->getForm();
$requestMethod = $event->getForm()->getConfig()->getMethod();
if($requestMethod === "POST"){
$profil = $form->get('profil')->getData();
$reseau = $form->get('reseau')->getData();
}
if($requestMethod === "PUT"){
$user = $event->getData();
/** @var User $user */
$profil = $user->getProfil();
$reseau = $user->getReseau();
}
$this->addField($form, $profil, $reseau);
}
public function preSubmit(FormEvent $event): void
{
$data = $event->getData();
$form = $event->getForm();
/** @var User $user */
if (isset($data["profil"])) {
$profilId = $data["profil"];
$profil = $this->entityManager->getRepository(Profil::class)->findOneBy(["id" => $profilId]);
$reseauID = $data["reseau"];
$reseau = $this->entityManager->getRepository(Reseau::class)->findOneBy(["id" => $reseauID]);
if($profil){
$this->addField($form, $profil, $reseau);
}
}
}
private function addField(
$form,
$profil,
$reseau
)
{
if($profil && $profil->isVM() && !($reseau->isDomTom() || $reseau->getLibelle() === Reseau::SIEGE)){
$form->add('secteur', EntityFilterType::class,
[
'class' => Secteur::class,
'choice_label' => 'libelle',
'required' => true,
'attr' => array(
'label' => 'Secteur',
),
'group_by' => "region.libelle",
'constraints' => [
new NotNull([
'message' => 'Le secteur est obligatoire pour les VM/APM'
])
],
]
);
}else{
$form->add('secteur', ChoiceType::class,
[
'choice_label' => 'libelle',
'attr' => array(
'label' => 'Secteur',
),
'choices' => null, // Choix par défaut à null
'data' => null, // Données par défaut à null
]
);
}
}
}