<?php
namespace App\EventSubscriber\Form;
use App\Entity\User;
use Doctrine\ORM\EntityRepository;
use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\EntityFilterType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
class AddUtilisateurFieldByReseauCdeSubscriber implements EventSubscriberInterface
{
/**
* @param $userConnect
*/
public function __construct($userConnect)
{
$this->userConnect = $userConnect;
}
public static function getSubscribedEvents(): array
{
return [
FormEvents::PRE_SET_DATA => 'preSetData',
FormEvents::PRE_SUBMIT => 'preSubmit',
];
}
public function preSetData(FormEvent $event)
{
$form = $event->getForm();
$reseau = $form->get('reseau')->getData();
$this->addField($form, $reseau);
}
public function preSubmit(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (array_key_exists("reseau", $data)) {
$reseau = $data["reseau"];
$this->addField($form, $reseau);
}
}
private function addField(
$form,
$reseau
)
{
$userConnect = $this->userConnect;
$form->add('utilisateur', EntityFilterType::class,
[
'class' => User::class,
'choice_label' => function (
User $user
) {
return sprintf("%s %s", $user->getName(), $user->getFirstname());
},
'query_builder' => function (
EntityRepository $er
) use
(
$userConnect,
$reseau
) {
$er = $er->createQueryBuilder('u')
->andWhere('u.reseau = :reseau')
->setParameter('reseau', $reseau)
->orderBy("u.name", 'ASC')
->addOrderBy("u.firstname", 'ASC');
if ($userConnect->getProfil()->getValidationFinale()) {
return $er;
}
if ($userConnect->getProfil()->getValidation()) {
$er->andWhere('u.valideur = :valideur')
->setParameter('valideur', $userConnect);
}
return $er;
},
]
);
}
}